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

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

 

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