Unity | Shader基础知识(第四集:Shader结构体)

目录

一、本节介绍

1 上集回顾

2 本节介绍

二、结构体的需求

1 数据的接入

2 开始写结构体

三、unity封装好的结构体

1 unity封装好了很多结构体

2 如何使用封装好的结构体

四、下集预告


一、本节介绍

1 上集回顾

上一集,我们做了一个可以改变颜色的案例。

2 本节介绍

这一集,我们继续讲一个语法,在shader里写结构体。

二、结构体的需求

1 数据的接入

shader里是不好随便去声明数据的,我们前面传入数据时,用的是括号传入(如图),

但是当数据很多的时候,就会不好弄,于是引入新语法,结构体,可以把很多个数据放到一起,像之前一样写代码用。

2 开始写结构体

需求:我们现在有3个语义想用

:POSITION             顶点坐标

:NORMAL               法线坐标

:TEXCOORD0        第一套纹理坐标         //纹理坐标就UV坐标,这里不详细讲解,可以百度

代码:用结构体把这些数据都接过来

            //这里结构体的名字是可以自己起的
            struct a2v
            {
            float4 vertex:POSITION;
            float3 normal:NORMAL;
            float4 texcoord:TEXCOORD0;
            }

这样,我们之后再用数据的时候,只需要声明一个结构体,通过结构体调用就可以了

例,修改上一个案例,加入结构体的内容

  • 上一个案例的链接:

Unity | Shader基础知识(第三集:案例<对材质颜色进行干预>)-CSDN博客

  • 代码写法是:
Shader "Custom/001"
{
SubShader
    {
        pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            //这里结构体的名字是可以自己起的
            struct a2v
            {
            float4 vertex:POSITION;
            float3 normal:NORMAL;
            float4 texcoord:TEXCOORD0;
            };

                    //传入并声明结构体
            float4 vert(a2v v):SV_POSITION
            {
                                    //调用结构体的vertex
            return UnityObjectToClipPos(v.vertex);
            }

            float4 frag():SV_TARGET
            {
            return float4(1,1,1,1);
            }

            ENDCG
        }
    }
}

三、unity封装好的结构体

1 unity封装好了很多结构体

例:

struct appdata_base {
    float4 vertex : POSITION;//顶点坐标
    float3 normal : NORMAL;//法线
    float4 texcoord : TEXCOORD0;//第一纹理坐标
    UNITY_VERTEX_INPUT_INSTANCE_ID    //ID信息
};
 
struct appdata_tan {
    float4 vertex : POSITION;//顶点坐标
    float4 tangent : TANGENT;//切线
    float3 normal : NORMAL;//法线
    float4 texcoord : TEXCOORD0;//第一纹理坐标
    UNITY_VERTEX_INPUT_INSTANCE_ID    //ID信息
};
 
struct appdata_full {
    float4 vertex : POSITION;
    float4 tangent : TANGENT;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
    float4 texcoord1 : TEXCOORD1;//第二纹理坐标
    float4 texcoord2 : TEXCOORD2;//第三纹理坐标
    float4 texcoord3 : TEXCOORD3;//第四纹理坐标
    fixed4 color : COLOR;        //顶点颜色
    UNITY_VERTEX_INPUT_INSTANCE_ID    //ID信息
};
2 如何使用封装好的结构体

其实这里又是一种引用,只要我们提前引用就可以使用

之前我们引用过CG语法,还在那个位置,进行引用

  • 例:
            //之前学的CG引用
            #pragma vertex vert
            #pragma fragment frag
            
            //unity封装好的部分结构体引用
            #include"UnityCG.cginc"
  • 引用案例:
Shader "Custom/001"
{
SubShader
    {
        pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include"UnityCG.cginc"

                    //假设我们要传入 appdata_base
                    //传入上述结构体
            float4 vert(appdata_base v):SV_POSITION
            {
                                    //调用结构体的vertex
            return UnityObjectToClipPos(v.vertex);
            }

            float4 frag():SV_TARGET
            {
            return float4(1,1,1,1);
            }

            ENDCG
        }
    }
}

四、下集预告

下集会根据之前的语法,学习一个数学知识,制作一个彩色的球。

猜你喜欢

转载自blog.csdn.net/weixin_49427945/article/details/134975591