双面shader
程序员文章站
2022-06-10 21:13:25
...
默认情况下渲染引擎提出了背面(相对于摄像机的方向)的渲染图元,这样导致即使我们开启了透明(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
上一篇: OSG曲线实现代码,cv开发(网上爬的不知道有没有用)
下一篇: windows下安装redis