表面&顶点片段着色器的一些问题
#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
/**********2024.5.13************/
我发现表面着色器里面确实是有命名冲突的,除了上面的“uv_MainTex2”之外,“worldNormal”也是不可以使用的,可能还有别的命名是不可以使用的
/*********************************/
问题③:关于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)
问题④:关于for循环 // 2024-06-05
下面是一些使用for循环需要注意的问题(如果可以,尽可能少在GPU中使用for循环)
1,无法在存在for循环的片段着色器中直接使用结构体中的数据,例如i.uv
解决方式就是:声明一个变量缓存,例如float2 uv = i.uv;再去使用
问题⑤:关于#define //2024-06-18
1,其实我之前搞不清楚#define定义的数字有什么作用,因为绝大部分情况需要的数字声明在函数中也是没有问题的
直到我碰到了shader中的数组
需要我动态改变数组长度——在函数中声明的变量是无法用于声明数组的长度的,但是#define可以
2,自定义的函数定义输入参数的名字,切记不能与#define声明的名字相同,要不然会报错 //2024-10-09