您的位置:首页 > 移动开发 > Unity3D

unity shader TRANSFER_VERTEX_TO_FRAGMENT 宏的一个小细节

2017-05-18 18:02 1201 查看
最近项目中需要优化模型的显示效果,所以就忙着编写合用效果的 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。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity shader TRANSFER