返回介绍

使用替换着色器渲染

发布于 2021-06-20 00:15:07 字数 2148 浏览 957 评论 0 收藏 0

一些渲染效果要求使用一组不同的着色器来渲染场景。例如,好的边缘检测需要带场景法线的纹理才能检测出表面朝向变化的边缘。其他效果可能需要带场景深度的纹理等等。要想获得这些效果,可用所有对象的替换着色器来渲染场景。

在脚本撰写中使用 Camera.RenderWithShader 或 Camera.SetReplacementShader 函数可进行着色器替换。这两个函数都使用着色器和 ``replacementTag`。

其工作原理如下:相机还是像平常一样渲染场景,对象仍使用原有的材质,但最后真正使用的着色器已经变了:

  • 如果 replacementTag 为空,则场景中的所有对象都用给定的替换着色器进行渲染。
  • 如果 replacementTag 不为空,则对于每个要渲染的对象来说:
    • 按照标记值查询真正对象的着色器。
    • 如果没有标记,对象将不进行渲染
    • 在具有查找值的给定标签的替换着色器中找到子着色器。如果没有找到这样的子着色器,对象将不进行渲染
    • 现在子着色器用于渲染该对象。

所以,举例而言,如果所有着色器都有“RenderType”标记,标记值为“不透明” (Opaque)、“透明” (Transparent)、“背景” (Background)、“叠加” (Overlay) 等,您可以通过使用含有 RenderType=Solid 标记的子着色器编写一个只渲染固体对象的替换着色器。其他标记不会在替换着色器中找到,所以对象不会进行渲染。或者您可以为不同的“渲染类型”(RenderType) 标记值编写数个子着色器。顺便说一下,所有内置的 Unity 着色器都有一个“渲染类型”(RenderType) 标记集。

光照着色器替换

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

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

所有内置 Unity 着色器都有一个“渲染类型 (RenderType)" 标记集。当使用替换着色器进行渲染时,可以使用该标记集。标记值如下所示:

  • 不透明 (Opaque)用于大多数着色器(法线着色器自发光着色器反射着色器以及地形着色器)。
  • 透明 (Transparent):用于大多数半透明着色器(透明着色器、粒子着色器、字体着色器、地形额外通道着色器)。
  • TransparentCutout:遮蔽的透明着色器(透明镂空着色器、两个通道植被着色器)。
  • 背景 (Background):天空盒着色器
  • 叠加 (Overlay):GUITexture、光晕着色器、闪光着色器。
  • TreeOpaque:地形引擎树皮着色器。
  • TreeTransparentCutout:地形引擎树叶。
  • TreeBillboard:地形引擎布告板树。
  • Grass:地形引擎草。
  • GrassBillboard:地形引擎布告板草。

内置场景深度/法线纹理

如果需要在一些效果中渲染深度或深度 + 法线纹理,相机 (Camera) 的内置功能可以帮您实现这点。请参阅相机深度纹理页面。请注意,在一些情况下(依硬件而定),深度和深度 + 法线纹理可以通过使用着色器替换进行内部渲染。因此确保着色器中具有正确的 "渲染类型 (RenderType)" 标记是很重要的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文