可能的原因之一
Camera.SetReplacementShader() 函数在替换shader的时候,仅替换Subshader部分。这个时候,如果Subshader中有一些参数,没有在Properties里面给到的话,就会出现变黑这种情况。(就算是新shader文件中的Properties有这些参数也不行,需要物体的这个shader中的参数也有这些。) 当然,如果你不确定你的错误是不是这个导致的,那么请往下看:
问题描述
一开始,物体是这样的:
在使用mainCam.SetReplacementShader(Shader.Find("ta/test1"),"RenderType"); 之后,物体成了这样:(其中ta/test1是另一个shader的名字,是有描边效果的shader)
原因解释
首先上结论:Camera.SetReplacementShader() 函数在替换shader的时候,仅替换Subshader部分。这个时候,如果Subshader中有一些参数,没有在Properties里面给到的话,就会出现变黑这种情况。(就算是新shader的Properties有这些参数也不行,需要本来的这个shader中的参数也有这些。)
具体原因看官网:
Shader replacement is done from scripting using Camera.RenderWithShader or Camera.SetReplacementShader functions. Both functions take a shader and a replacementTag.
可以使用Camera.RenderWithShader 或者Camera.SetReplacementShader 函数进行shader的替换。两个函数都需要提供shader 和replacementTag 参数。
It works like this: the camera renders the scene as it normally would. the objects still use their materials, but the actual shader that ends up being used is changed:
它们是这样运作的:摄像机依然对场景进行常规渲染,并且这些物体依然使用它们的材质球。但是,实际上这些材质球使用的shader已经做了如下改变:
If replacementTag is empty, then all objects in the scene are rendered with the given replacement shader. If replacementTag is not empty, then for each object that would be rendered: The real object’s shader is queried for the tag value. If it does not have that tag, object is not rendered. A subshader is found in the replacement shader that has a given tag with the found value. If no such subshader is found, object is not rendered. Now that subshader is used to render the object.
- 如果replacementTag参数是空的,那么用给定的新shader替换旧shader渲染所有的物体;
- 如果replacementTag参数不是空的,那么这样渲染每一个物体:
-
- 查询每一个物体的shader的Tags,如果没有那个tag,那么就不渲染这个物体(例如图一中左上角的小绿球,到了图二中就没有了)。如果找到了使用该tag的物体的Subshader,那么使用新的Subshader进行渲染。
所以,由于替换的是Subshader部分,那么就需要在Properties中加入可能用到的Subshader的参数。这样在更改subshader之后才不会缺参数变黑。
|