在srp中执行context.DrawRenderers需要指定一个DrawingSettings,参数需要传递一个ShaderTagId。对shaderTagId表示疑惑,对此进行一些相关知识的整理与研究。
一. unity的渲染路径
默认使用graphic Setting中渲染路径,多个相机下可以修改相机上的RenderPath。
二. shader中的渲染路径
在上述设置生效后,我们可以给shader指定该pass使用何种渲染路径,这种就是用lightMode来指定的。如果当前显卡并不支持指定的渲染路径,则会使用更低的渲染路径。
三. LightMode的类别
标签名 | 描述 |
---|---|
Always | 不管使用哪种渲染路径,该pass始终被渲染,但不计算任何光照 |
ForwardBase | 用于前向渲染。该pass计算环境光、最重要的平行光、逐顶点/SH光源和LightMaps |
ForwardAdd | 用于前向渲染。该pass会计算额外的逐像素光源,每个pss对应一个光源 |
Deffered | 用于延迟渲染。该pass会渲染G缓冲(G-Buffer) |
ShadowCaster | 把物体的深度信息渲染到阴影映射纹理(shadowmap)或一张深度纹理中 |
PrepassBase | 用于遗留的延迟渲染。该Pass会渲染发现和高光反射的指数部分 |
PrepassFinal | 用于遗留的延迟渲染。该Pass通过合并纹理、光照和自发光来渲染得到最后的颜色。 |
Vertex、VertexLMRGBM和VertexLM | 用于遗留的顶点照明渲染 |
Meta | |
MotionVectors | |
NeverExecuted | |
SRPDefaultUnlit | 在SRP中设置成这个默认unlit,或者shader中没有设置lightmode时,会检查这个passType。 |
上述内容部分引用《shader入门精要》。
四. SRPDefaultUnlit
默认情况下,我们需要指定一个默认的lightMode。也就是前言中对shaderTagId疑惑的地方,这里shaderTagName实际上指lightMode。如果pass未指定LightMode,unity会自动设置成SRPDefaultUnlit。
五. Legacy Shaders
在srp中如果使用了一些特定的shader pass,比如unlit,那不是unlit的pass就无法被正确的渲染出来。在编辑器状态下为了保持能显示出来,我们可以让他们显示出来,呈现一个wrong shader的样式(跟内置管线一样的显示)。这时候为了覆盖所有可能需要使用的shaderTagId,就最好尽可能的覆盖他们。
static ShaderTagId[] legacyShaderTagIds = {
new ShaderTagId("Always"),
new ShaderTagId("ForwardBase"),
new ShaderTagId("PrepassBase"),
new ShaderTagId("Vertex"),
new ShaderTagId("VertexLMRGBM"),
new ShaderTagId("VertexLM")
};
void DrawUnsupportedShaders()
{
var drawingSettings = new DrawingSettings(
legacyShaderTagIds[0], new SortingSettings(camera)
);
for (int i = 1; i < legacyShaderTagIds.Length; i++)
{
drawingSettings.SetShaderPassName(i, legacyShaderTagIds[i]);
}
var filteringSettings = FilteringSettings.defaultValue;
context.DrawRenderers(
cullingResults, ref drawingSettings, ref filteringSettings
);
}
参考资料:
https://blog.csdn.net/u013610680/article/details/50688750
https://zhuanlan.zhihu.com/p/31766439
https://catlikecoding.com/unity/tutorials/custom-srp/custom-render-pipeline/