unity shader TRANSFER_VERTEX_TO_FRAGMENT 宏的一个小细节

来源:互联网 发布:单片机软件工程师招聘 编辑:程序博客网 时间:2024/05/16 12:33

最近项目中需要优化模型的显示效果,所以就忙着编写合用效果的 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。。。。。。

原创粉丝点击