(一)UsePass 命令 使用 来自另一个着色器的命名通道。
UsePass "Specular/BASE"
Name "MyPassName"
有两种方式将GrabPass放入一个 subshader 中:
这里有一种反相已被渲染的像素的颜色的昂贵方式:
Shader "GrabPassInvert" { SubShader { // Draw ourselves after all opaque geometry // 在所有不透明几何体之后自画 Tags { "Queue" = "Transparent" } // Grab the screen behind the object into _GrabTexture // 捕获对象后的屏幕到_GrabTexture GrabPass { } // Render the object with the texture generated above, and invert it's colors // 用前面捕获的纹理渲染对象,并反相它的颜色 Pass { SetTexture [_GrabTexture] { combine one-texture } } } }
这个着色器有两个通道:第一个通道捕获在渲染时刻对象背后的所有图像,然后执行第二次通道。当然,在现在,实现同样的效果,使用反相 混合模式将更加廉价。
(三)Tags 子着色器使用标签来告诉渲染引擎期望何时和如何渲染对象。
你能使用 Queue 标签决定对象被渲染的次序。着色器决定它所归属的对象的渲染队列,任何透明渲染器可以通过这个办法确认可以在所有不透明对象渲染后再进行渲染。
有四种预定义的渲染队列,在预定义队列之间还可以定义更多队列
Shader "Transparent Queue Example" { SubShader { Tags {"Queue" = "Transparent" } Pass { // rest of the shader body... } } }
举例说明如何在透明队列中渲染对象。
几何体渲染队列为了达到最优的性能优化了对象的绘制次序。其他渲染队列依据举例排序对象,从最远的对象开始渲染到最近的对象。
对于特殊的需要可以使用中间队列来满足。在Unity实现中每一个队列都被一个整数的索引值所代表。后台为1000,几何体为2000,透明为3000,叠加层为4000. 着色器可以自定义一个队列
Tags { "Queue" = "Geometry+1" }
这会使对象在所有不透明的对象渲染之后但却在所有透明物体前被渲染,该渲染队列的索引值为2001.当你希望某些对象总是在其他某些对象前被绘制的情况下,这种能力对你有用。例如,在大多数时候,透明的水总是应该在所有不透明的物体之后并在透明对象前被渲染。
如果设置忽略投影标签为"True",那么使用这个着色器的对象将不会被投影机所影响。对半透明的物体来说最有用处,因为没有对他们产生投影的好办法。