UnityShader入门精要学习笔记(十一):透明效果-下部分
2017-07-08 18:47
1001 查看
一.混合命令
(1)基本定义
源颜色——Src:片元着色器产生的颜色值
目标颜色——Dst:从颜色缓冲区取到的颜色值
(2)混合因子
![](https://img-blog.csdn.net/20170708183437854?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjYyNzYwOTc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
上面的命令都是RGB通道的混合因子和A通道的混合因子都是一样的,如果希望使用不同的参数来混合Alpha通道,就可以利用:
例:
(3)混合操作
![](https://img-blog.csdn.net/20170708184137545?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjYyNzYwOTc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170708184152423?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjYyNzYwOTc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
二.双面渲染的透明度效果
前面的学习的例子中,我们无法看清正方体内部以及其背面的形状,这是因为默认情况下渲染引擎剔除了物体的背面(相对于摄像机方向)的渲染图元,而仅仅渲染了物体的正面。
使用Cull命令来控制剔除哪个面的渲染图元。
Cull Back | Front | Off
代码实践:
效果图:
![](https://img-blog.csdn.net/20170708191215583?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjYyNzYwOTc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
4000
(1)基本定义
源颜色——Src:片元着色器产生的颜色值
目标颜色——Dst:从颜色缓冲区取到的颜色值
(2)混合因子
上面的命令都是RGB通道的混合因子和A通道的混合因子都是一样的,如果希望使用不同的参数来混合Alpha通道,就可以利用:
Blend SrcFactor DstFactor,SrcFactorA DstFactorA
例:
Blend SrcAlpha OnMinusSrcAlpha,One Zero
(3)混合操作
二.双面渲染的透明度效果
前面的学习的例子中,我们无法看清正方体内部以及其背面的形状,这是因为默认情况下渲染引擎剔除了物体的背面(相对于摄像机方向)的渲染图元,而仅仅渲染了物体的正面。
使用Cull命令来控制剔除哪个面的渲染图元。
Cull Back | Front | Off
代码实践:
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld' Shader "Custom/Edu/AlphaBlendBothSide" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _AlphaScale("AlphaScale",Range(0,1)) = 0.5 } SubShader { Tags{"Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "true"} //进行深度写入之后背面渲染的图元将会被替换掉 // Pass // { // Zwrite On // ColorMask 0 // } //第一个Pass只渲染背面,第二个Pass之渲染正面,注意这个顺序很重要!!!! Pass { Tags{"LightMode" = "ForwardBase"} ZWrite Off Cull Front Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "Lighting.cginc" fixed4 _Color; sampler2D _MainTex; float4 _MainTex_ST; float _AlphaScale; struct a2v { float4 vertex:POSITION; float3 normal:NORMAL; float4 texcoord:TEXCOORD0; }; struct v2f { float4 pos:SV_POSITION; float3 worldPos:TEXCOORD0; float3 worldNormal:TEXCOORD1; float2 uv:TEXCOORD2; }; v2f vert(a2v v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP,v.vertex); o.worldNormal = UnityObjectToWorldNormal(v.normal); o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz; o.uv = TRANSFORM_TEX(v.texcoord,_MainTex); return o; } fixed4 frag(v2f i):SV_Target { float3 worldLightDir = normalize( UnityWorldSpaceLightDir(i.worldPos) ); float3 worldNormal = normalize( i.worldNormal ); fixed4 texColor = tex2D(_MainTex,i.uv); fixed3 albedo = texColor.rgb * _Color.rgb; fixed3 diffuse = _LightColor0.rgb * albedo * saturate(dot(worldNormal,worldLightDir)); fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo; return fixed4(ambient + diffuse, texColor.a * _AlphaScale); } ENDCG } Pass { Tags{"LightMode" = "ForwardBase"} ZWrite Off Cull Back Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "Lighting.cginc" fixed4 _Color; sampler2D _MainTex; float4 _MainTex_ST; float _AlphaScale; struct a2v { float4 vertex:POSITION; float3 normal:NORMAL; float4 texcoord:TEXCOORD0; }; struct v2f { float4 pos:SV_POSITION; float3 worldPos:TEXCOORD0; float3 worldNormal:TEXCOORD1; float2 uv:TEXCOORD2; }; v2f vert(a2v v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP,v.vertex); o.worldNormal = UnityObjectToWorldNormal(v.normal); o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz; o.uv = TRANSFORM_TEX(v.texcoord,_MainTex); return o; } fixed4 frag(v2f i):SV_Target { float3 worldLightDir = normalize( UnityWorldSpaceLightDir(i.worldPos) ); float3 worldNormal = normalize( i.worldNormal ); fixed4 texColor = tex2D(_MainTex,i.uv); fixed3 albedo = texColor.rgb * _Color.rgb; fixed3 diffuse = _LightColor0.rgb * albedo * saturate(dot(worldNormal,worldLightDir)); fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo; return fixed4(ambient + diffuse, texColor.a * _AlphaScale); } ENDCG } } //注意原来的FallBack我用的是Diffuse,那样的话会投射阴影 //下面这个FallBack不会自动投射阴影 FallBack "Transparent/VertexLit" }
效果图:
4000
相关文章推荐
- UnityShader入门精要学习笔记(十):透明效果-上部分
- Unity Shader入门精要学习笔记 - 第8章 透明效果
- Unity Shader入门精要学习笔记 - 第8章 透明效果
- Unity Shader入门精要学习笔记 - 第12章 屏幕后处理效果
- Unity Shader入门精要学习笔记 - 第11章 让画面动起来
- UnityShader入门精要学习笔记(十三):光照衰减与Unity阴影
- Unity Shader入门精要学习笔记 - 第5章 开始 Unity Shader 学习之旅
- UnityShader入门精要学习笔记(十九):卷积与边缘检测
- Unity Shader入门精要学习笔记 - 第5章 开始 Unity Shader 学习之旅
- Unity Shader入门精要学习笔记 - 第4章 学习 Shader 所需的数学基础
- Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照
- Unity Shader入门精要学习笔记 - 第4章 学习 Shader 所需的数学基础
- UnityShader入门精要学习笔记(十二):渲染路径与光源类型
- Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照
- Unity Shader入门精要学习笔记 - 第16章 Unity中的渲染优化技术
- Unity Shader入门精要学习笔记 - 第9章 更复杂的光照
- 学习UnityShader入门精要笔记1——渲染流程概述
- 学习UnityShader入门精要笔记3——更复杂的光照
- UnityShader入门精要学习笔记(二十一):深度和法线纹理
- Unity Shader入门精要学习笔记 - 第2章 渲染流水线