本文主要是介绍【《Unity Shader入门精要》 提炼总结】(十四)第十四章·开启深度写入的半透明效果ShaderLab的混合命令双面渲染的透明效果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文由@唐三十胖子出品,转载请注明出处。
文章链接:https://blog.csdn.net/iceSony/article/details/84673829
这篇文章将总结和提炼《Unity Shader入门精要》的第八章“透明效果”的内容。
通过这篇文章,你可以知道
1)开启深度写入的半透明效果
2)ShaderLab的混合命令
3)双面渲染的透明效果
一.开启深度写入的半透明效果
为了解决自身透明效果出错的问题
解决办法:第一个Pass开启深度写入但不输出颜色,仅将深度值写入深度缓冲区;第二个Pass的实现和透明度混合一样。
完整代码如下
Shader "sony/Shader188" {Properties{_Diffuse("漫反射系数",Color) = (1.0,1.0,1.0,1.0)_MainTex("主纹理",2D) = "white"{}_Cutoff("透明度系数",Range(0,1)) = 0.5}SubShader{Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }Pass{ZWrite OffColorMask 0}Pass{Tags{ "LightMode" = "ForwardBase" }ZWrite OffBlend SrcAlpha OneMinusSrcAlphaCGPROGRAM#include "lighting.cginc"#pragma vertex vert#pragma fragment fragfloat4 _Diffuse;sampler2D _MainTex;float4 _MainTex_ST;fixed _Cutoff;struct a2v{float4 pos : POSITION;float3 normal : NORMAL;float4 texcoord:TEXCOORD0;};struct v2f{float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;float2 uv:TEXCOORD1;};v2f vert(a2v v){v2f o;o.pos = UnityObjectToClipPos(v.pos);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);return o;}fixed4 frag(v2f i) : SV_Target{float3 worldNormal = i.worldNormal;float3 worldLightDir = UnityWorldSpaceLightDir(worldNormal);fixed4 texColor = tex2D(_MainTex, i.uv);float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;float3 diffuse = _LightColor0.rgb * _Diffuse.rgb * texColor*max(0, dot(worldNormal, worldLightDir));return fixed4(ambient + diffuse,texColor.a * _Cutoff);}ENDCG}}Fallback "Transparent/Cutout/VertexLit" }
新的Pass为的是剔除自身遮挡的片元,但不写入任何颜色通道
二.ShaderLab的混合命令
源颜色:片元着色器产生的颜色
目标颜色:颜色缓冲区的颜色
此时用到的都是包含RGBA四个通道的颜色
事实上在Unity中我们使用到Blend命令(Blend Off除外)
都会开启混合,但是在其他的API中我们要手动开启
例如在OpenGL,我们需要用glEnable开启混合
混合等式与参数
逐片元操作中包含模板测试->深度测试->混合->写入颜色缓冲区
这里的混合操作仅可高度配置。用到的命令如下
常用的写法
混合因子表
常见的混合配置&实现的效果
三.双面渲染的透明效果
这样就可以了上图左的效果
当然了你也可以通过Cull Front清除朝向摄像机的面
下一章我们要介绍更复杂的光照Shader&光照衰减&光照阴影
感谢阅读,下章见:)
这篇关于【《Unity Shader入门精要》 提炼总结】(十四)第十四章·开启深度写入的半透明效果ShaderLab的混合命令双面渲染的透明效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!