赞
踩
最近项目中需要优化模型的显示效果,所以就忙着编写合用效果的 shader 了,然后就遇到了各种各样的小问题,其中有个只在 pc 平台会报错,但是在 android 平台下没毛病的小 bug 卡了我一下,后来才发现又叫 unity 给坑了。
ps:这里不得不吐槽一下 unity 提供的这些内部着色器方法,虽然是极大的方便了 shader 的编写,但是这个文档呀。。。它有好多在内部写死了的实现,死到甚至要求我们的顶点,片段输入输出结构体中的语义
变量都必须是死名,2333,这你妹的没有文档可是叫人看死了。。。
我遇到的就是这个宏的问题TRANSFER_VERTEX_TO_FRAGMENT
,它定义在AutoLight.cginc
文件中,它会与宏LIGHTING_COORDS
协同工作,它会根据该pass处理的光源类型( spot 或 point 或 directional )来计算光源坐标的具体值,以及进行和 shadow 相关的计算等。
在pc平台的时候,它会去调用一个在UnityCG.cginc
文件中的ComputeScreenPos
方法,有问题的就是它了。
假如我们的顶点输出结构是这么定义的:
struct v2f
{
half4 vertex : SV_POSITION;
half2 uv : TEXCOORD0;
half3 normal : TEXCOORD1;
half3 viewDir : TEXCOORD2;
half3 lightDir : TEXCOORD3;
LIGHTING_COORDS(4, 5)
};
看着没有什么问题哈,但是在pc平台下就会报错,错误为:
现在让我们看看正确的写法是什么样的:
struct v2f
{
half4 pos : SV_POSITION;
half2 uv : TEXCOORD0;
half3 normal : TEXCOORD1;
half3 viewDir : TEXCOORD2;
half3 lightDir : TEXCOORD3;
LIGHTING_COORDS(4, 5)
};
现在,聪明的你看出来了吧,区别就在SV_POSITION
语义的变量名上,之前我们取的是vertex
,后来改成了pos
,那这是为什么呢?
然后我在unity的内置方法里一通搜,这里推荐一下 vscode 这个编辑器,真的是脚本开发的利器,可以以文件夹为单位打开代码,然后在里面全局搜索你要找的内容,特别的适合进行这种调用过程不明确,目标也不明确情况下的代码搜索。
结果在这里:
看到了没,上面我们提到过的TRANSFER_VERTEX_TO_FRAGMENT
会辅助我们进行阴影相关的计算,然后这里它在进行阴影坐标计算的时候,传入了一个a.pos
,所以这也就是为什么我们的顶点输出结构里,必须将变量定义为pos
的原因了,然鹅并没有文档来说明这个宏的正确使用方法,2333。。。。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。