shader篇-透明效果
标签(空格分隔): shader
透明效果实现方法简介
Unity中使用2种方法实现透明效果:一是透明度测试,二是透明度混合。
透明度测试:不需要关闭深度写入,透明度不达标就去掉,所以物体要么不透明要么完全透明。
透明度混合:可以得到真正的半透明效果。原理是将透明度与颜色缓冲的颜色混合得到新的颜色。但是这需要关闭深度写入。只有关闭深度写入才能吧保证半透明物体不影响不透明物体或半透明后面半透明物体的渲染
渲染顺序的重要性
关闭深度写入后就需要注意物体的渲染顺序,因为关闭之前物体的渲染是由深度z-buffer决定,必须渲染半透明物体后的非透明后物体(这里的前后指的是相对虚拟摄像头的距离),再渲染透明物体,否则未关闭的深度测试会直接覆盖透明度混合后的颜色缓冲,导致失去了该有的半透明效果。
可是即便设置好了渲染顺序,有时候依旧会出现问题,比如两根缠绕的绳子,根本难以分清2个物体的前后,无法制定合理的渲染顺序。
要想解决这种问题就需要分割网格。
Unity shader的渲染顺序
为解决渲染顺序,unity提供了渲染队列。Queue标签决定模型使用哪个队列
名称 | 队列索引 | 描述 |
---|---|---|
Background | 1000 | 最早渲染的队列,用于渲染背景 |
Geometry | 2000 | 默认渲染队列,不透明物体使用这个 |
AlphaTest | 2450 | 透明度测试 |
Transparent | 3000 | 使用透明度混合或关闭深度写入的shader |
Overlay | 4000 | 使用一些叠加效果,最后渲染的物体都使用该队列 |
使用实例
如果要使用透明度测试,需要这般加入以下tag
SubShader {
Tags {
"Queue"="AlphaTest"
同理,透明度混合需要这般使用以下tag
SubShader {
Tags {
"Queue"="Transparent"
透明度测试
unity片元着色器会使用clip函数进行透明度测试
void clip(float4 x)
{
if(any(x<0))
discard;
}
配置
配置中tags相当关键,Queue标签之前提过,暂且不提RenderType是用以制定渲染的队列,”IgnoreProjector”=”True”是保证shader不受投影器的影响
Properties {
_Color ("Color Tint", Color) = (1, 1