【《Unity Shader入门精要》 提炼总结】(十四)第十四章·开启深度写入的半透明效果&ShaderLab的混合命令&双面渲染的透明效果

时间:2024-04-08 15:42:22

 

 

 

本文由@唐三十胖子出品,转载请注明出处。  
文章链接:https://blog.csdn.net/iceSony/article/details/84673829

 

 

 

这篇文章将总结和提炼《Unity Shader入门精要》的第八章“透明效果”的内容。

【《Unity Shader入门精要》 提炼总结】(十四)第十四章·开启深度写入的半透明效果&ShaderLab的混合命令&双面渲染的透明效果

通过这篇文章,你可以知道

1)开启深度写入的半透明效果

2)ShaderLab的混合命令

3)双面渲染的透明效果

一.开启深度写入的半透明效果

为了解决自身透明效果出错的问题

解决办法:第一个Pass开启深度写入但不输出颜色,仅将深度值写入深度缓冲区;第二个Pass的实现和透明度混合一样。

【《Unity Shader入门精要》 提炼总结】(十四)第十四章·开启深度写入的半透明效果&ShaderLab的混合命令&双面渲染的透明效果

完整代码如下

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 Off
		ColorMask 0
	}
		Pass
	{
		Tags{ "LightMode" = "ForwardBase" }
		ZWrite Off
		Blend SrcAlpha OneMinusSrcAlpha
		CGPROGRAM
                #include "lighting.cginc"
                #pragma vertex vert
                #pragma fragment frag
		float4 _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开启混合

 

混合等式与参数

逐片元操作中包含模板测试->深度测试->混合->写入颜色缓冲区

这里的混合操作仅可高度配置。用到的命令如下

常用的写法

【《Unity Shader入门精要》 提炼总结】(十四)第十四章·开启深度写入的半透明效果&ShaderLab的混合命令&双面渲染的透明效果

混合因子表

【《Unity Shader入门精要》 提炼总结】(十四)第十四章·开启深度写入的半透明效果&ShaderLab的混合命令&双面渲染的透明效果

常见的混合配置&实现的效果

【《Unity Shader入门精要》 提炼总结】(十四)第十四章·开启深度写入的半透明效果&ShaderLab的混合命令&双面渲染的透明效果

【《Unity Shader入门精要》 提炼总结】(十四)第十四章·开启深度写入的半透明效果&ShaderLab的混合命令&双面渲染的透明效果

三.双面渲染的透明效果

【《Unity Shader入门精要》 提炼总结】(十四)第十四章·开启深度写入的半透明效果&ShaderLab的混合命令&双面渲染的透明效果

【《Unity Shader入门精要》 提炼总结】(十四)第十四章·开启深度写入的半透明效果&ShaderLab的混合命令&双面渲染的透明效果

这样就可以了上图左的效果

当然了你也可以通过Cull Front清除朝向摄像机的面

【《Unity Shader入门精要》 提炼总结】(十四)第十四章·开启深度写入的半透明效果&ShaderLab的混合命令&双面渲染的透明效果

 

 

下一章我们要介绍更复杂的光照Shader&光照衰减&光照阴影

感谢阅读,下章见:)