博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[UnityShader基础]03.透明度混合
阅读量:4608 次
发布时间:2019-06-09

本文共 2258 字,大约阅读时间需要 7 分钟。

如果要渲染半透明物体,那么就需要用到透明度混合。

 

需要注意的有这几点:

1.设置标签:Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}

将物体放在合适的渲染队列中

2.关闭深度写入:ZWrite Off

具体原因见下面

3.Blend混合命令:Blend SrcAlpha OneMinusSrcAlpha

意思是:最终颜色 = 源颜色(该像素颜色) * SrcAlpha + 目标颜色(颜色缓冲中的颜色) * (1 - SrcAlpha)

 

AlphaBlend.shader

1 Shader "Custom/AlphaBlend" 2 { 3     Properties 4     { 5         _MainTex ("Texture", 2D) = "white" {} 6         _AlphaScale ("Alpha Scale", Range(0, 1)) = 1 7     } 8     SubShader 9     {10         Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}11         12         Pass13         {14             ZWrite Off15             Blend SrcAlpha OneMinusSrcAlpha16 17             CGPROGRAM18             #pragma vertex vert19             #pragma fragment frag20             21             #include "UnityCG.cginc"22 23             struct appdata24             {25                 float4 vertex : POSITION;26                 float2 uv : TEXCOORD0;27             };28 29             struct v2f30             {31                 float2 uv : TEXCOORD0;32                 float4 vertex : SV_POSITION;33             };34 35             sampler2D _MainTex;36             float4 _MainTex_ST;37             fixed _AlphaScale;            38 39             v2f vert (appdata v)40             {41                 v2f o;42                 o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);43                 o.uv = TRANSFORM_TEX(v.uv, _MainTex);44                 return o;45             }46             47             fixed4 frag (v2f i) : SV_Target48             {49                 fixed4 col = tex2D(_MainTex, i.uv);50                 col.a = col.a * _AlphaScale;51                 return col;52             }53             ENDCG54         }55     }56 }

 

效果如下:

 

那么,回到问题,为什么进行透明度混合时要关闭深度写入呢?

可以做些测试:

1.在上图的基础上,白色物体开启深度写入,会发现没任何变化。因为红色物体先渲染,白色物体后渲染,即使开启深度写入,由于后面没有其他物体要渲染了,也就不会影响后面的深度测试

2.在白色物体和红色物体之间放一个灰色物体,其shader复制上面的,然后修改渲染队列为"Transparent+1",白色物体关闭深度写入。可以看到,效果还是正常的

3.白色物体开启深度写入,如下图,这时效果就不对了。渲染顺序为:红色->白色->灰色,当渲染灰色物体时,不能通过深度测试,导致重叠的那部分像素被舍弃掉

 

因此,进行透明度混合时要关闭深度写入,从而让比半透明物体还要后渲染的物体能正确地显示出来。不过因为关闭深度写入,会破坏深度缓冲的工作机制,在某些十分特殊的情况(如自身重叠交叉的半透明物体)下会出现遮挡错误的问题

posted on
2019-03-16 23:22  阅读(
...) 评论(
...) 收藏

转载于:https://www.cnblogs.com/lyh916/p/10544944.html

你可能感兴趣的文章
树状数组
查看>>
JDBC Update操作返回值和Insert操作返回主键
查看>>
css书写规范
查看>>
Android LBS系列03 Geocoder类与地址显示
查看>>
Maven 打包
查看>>
智能视频监控软件
查看>>
AlloyRenderingEngine文本框组件
查看>>
DataTable转换为Json格式
查看>>
洛谷P3773 CTSC2017 吉夫特
查看>>
Leetcode661.Image Smoother图片平滑器
查看>>
hql 链接查询
查看>>
java获取指定文件夹下的所有文件名
查看>>
Spring学习十一
查看>>
iOS -- 全局导航栏返回键
查看>>
android 拖拽listview
查看>>
request
查看>>
Python登录人人网并抓取新鲜事
查看>>
RNN教程之-2 LSTM实战
查看>>
计算两个时间之间相隔几个月
查看>>
Windows安装php Oracle扩展
查看>>