表面&顶点片段着色器的一些问题
问题①:在表面着色器中修改顶点信息——
#pragma surface surf Lambert vertex:vert /***********/ void vert(inout appdata_full v, out Input o) { UNITY_INITIALIZE_OUTPUT(Input, o); /**********/ }
appdata_full是unity给我们的输入结构体,另外还有一些unity给我们的结构体,可以在UNITYCG.CGINC里面看到,顶点着色器里面注意要初始化结构体
问题②:在描边着色器中使用第二套UV
struct Input { float2 uv_MainTex; float2 secondUV; }; void vert(inout appdata_full v, out Input o) { UNITY_INITIALIZE_OUTPUT(Input, o); secondUV = v.texcoord1.xy; /**********/ }
不写的话默认是采样到第一套UV的,所以要在顶点函数里面主动赋值上,
另外在Input结构体中新开的通道名字是不能使用与第一个UV相似的名字,比如我这里并没有声明为uv_MainTex2,而是用了secondUV,使用了uv_MainTex2并不能采样到第二套UV,不清楚原因
还有一同上的点——我把uv_MainTex删除后使用uv这个名字作为替换,是没有用的,必须使用uv_MainTex,才能取到正常的UV
问题③:关于TRANSFORM_TEX()函数 //2023.11.17
这个函数是用来控制shader面板中的tilling和offset的,本质为
uv * _MainTex_ST.xy + _MainTex_ST.zw;
但是使用TRANSFORM_TEX时需要注意的是,函数内部似乎没有封装完整,假如有类似于
TRANSFORM_TEX(uv + 20, _MainTex)
这样形式的需求,是会报错的
原因也很简单,它里面没有带括号,所以我们在外面需要加上一个括号:
TRANSFORM_TEX((uv + 20), _MainTex)