Shander編程(一)使用結(jié)構(gòu)體編寫一個簡單的Shader

Mesh Filter : 存儲一個Mesh(網(wǎng)格,模型的網(wǎng)格,就是模型的由哪些三角面組成,組成一個什么樣子的模型,三角面的一些頂點信息)
Mesh Renderer:用來渲染一個模型的外觀,就是樣子, 按照 mesh給它皮膚,給它顏色
通過Material(材質(zhì))控制模型渲染的樣子

Material貼圖(可以沒有,可以是一個單純的顏色)

    Shader書籍
unity shader 入門精要(樂樂程序猿)
unity 3d shaderlab開發(fā)實戰(zhàn)詳解(第二版)
unity 5.x shaders and effects cookbook(中文版 unity著色器和屏幕特效開發(fā)秘籍)

CG語言教程官網(wǎng)
http://http.developer.nvidia.com/CgTutorial/cg_tutorial_frontmatter.html

一些網(wǎng)站
www.shadertoy.com
http://blog.csdn.net/poem_qianmo?viewmode=contents

數(shù)學函數(shù)在線演示
http://zh.numberempire.com/graphingcalculator.php

UnityCG.cginc中一些常用的函數(shù)

//攝像機方向(視角方向)
float3 WorldSpaceViewDir(float4 v)      根據(jù)模型空間中的頂點坐標 得到 (世界空間)從這個點到攝像機的觀察方向
float3 UnityWorldSpaceViewDir(float4 v) 世界空間中的頂點坐標==》世界空間從這個點到攝像機的觀察方向
float3 ObjSpaceViewDir(float4 v)        模型空間中的頂點坐標==》模型空間從這個點到攝像機的觀察方向
//光源方向
float3 WorldSpaceLightDir(float4 v)     模型空間中的頂點坐標==》世界空間中從這個點到光源的方向
float3 UnityWorldSpaceLightDir(float4 v)    世界空間中的頂點坐標==》世界空間中從這個點到光源的方向
float3 ObjSpaceLightDir(float4 v)   模型空間中的頂點坐標==》模型空間中從這個點到光源的方向
//方向轉(zhuǎn)換
float3 UnityObjectToWorldNormal(float3 norm) 把法線方向 模型空間==》世界空間
float3 UnityObjectToWorldDir(float3 dir) 把方向 模型空間=》世界空間
float3 UnityWorldToObjectDir(float3 dir) 把方向 世界空間=》模型空間

什么是OpenGL、DirectX
shader可以認為是一種渲染命令 ,由opengl 或者dx進行解析,來控制渲染豐富多彩的圖形

OpenGL 使用GLSL 編寫shader
DirectX 使用HSSL 編寫shader
英偉達 CG 編寫shader(跨平臺)

Unity Shader的分類
使用的是ShaderLab編寫Unity中的Shader
1,表面著色器 Surface Shader
2,頂點/片元著色器 Vertex/Fragment Shader
3,固定函數(shù)著色器 Fixed Function Shader

Unityshader中屬性的類型有哪些
_Color("Color",Color)=(1,1,1,1)
_Vector("Vector",Vector)=(1,2,3,4)
_Int("Int",Int)= 34234
_Float("Float",Float) = 4.5
_Range("Range",Range(1,11))=6
_2D("Texture",2D) = "red"{}
_Cube("Cube",Cube) = "white"{}
_3D("Texure",3D) = "black"{}

從應(yīng)用程序傳遞到頂點函數(shù)的語義有哪些a2v
POSITION 頂點坐標(模型空間下的)
NORMAL 法線( 模型空間下)
TANGENT 切線(模型空間)
TEXCOORD0 ~n 紋理坐標
COLOR 頂點顏色

從頂點函數(shù)傳遞給片元函數(shù)的時候可以使用的語義
SV_POSITION 剪裁空間中的頂點坐標(一般是系統(tǒng)直接使用)
COLOR0 可以傳遞一組值 4個
COLOR1 可以傳遞一組值 4個
TEXCOORD0~7 傳遞紋理坐標

