Unity3D Shader双面渲染的透明效果
发表于2018-09-07
默认情况下渲染引擎提出了背面(相对于摄像机的方向)的渲染图元,这样导致即使我们开启了透明(AlphaTest或者Alpha Blend)也无法看到背面的透明效果。
若想要得到双面渲染效果,可以使用Cull指令来控制需要剔除的那个面。
Cull Back | Front | Off
若设置成Back,那么背对摄像机的面就不会被渲染。
若设置成Front,那么朝向摄像机的面就不会被渲染。
若设置成Off,就会关闭剔除功能,但是需要渲染的图元数目会成倍的增加。
透明度测试的双面渲染
可以直接关闭剔除效果来达到双面渲染的目的:
Pass { // 定义该Pass在Unity中的光照流水线中的角色 Tags { "LightMode"="ForwardBase" } // 可以使用Cull指令来控制需要剔除n哪个面的渲染图元 // Cull Back | Front | Off // 若设置成Back,那么背对摄像机的面就不会被渲染 // 若设置成Front,那么朝向摄像机的面就不会被渲染 // 若设置成Off,就会关闭剔除功能,但是需要渲染的图元数目会成倍的增加 Cull Off }
透明度混合的双面渲染
透明度混合需要关闭深度写入,而深入写入被关闭则是“一切混乱的开端”。可以通过两个Pass来解决,一个剔除前面,一个剔除背面,两者结合来达到保证正确深度渲染的关系(Unity会保证顺序执行SubShader中的各个Pass)。
Shader "Unity Shaders Book/Chapter 8/Alpha Blend Both Sided" { Properties { _Color ("Main Tint", Color) = (1,1,1,1) _MainTex ("Main Tex", 2D) = "white" {} // 用于在透明纹理的基础上控制整体的透明度 _AlphaScale ("Alpha Scale", Range(0,1 )) = 1 } SubShader { // RenderType标签可以让Unity // 把这个Shader归入到提前定义的组(Transparent) // 用于指明该Shader是一个使用了透明度混合的Shader // IgnoreProjector=True这意味着该Shader // 不会受到投影器(Projectors)的影响 // 为了使用透明度混合的Shader一般都应该在SubShader // 中设置这三个标签 Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} Pass { // 向前渲染路径的方式 Tags {"LightMode"="ForwardBase"} Cull Front // 深度写入设置为关闭状态 ZWrite Off // 这是混合模式 Blend SrcAlpha OneMinusSrcAlpha .... } Pass { // 向前渲染路径的方式 Tags {"LightMode"="ForwardBase"} Cull Back // 深度写入设置为关闭状态 ZWrite Off // 这是混合模式 Blend SrcAlpha OneMinusSrcAlpha .... } } FallBack "Transparent/VertexLit" }
来自:https://blog.csdn.net/biezhihua/article/details/79141356