版本:Unity 6 (6000.0)
语言:英语
内置渲染管线中的 Autodesk Interactive 着色器
在内置渲染管线中编写自定义着色器

在内置渲染管线中运行时替换着色器

在内置的渲染管线一系列操作,将场景内容显示在屏幕上。Unity 允许您从预构建的渲染管线中选择,或编写自己的。 更多信息
参见 词汇表
中,您可以告诉一个相机一个组件,它创建场景中特定视点的图像。输出要么绘制到屏幕上,要么作为纹理捕获。 更多信息
参见 词汇表
在运行时更改它用来渲染某些几何体的着色器。您可能这样做是为了实现某种视觉效果,例如边缘检测。

着色器替换是在脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间推移修改组件属性并以任何您喜欢的方式响应用户输入。 更多信息
参见 词汇表
中使用Camera.RenderWithShaderCamera.SetReplacementShader函数来完成的。这两个函数都接受一个着色器在 GPU 上运行的程序。 更多信息
参见 词汇表
和一个replacementTag

它的工作原理是这样的:相机按照通常的方式渲染场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您放置环境、障碍物和装饰物,本质上是在分段设计和构建您的游戏。 更多信息
参见 词汇表
。对象仍然使用它们的材质,但它们使用的着色器发生了变化。

  • 如果replacementTag为空(必须是空字符串而不是 null),则场景中的所有对象都使用给定的替换着色器渲染。
  • 如果replacementTag不为空,则对于将要渲染的每个对象
    • 查询真实对象的着色器以获取标记值
    • 如果没有该标记,则不渲染对象。
    • 在替换着色器中找到具有给定标记的子着色器,其值为找到的值。如果找不到这样的子着色器,则不渲染对象。
    • 现在使用该子着色器来渲染对象。

因此,如果所有着色器都具有,例如,一个“RenderType”标记,其值例如是“Opaque”、“Transparent”、“Background”、“Overlay”,那么您可以编写一个替换着色器,该着色器只通过使用一个具有 RenderType=Solid标记一个参考词,您可以将其分配给一个或多个游戏对象,以帮助您识别用于脚本目的的游戏对象。例如,您可以为游戏中玩家可以吃的任何物品定义和“可食用”标记。 更多信息
参见 词汇表
的子着色器来渲染实体对象。其他标记类型将无法在替换着色器中找到,因此对象将不会被渲染。或者,您可以为不同的“RenderType”标记值编写多个子着色器。顺便说一句,所有内置的着色器对象着色器类的实例,着色器对象是着色器程序和 GPU 指令以及告诉 Unity 如何使用它们的信息的容器。将它们与材质一起使用以确定场景的外观。 更多信息
参见 词汇表
都设置了“RenderType”标记。

Lit 着色器替换

使用着色器替换时,场景将使用相机上配置的渲染路径进行渲染。这意味着用于替换的着色器可以包含阴影和光照通道(您可以将表面着色器用于着色器替换)。这对于渲染特殊效果和场景调试非常有用。

内置着色器中的着色器替换标记

所有内置着色器都设置了一个“RenderType”标记,可以在使用替换的着色器进行渲染时使用。标记值为以下值

  • Opaque:大多数着色器(法线垂直于网格表面的方向,用向量表示。Unity 使用法线来确定对象方向并应用阴影。 更多信息
    参见 词汇表
    自发光反射、地形着色器)。
  • Transparent:大多数半透明着色器(透明、粒子、字体、地形加性通道着色器)。
  • TransparentCutout:蒙版透明着色器(透明剪切、两通道植被着色器)。
  • Background天空盒一种特殊的材质,用于表示天空。通常是六面的。 更多信息
    参见 词汇表
    着色器。
  • Overlay:光晕、光焰着色器。
  • TreeOpaque地形场景中的景观。地形游戏对象会将一个大型平面添加到您的场景中,您可以使用地形的检查器窗口来创建详细的景观。 更多信息
    参见 词汇表
    引擎树皮。
  • TreeTransparentCutout:地形引擎树叶。
  • TreeBillboard:地形引擎公告板树。
  • Grass:地形引擎草。
  • GrassBillboard:地形引擎公告板草。

内置场景深度/法线纹理

如果您的某些效果需要,相机具有内置功能来渲染深度或深度+法线纹理。请参阅相机深度纹理页面。请注意,在某些情况下(取决于硬件),深度和深度+法线纹理可以在内部使用着色器替换进行渲染。因此,在您的着色器中拥有正确的“RenderType”标记非常重要。

代码示例

您的 Start() 函数指定替换着色器

void Start() {
    camera.SetReplacementShader (EffectShader, "RenderType");
}

这请求 EffectShader 使用 RenderType 键。EffectShader 将为您想要的每个 RenderType 拥有键值标记。着色器将看起来像这样

Shader "EffectShader" {
     SubShader {
         Tags { "RenderType"="Opaque" }
         Pass {
             ...
         }
     }
     SubShader {
         Tags { "RenderType"="SomethingElse" }
         Pass {
             ...
         }
     }
 ...
 }

SetReplacementShader 将查看场景中的所有对象,并且不是使用它们的普通着色器,而是使用第一个具有与指定键匹配的值的子着色器。在这个示例中,任何着色器具有 Rendertype=“Opaque” 标记的对象都将被 EffectShader 中的第一个子着色器替换,任何具有 RenderType=“SomethingElse” 着色器的对象都将使用第二个替换子着色器,依此类推。任何着色器没有与替换着色器中指定键匹配的标记值的物体都不会被渲染。

内置渲染管线中的 Autodesk Interactive 着色器
在内置渲染管线中编写自定义着色器