找回密码
 注册帐号

扫一扫,访问微社区

使用替换着色器渲染

2015-1-8 15:54| 发布者: 杨炎| 查看: 1439| 评论: 0|原作者: 蛮牛|来自: unity3d脚本manual

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

使用替换着色器渲染

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

脚本撰写中使用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)" 标记是很重要的。

相关阅读

文章点评
相关文章
蛮牛教育10.1大促销!全站6折扣!