IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity 透明效果 -> 正文阅读

[游戏开发]Unity 透明效果

Unity 中实现透明效果一般有两种方法

透明度测试(Alpha Test)

原理:只要片元的透明度不符合要求就直接舍弃

不关闭深度写入(ZWrite)

Shader "AlphaTest"{
    Properties{
        _MainTex ("Main Tex", 2D) = "white" {}
        _Color ("Color", Color) = (1, 1, 1, 1)
        _Cutoff ("Alpha Cutoff", Range(0, 1)) = 0.5 //控制剔除的阈值
    }
    SubShader
    {
        Tags { "Queue"="AlphaTest" "IgnoreProjection"="True" "RanderType"="TransparentCutout"}

        Pass{
            Tags { "LightMode"="ForwardBase" } 
            
            Cull Off	//用于双面渲染,不剔除背对摄像机的图元
            
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            #include "Lighting.cginc"

            struct appdata{
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float3 normal : NORMAL;
            };

            struct v2f{
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
                float3 worldPos : TEXCOORD1;
                float3 worldNormal : TEXCOORD2;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed _Cutoff;
            fixed4 _Color;

            v2f vert (appdata v){
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target{
                float3 worldNormal = normalize(i.worldNormal);
                float3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));

                float4 texColor = tex2D(_MainTex, i.uv);
                clip(texColor.a - _Cutoff);
                //Equal to
                //if( (texColor.a - _Cutoff) < 0.0 ){
                //  discard;    
                //}
                float3 albedo = texColor.rgb * _Color.rgb;

                float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;

                float3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));

                return fixed4(ambient + diffuse, 1.0);
            }
            ENDCG
        }
    }
    FallBack "Transparent/Cutout/VertexLit"
}

透明度测试可以用于消解动画效果的实现

在这里插入图片描述

在这里插入图片描述

透明度混合(Alpha Blending)

原理:当前片元的透明度作为混合参数与颜色缓冲中的颜色值混合

关闭深度写入,但不关闭深度测试


关闭深度写入将导致渲染顺序变得非常重要

一般做法:

  1. 先渲染所有不透明物体,同时开启深度写入和深度测试
  2. 半透明物体按距离远近排序,然后从后往前渲染,开启深度测试,关闭深度写入

由于排序是对于物体来说的,当物体间循环重叠时就需要用分割物体、分割网格的方法来解决

  • 尽可能让模型是凸面体
  • 让透明通道更柔和,难以分辨
  • 使用开启深度写入的半透明效果近似物体半透明

对于双面渲染的透明度混合,由于关闭了深度写入,在渲染时需要控制渲染顺序

SubShader {
	Tags {"Queue"="Transparent" "IgnoreProjection"="True" "RanderType"="Transparent"}
	
	ZWrite Off
    Blend SrcAlpha OneMinusSrcAlpha //开启混合模式,设定混合因子
    
	Pass {
		...
		Cull Front	//剔除正面,渲染背面
		...
	}
	Pass {
		...
		Cull Back	//提出背面,渲染正面
		...
	}
}

在这里插入图片描述

半透明物体的阴影没了,暂时不知道原因

深度写入的半透明效果

使用两个 Pass

  • 第一个开启深度写入但不输出颜色
  • 第二个进行透明度混合

由于深度信息是对像素来说的,所以如果单个模型本身存在自我遮挡,那么被遮挡部分就直接舍弃了

ColorMask RGB | A | 0 | ...表示当前 Pass 写入的颜色通道

Unity预定义渲染队列

SubShaderQueue标签定义:Tags { "Queue"="AlphaTest" }

名称索引号描述
Background1000最先开始渲染的队列,一般用于绘制于背景上的物体
Geometry2000默认队列,不透明物体
AlphaTest2450透明度测试,在不透明物体之后渲染可以更高效
Transparent3000透明度混合,从后往前的顺序进行渲染
Overlay4000用于最后渲染的物体,实现一些叠加效果

索引号越小越早被渲染

混合

混合不可编程但高度可配置

混合源颜色(当前片元)和目标颜色(颜色缓冲)

  • Blend SrcFactor DstFactor: 只混合rgb通道
  • Blend SrcFactor DstFactor,SrcFactorA DstFactorA: 上面的基础上,再混合 a 通道

例子:

Blend SrcAlpha OneMinusSrcAlpha:开启混合,并且混合结果是 S r c . a ? S r c . r g b + ( 1 ? S r c . a ) ? D e s . r g b Src.a * Src.rgb + (1-Src.a)*Des.rgb Src.a?Src.rgb+(1?Src.a)?Des.rgb


还可以配置混合操作

BlendOp BlendOperation

即改变源颜色和目标颜色最后的混合方式,默认为 Add

操作描述
Add加法
Sub减法
RevSub交换减法
Min取各分量的最小值
Max取各分量的最大值

同时使用上面两种方法可设定混合类型

类型描述
正常Blend SrcAlpha OneMinusSrcAlpha
柔和相加Blend OneMinusDstAlpha One
正片叠底Blend DstColor Zero
两倍相乘Blend DstColor SrcColor
变暗BlendOp Min
Blend One One
变亮BlendOp Max
Blend One One
滤色Blend OneMinusDstColor One
线性减淡Blend One One
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-07-13 17:49:43  更:2021-07-13 17:50:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 16:27:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码