ShaderLab的Dependency关键字用途推测

在UWA的问答中找到了这样一条线索:

https://answer.uwa4d.com/question/5ab8b537d35eb22c10a0a426

所以,官方文档是不存在的。

答案中提供的博客地址也是无法访问的,无法连接至 alastaira.wordpress.com 的服务器,翻墙不翻墙都无法访问。

基于Qiang提供的线索,对Unity3d的Terrain进行注释Dependency的尝试。

  保留AddPassShader 注释掉AddPassShader
使用4张地形贴图 一切正常 一切正常
使用9张(大于4)地形贴图 一切正常 显示错误紫

测试结果验证了Qiang的说法,Dependency "AddPassShader"这项依赖是在地形贴图大于4张时才被使用的,如果未提供该依赖项,Shader直接出错。这个名为Add的Shader主要通过定义TERRAIN_SPLAT_ADDPASS关键字来工作,从实现逻辑看,是针对第5~N套贴图,权重为0的被直接裁剪掉,否则就执行和前4套贴图一样的绘制逻辑。从实际的测试情况看,第1~4套贴图是使用地形Shader的默认着色Pass进行渲染,第5~9(N)套贴图是使用这个被指定的AddPassShader的默认着色Pass进行渲染。而Dependency "BaseMapShader"是用于低端设备的说法从源码实现中也得到了验证,当设备无法支持4套(8张)纹理贴图时,仅使用1套纹理贴图执行渲染。而从基础Shader没有提供Meta这个pass来看,想来在烘焙的时候也是Fallback到这个Shader来使用它的Meta Pass的。

所以,推断Dependency属性的用法是定义一个Shader名字,供逻辑层指定在不同情境下自动改用指定的Shader,而未被定义的Pass可能仍使用原Shader中的Pass。理论上也可用于自定义的Shader切换逻辑,比如白天、夜晚使用不同的Shader。具体指定的方法还需要找找引擎是否提供了相应的API。这种用法和直接使用Shader关键字定义产生不同变体的用法的区别不明。

以上均为推测,欢迎指正。

猜你喜欢

转载自blog.csdn.net/weixin_42163773/article/details/84239467
今日推荐