1. 程式人生 > >unity shader 入門

unity shader 入門

div 技術分享 調用 pos sub 組件 matrix com chap

1.一個簡單的頂點/片元著色器基本結構

Shader "Unity Shaders Book/Chapter 5/Simple Shader" {
    }
    SubShader {
        Pass {
            CGPROGRAM
            //告訴unity哪個函數包含了頂點著色器的代碼
            #pragma vertex vert
            //告訴unity哪個函數包含了片元著色器的代碼
            #pragma fragment frag
            //POSITION:告訴unity把模型的頂點坐標填充到v中;SV_POSITION:告訴unity頂點著色器輸出的裁剪空間中的頂點坐標
float4 vert(float4 v:POSITION) : SV_POSITION{ return mul(UNITY_MATRIX_MVP,V); } //SV_Target:把用戶的輸出顏色存儲到一個渲染目標中 fixed4 frag() : SV_Target { return fixed4(1.0,1.0,1.0,1.0); } ENDCG } } }

2.為頂點著色器定義一個新的傳入參數,使用結構體

Shader "Unity Shaders Book/Chapter 5/Simple Shader" {
    }
    SubShader {
        Pass {
            CGPROGRAM
            //告訴unity哪個函數包含了頂點著色器的代碼
            #pragma vertex vert
            //告訴unity哪個函數包含了片元著色器的代碼
            #pragma fragment frag
        //a:應用;v:頂點著色器;a2v:把數據從應用階段傳遞到頂點著色器
struct a2v { // POSITION:告訴unity使用模型空間的頂點坐標填充vertex變量 float4 vertex : POSITION; // NORMAL:告訴unity使用模型空間的法線方向填充normal float3 normal : NORMAL; // TEXCOORD:告訴unity使用模型的第一套紋理坐標填充texcoord變量 float texcoord : TEXCOORD; } //POSITION:告訴unity把模型的頂點坐標填充到v中;SV_POSITION:告訴unity頂點著色器輸出的裁剪空間中的頂點坐標 float4 vert(a2v v) : SV_POSITION{ return mul(UNITY_MATRIX_MVP,V.tertex); } //SV_Target:把用戶的輸出顏色存儲到一個渲染目標中 fixed4 frag() : SV_Target { return fixed4(1.0,1.0,1.0,1.0); } ENDCG } } }

POSITION,NORMAL,TEXCOORD中的數據由使用該shader的材質的MeshRender組件提供。在每幀調用Draw Call時,Mesh Render組建會把它負責渲染的模型書記發送給shader。

3。為片元著色器定義一個新的傳入參數,使用結構體

Shader "Unity Shaders Book/Chapter 5/Simple Shader" {
    }
    SubShader {
        Pass {
            CGPROGRAM
            //告訴unity哪個函數包含了頂點著色器的代碼
            #pragma vertex vert
            //告訴unity哪個函數包含了片元著色器的代碼
            #pragma fragment frag

            struct a2v {
                //    POSITION:告訴unity使用模型空間的頂點坐標填充vertex變量
                float4 vertex : POSITION;
                //    NORMAL:告訴unity使用模型空間的發現方向填充normal
                float3 normal : NORMAL;
                //    TEXCOORD:告訴unity使用模型的第一套紋理坐標填充texcoord變量
                float texcoord : TEXCOORD;
            }
            struct v2f {
                //    SV_POSITION:告訴unity ,pos裏包含了頂點在裁剪空間中的位置信息
                float4 pos : SV_POSITION;
                //    COLOR:存儲顏色信息
                fixed3 color : COLOR0;
            }
            
            //POSITION:告訴unity把模型的頂點坐標填充到v中;SV_POSITION:告訴unity頂點著色器輸出的裁剪空間中的頂點坐標
           v2f vert(a2v v) : SV_POSITION{
                //聲明輸出結果
                v2f o;
                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                //v.normal包含了頂點的法線方向,其分量範圍在[-1.0,1.0]
                //下麥呢的代碼把分量範圍映射到了[0.0,1.0]
                //存儲到o.color中傳遞給片元著色器
                o.color = v.normal*0.5 + fixed3(0.5, 0.5, 0.5);
                return o;
            }
            //SV_Target:把用戶的輸出顏色存儲到一個渲染目標中
            fixed4 frag(v2f i) : SV_Target {
                //將插值後的i.color顯示到屏幕上
                return fixed4(i.color,1.0);
            }
            ENDCG
        }
    }
}

v2f用於頂點著色器和片元著色器之間傳遞信息。

4。添加屬性,方便在面板上直接控制模型在屏幕上顯示的顏色

Shader "Unity Shaders Book/Chapter 5/Simple Shader" {
    Properties{
        //聲明一個Color類型的屬性
        _Color("Color",Color) = (1.0,1.0,1.0,1.0)
    }
        SubShader{
            Pass {
                CGPROGRAM

                #pragma vertex vert
                #pragma fragment frag

                //在CG代碼中,需要定義一個與屬性名稱和類型都匹配的變量
                fixed4 _Color;

                struct a2v {
                    float4 vertex : POSITION;
                    float3 normal : NORMAL;
                    float texcoord : TEXCOORD;
                }
                struct v2f {
                    float4 pos : SV_POSITION;
                    fixed3 color : COLOR0;
                }
            
               v2f vert(a2v v) : SV_POSITION{
                    v2f o;
                    o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                    o.color = v.normal*0.5 + fixed3(0.5, 0.5, 0.5);
                    return o;
                }
                fixed4 frag(v2f i) : SV_Target {
                    fixed3 c = i.color;
                    //使用_Color屬性來控制輸出顏色
                    c *= _Color.rgb;
                    return fixed4(c,1.0);
                }
                ENDCG
        }
    }
}

5.添加內置的包含文件

技術分享圖片

技術分享圖片

6.126

unity shader 入門