半透明物体与深度写入

单独一个自交叉的半透明物体提前深度写入

因为无法控制一个物体每个片元的渲染顺序,所以对于自交叉的半透明物体,

如果只用1个Pass,关闭深度写入,因为渲染顺序不固定,有可能先渲染前面片元,后渲染后面片元,前面片元混合后面片元的效果变成了后面片元混合前面片元的效果。

如果只用1个Pass,开启深度写入,因为渲染顺序不固定,有的地方先渲染前面片元,导致后面片元无法通过深度测试而不渲染,有的先渲染后面片元,就有正确的半透明效果,整体效果不统一。

所以使用两个Pass,第1个Pass只进行深度写入,第2个Pass根据深度值写入颜色值,此效果无法显示物体内部的透明度混合,适用于整体的淡入淡出。

 

多个半透明物体渲染关闭深度写入

当半透明物体之间不存在相互遮挡的情况,并且按照距离摄像机从远到近的顺序进行渲染,开启或关闭深度写入,渲染结果都是正确的。

当半透明物体之间存在相互遮挡的情况,开启或关闭深度写入都会造成显示错误,以下比较开启或关闭深度写入的区别:

开启深度写入,如下图,CubeA有一部分在CubeB后面,CubeB先渲染,CubeA后渲染,CubeA在CubeB后面的那一部分无法通过深度测试,因而不渲染。

关闭深度写入,如下图,CubeA有一部分在CubeB后面,CubeB先渲染,CubeA后渲染,CubeA在CubeB后面的那一部分, 应该是CubeB混合CubeA的效果,变成CubeA混合CubeB的效果。

 

比较之下,开启深度写入错误更明显,所以关闭深度写入,如果要完全正

在Unity中,半透明物体(transparent objects)通常不会写入模板缓冲(stencil buffer),这是由于Unity的渲染管线默认对透明物体的处理方式。模板缓冲主要用于不透明物体,以便进行遮挡测试和标记特定区域。对于透明物体,Unity通常会禁用模板写入,以避免因混合(blending)操作导致的不可预测结果[^1]。 在Unity的Shader中,可以通过`Stencil`块来控制模板缓冲的行为。默认情况下,透明物体的Shader不会启用模板写入,因为透明物体通常使用混合模式(如`Blend SrcAlpha OneMinusSrcAlpha`),而混合操作可能会影响模板缓冲的正确性。如果确实需要让透明物体写入模板缓冲,可以在Shader中显式启用,并确保使用合适的混合模式和深度测试设置[^1]。 以下是一个简单的Shader示例,展示如何为透明物体启用模板写入: ```c Shader "Custom/TransparentStencilWrite" { Properties { _MainTex ("Texture", 2D) = "white" {} _Color ("Color", Color) = (1,1,1,0.5) } SubShader { Tags { "Queue"="Transparent" "RenderType"="Transparent" } LOD 200 // 启用模板缓冲写入 Stencil { Ref 1 Comp Always Pass Replace } Pass { Blend SrcAlpha OneMinusSrcAlpha ZWrite Off Cull Back CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata_t { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _Color; v2f vert (appdata_t v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv) * _Color; return col; } ENDCG } } } ``` 在上述Shader中,通过`Stencil`块设置模板缓冲的行为,`Ref 1`定义了模板参考值,`Comp Always`表示总是通过模板测试,`Pass Replace`表示在模板测试通过时替换模板缓冲中的值。此外,`ZWrite Off`确保透明物体不会写入深度缓冲,以避免影响后续的深度测试[^1]。 需要注意的是,透明物体写入模板缓冲可能会导致一些渲染问题,例如模板缓冲的值被多次修改,从而影响其他物体的渲染效果。因此,在实际使用中应谨慎处理,并根据具体需求调整Shader的设置[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值