片元函數(shù)傳遞給系統(tǒng)
SV_Target 顏色值,顯示到屏幕上的顏色

shader中的各種空間坐標
http://blog.csdn.net/lyh916/article/details/50906272
什么是切線空間
http://blog.csdn.net/bonchoix/article/details/8619624

pixel = (normal+1)/2

normal = pixel*2 - 1

第一個Shader的編寫
Shader"Use Struct"{
    properties{
        //在這里編寫屬性
        _Color("Color",Color) = (1,1,1,1)
    }

        //SubShader可以寫多個,顯卡運行效果的時候,從第一個SubShader開始,
        //如果第一個SubShader里面的效果都可以實現(xiàn)那就使用第一個SubShader,如果顯卡發(fā)現(xiàn)這個SubShader里面效果它實現(xiàn)不了,
        //那它會去運行下一個SubShader
        SubShader{
        //這里編寫的是渲染的代碼控制渲染的效果,不同的SubShader實現(xiàn)不同的渲染效果
        Pass {//至少有一個Pass塊
              //在這里編寫Shader代碼
        CGPROGRAM
        //使用CG語言編寫Shader代碼


            //頂點函數(shù)  這里只是申明了頂點函數(shù)的函數(shù)名
            //基本作用是 完成頂點坐標從模型空間到剪裁空間的轉(zhuǎn)換(從游戲環(huán)境轉(zhuǎn)換到視野相機屏幕上)
#pragma vertex vert

            //片元函數(shù)  這里只是申明了片元函數(shù)的函數(shù)名
            //基本作用 返回模型對應(yīng)的屏幕上的每一個像素的顏色值
#pragma fragment frag


        //appllcation to vertex
        //a2v 從應(yīng)用程序傳遞到頂點的函數(shù)的語義
        //POSITION:頂點坐標(模型空間下的)
        //NORMAL:法線(模型空間下)
        //TANGENT:切線(模型空間下)
        //TEXCOORD0~7 紋理坐標
        //COLOR 頂點顏色
            //結(jié)構(gòu)體
            struct a2v {
               float4 vertex:POSITION;//告訴unity 把模型空間下的頂點坐標填充給vertex;
               float3 normal:NORMAL;//告訴unity把模型空間下的法線方向填充給normal;
               float4 texcoord:TEXCOORD0;//告訴unity把第一套紋理坐標填充給texcoord;
              };

     //從頂點函數(shù)傳遞給片元函數(shù)的時候可以使用的語義
    //SV_POSITION  剪裁空間中的頂點坐標(一般是系統(tǒng)直接使用)
    //COLOR0 可以傳遞一組值 4個
   //COLOR1 可以傳遞一組值 4個
   //TEXCOORD0~7 傳遞紋理坐標
        struct v2f {
            //SV_POSITION:這個語義是用來解釋說明返回值,意思是返回值是剪裁空間下的頂點坐標
            float4 position:SV_POSITION;
            float3 temp:Color0;//Color0 這個語義可以由用戶定義,一般都存儲顏色 可以做數(shù)據(jù)的傳遞
        }; 


        //
        v2f vert(a2v v) {
                v2f f;
        //這是把一個坐標跟一個矩陣相乘,使用一個宏,這是一個4*4的矩陣,這個矩陣是專門完成從模型空間到剪裁空間的轉(zhuǎn)換的
                        f.position = UnityObjectToClipPos(v.vertex);//矩陣的作用就是完成一個空間轉(zhuǎn)換的過程
                f.temp = v.normal;
                return f;
            }
        //片元函數(shù)傳遞給系統(tǒng)
        //SV_Target 顏色值,顯示到屏幕上的顏色
        fixed4 frag(v2f f) :SV_Target{
            return fixed4(f.temp,1);
        }

            ENDCG
       }
    }
        Fallback"VertexLit"http://備用,當前面的SubShader都無法使用的時候會調(diào)用這個
}
Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容