表面&顶点片段着色器的一些问题

问题①:在表面着色器中修改顶点信息——
#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

posted @ 2023-07-26 18:19  terrificia  阅读(18)  评论(0编辑  收藏  举报