初学Unity ShaderLab的时候,一定有接触过Unity Shader中的Tags标签块,比如:
<span style="white-space:pre"> </span>"LightMode"="Vertex"
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
"PreviewType"="Plane"
其中LightMode标签指定该pass的渲染路径,Queue指定渲染顺序,IgnoreProjector指定是否忽略Projector的影响,PreviewType一般用于UIshader,PreviewType=Plane的话在材质面板看到的就是一个平面而不是材质球。
但是很多人对RenderType的了解可能相比其他标签要稍微淡薄一些,只知道比如渲染不透明物体使用Opaque,渲染透明物体使用Transparent等,而官网上有提到RenderType会用于材质替代渲染(RenderWithShader SetReplacementShader),但究竟是如何去使用的,今天我总结下自己的理解。
首先,关于材质替代渲染,其主要就是Camera类的两个函数SetReplacementShader和RenderWithShader,其形参完全一样,第一个参数是用于替代的shader,以下记为RPShader,后一个参数是个字符串,表示用于替代的标签,包括自定义标签,以下记为mType,也就是假如我们调用SetReplacementShader(RPShader,"mType"),这个摄像机会检查所有渲染到的物体的shader,检查其是否包含mType标签,如果不存在则这个物体将不渲染,如果存在,在看这个标签的值,假如"mType"="A",则在RPShader中找到"mType"="A"的subshader并用它来替代这个物体,假如RPShader中不包含"mType"="A"的标签,那么这个物体也不会渲染。
接下来,我们需要去unity的内置shader中找一个shader,(内置shader请去官网下载源码)。
我们找到内置shader源码路径下这个文件夹:\DefaultResources,在里面可以找到这个shader:Camera-DepthNormalTexture.shader,(PS:5.x之前的版本还能找到Camera-DepthTexture.shader,从内容上看,其似乎会在UNITY_MIGHT_NOT_HAVE_DEPTH_TEXTURE这个宏条件成立的情况下渲染深度,之前尝试使用这个shader做替代渲染但没有成功得到和_CameraDepthTexture一样的效果,后来官网上看到这句:
-
UNITY_MIGHT_NOT_HAVE_DEPTH_TEXTURE
- defined if a platform might emulate shadow maps or depth textures by manually rendering depth into a texture.
所以5.x中我们已经找不到Camera-DepthTexture.shader这个shader了)
(补充:后来在5.x中研究了_CameraDepthTexture的渲染,写到这篇文章里了:http://blog.youkuaiyun.com/mobilebbki399/article/details/50559732)
打开Camera-DepthNormalTexture.shader,其内容如下:
Shader "Hidden/Camer