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

Mesh Filter : 存儲(chǔ)一個(gè)Mesh(網(wǎng)格遣总,模型的網(wǎng)格埃脏,就是模型的由哪些三角面組成诗赌,組成一個(gè)什么樣子的模型,三角面的一些頂點(diǎn)信息)
Mesh Renderer:用來(lái)渲染一個(gè)模型的外觀被饿,就是樣子四康, 按照 mesh給它皮膚,給它顏色
通過(guò)Material(材質(zhì))控制模型渲染的樣子

Material貼圖(可以沒(méi)有狭握,可以是一個(gè)單純的顏色)

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

CG語(yǔ)言教程官網(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ù)學(xué)函數(shù)在線演示
http://zh.numberempire.com/graphingcalculator.php

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

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

什么是OpenGL闪金、DirectX
shader可以認(rèn)為是一種渲染命令 ,由opengl 或者dx進(jìn)行解析哥牍,來(lái)控制渲染豐富多彩的圖形

OpenGL 使用GLSL 編寫(xiě)shader
DirectX 使用HSSL 編寫(xiě)shader
英偉達(dá) CG 編寫(xiě)shader(跨平臺(tái))

Unity Shader的分類
使用的是ShaderLab編寫(xiě)Unity中的Shader
1,表面著色器 Surface Shader
2,頂點(diǎn)/片元著色器 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)用程序傳遞到頂點(diǎn)函數(shù)的語(yǔ)義有哪些a2v
POSITION 頂點(diǎn)坐標(biāo)(模型空間下的)
NORMAL 法線( 模型空間下)
TANGENT 切線(模型空間)
TEXCOORD0 ~n 紋理坐標(biāo)
COLOR 頂點(diǎn)顏色

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

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

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

pixel = (normal+1)/2

normal = pixel*2 - 1

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

        //SubShader可以寫(xiě)多個(gè),顯卡運(yùn)行效果的時(shí)候嗅辣,從第一個(gè)SubShader開(kāi)始撼泛,
        //如果第一個(gè)SubShader里面的效果都可以實(shí)現(xiàn)那就使用第一個(gè)SubShader,如果顯卡發(fā)現(xiàn)這個(gè)SubShader里面效果它實(shí)現(xiàn)不了澡谭,
        //那它會(huì)去運(yùn)行下一個(gè)SubShader
        SubShader{
        //這里編寫(xiě)的是渲染的代碼控制渲染的效果愿题,不同的SubShader實(shí)現(xiàn)不同的渲染效果
        Pass {//至少有一個(gè)Pass塊
              //在這里編寫(xiě)Shader代碼
        CGPROGRAM
        //使用CG語(yǔ)言編寫(xiě)Shader代碼


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

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


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

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


        //
        v2f vert(a2v v) {
                v2f f;
        //這是把一個(gè)坐標(biāo)跟一個(gè)矩陣相乘杆兵,使用一個(gè)宏,這是一個(gè)4*4的矩陣,這個(gè)矩陣是專門(mén)完成從模型空間到剪裁空間的轉(zhuǎn)換的
                        f.position = UnityObjectToClipPos(v.vertex);//矩陣的作用就是完成一個(gè)空間轉(zhuǎn)換的過(guò)程
                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://備用琐脏,當(dāng)前面的SubShader都無(wú)法使用的時(shí)候會(huì)調(diào)用這個(gè)
}
Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市缸兔,隨后出現(xiàn)的幾起案子日裙,更是在濱河造成了極大的恐慌,老刑警劉巖惰蜜,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昂拂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡抛猖,警方通過(guò)查閱死者的電腦和手機(jī)格侯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)财著,“玉大人联四,你說(shuō)我怎么就攤上這事〕沤蹋” “怎么了碎连?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)驮履。 經(jīng)常有香客問(wèn)我,道長(zhǎng)廉嚼,這世上最難降的妖魔是什么玫镐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮怠噪,結(jié)果婚禮上恐似,老公的妹妹穿的比我還像新娘。我一直安慰自己傍念,他們只是感情好矫夷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著憋槐,像睡著了一般双藕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阳仔,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天忧陪,我揣著相機(jī)與錄音,去河邊找鬼。 笑死嘶摊,一個(gè)胖子當(dāng)著我的面吹牛延蟹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叶堆,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼阱飘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了虱颗?” 一聲冷哼從身側(cè)響起沥匈,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎上枕,沒(méi)想到半個(gè)月后咐熙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辨萍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年棋恼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锈玉。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爪飘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拉背,到底是詐尸還是另有隱情师崎,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布椅棺,位于F島的核電站犁罩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏两疚。R本人自食惡果不足惜床估,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诱渤。 院中可真熱鬧丐巫,春花似錦、人聲如沸勺美。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赡茸。三九已至缎脾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坛掠,已是汗流浹背赊锚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工治筒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舷蒲。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓耸袜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親牲平。 傳聞我的和親對(duì)象是個(gè)殘疾皇子堤框,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容