小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

解讀Unity中的CG編寫(xiě)Shader系列1

 kiki的號(hào) 2017-04-23

CG=C for Graphics  用于計(jì)算機(jī)圖形編程的C語(yǔ)言超集

前提知識(shí)點(diǎn):

1.CG代碼必須用

CGPROGRAM

。。。

ENDCG括起來(lái)

2.頂點(diǎn)著色器與片段著色器的主函數(shù)名稱(chēng)可隨意,但需要再#pragma vert 與#pragma fragment中聲明并且與主函數(shù)名完全匹配,shader才會(huì)找到入口

3.float4是一種壓縮數(shù)組,float4 vert與float vert[4]嚴(yán)格意義上講不同,雖然都是存放4個(gè)float,但float4作為向量類(lèi)型做點(diǎn)乘、內(nèi)積等處理更快速

4.語(yǔ)義 :變量除了變量名與數(shù)據(jù)類(lèi)型之外,還在:后聲明其語(yǔ)義

例子一:RGB立方體

例題闡述:

給一個(gè)立方體(cube)創(chuàng)建一個(gè)shader,在立方體的直角坐標(biāo)系中,三個(gè)坐標(biāo)x,y,z的取值范圍為{0,0,0}至{1,1,1},而RGBA顏色red,green,blue,alpha的取值范圍正好是{0,0,0,0}至{1,1,1,1},將alpha寫(xiě)死為1,那么r,g,b分別與x,y,z建立一一映射,可得到一個(gè)6個(gè)面展示所有RGB顏色的立方體如圖:



具體代碼及其含義如下:

  1. Shader "Custom/RGBCube" {  
  2.     SubShader   
  3.     {  
  4.         Pass {  
  5.         CGPROGRAM  
  6.         #pragma vertex vert //頂點(diǎn)著色器入口函數(shù)聲明  
  7.         #pragma fragment frag // 片段著色器入口函數(shù)聲明  
  8.         //頂點(diǎn)輸出結(jié)構(gòu)體  
  9.         struct vertexOutput {  
  10.             //聲明結(jié)構(gòu)體的成員pos,類(lèi)型為float類(lèi)型的4元向量,語(yǔ)義為SV_POSITION,col同理;  
  11.             float4 pos : SV_POSITION;  
  12.             float4 col : TEXCOORD0;  
  13.         };  
  14.         //頂點(diǎn)著色器入口函數(shù)vert,與pragma第一條聲明匹配,返回類(lèi)型為剛剛定義的頂點(diǎn)輸出結(jié)構(gòu)體  
  15.         vertexOutput vert(float4 vertexPos : POSITION)  
  16.           
  17.         {  
  18.             vertexOutput output; //這里不需要struct關(guān)鍵字  
  19.             //頂點(diǎn)著色器將數(shù)據(jù)寫(xiě)入輸出結(jié)構(gòu)體中。  
  20.             output.pos = mul(UNITY_MATRIX_MVP, vertexPos);  
  21.             //mul是頂點(diǎn)變換函數(shù),UNITY_MATRIX_MVP是unity的內(nèi)建矩陣,vertexPos是這個(gè)函數(shù)的形參  
  22.             //此行代碼的作用為將形參vertexPos(本例即Cube對(duì)象的頂點(diǎn)向量)按照unity的內(nèi)建矩陣進(jìn)行頂點(diǎn)變換  
  23.             output.col = vertexPos + float4(0.5, 0.5, 0.5, 0.0);  
  24.             //這行代碼是實(shí)現(xiàn)RGB立方體的關(guān)鍵  
  25.             //vertexPos的值域?yàn)轭}干所提到的x,y,z三元組各自減去0.5構(gòu)成的值域  
  26.             //但是這里接受的類(lèi)型為float4,可見(jiàn)第四元應(yīng)該是無(wú)意義的常數(shù)1  
  27.             //意思是vertexPos的值域?yàn)閧-0.5,-0.5,-0.5,1}至{0.5,0.5,0.5,1}  
  28.             //而對(duì)這個(gè)值域進(jìn)行+{0.5,0.5,0.5,0}的矢量相加才能得到RGB (A恒定為1)的所有顏色區(qū)間  
  29.               
  30.             return output;  
  31.             //將輸出結(jié)構(gòu)體返回,進(jìn)入下一個(gè)環(huán)節(jié)(簡(jiǎn)單理解為給片段著色器)  
  32.             //ps:更細(xì)致的環(huán)節(jié)有頂點(diǎn)變換-->頂點(diǎn)著色-->幾何元的構(gòu)建-->光柵化幾何元  
  33.             //-->片段著色-->略  
  34.         }  
  35.         //片段著色器入口函數(shù)frag,與pragma第二條聲明匹配,返回類(lèi)型為float4語(yǔ)義為COLOR,  
  36.         //這里除了顏色沒(méi)有其他的輸出,所以沒(méi)有輸出結(jié)構(gòu)體  
  37.         float4 frag(vertexOutput input) : COLOR   
  38.         //此函數(shù)的形參類(lèi)型為頂點(diǎn)著色器的輸出結(jié)構(gòu)體,沒(méi)有語(yǔ)義  
  39.         //原因就在于片段著色器位于頂點(diǎn)著色器的下一個(gè)環(huán)節(jié),參數(shù)按照這個(gè)順序傳遞  
  40.         {  
  41.             //由于col屬性已經(jīng)在頂點(diǎn)著色器中計(jì)算,直接返回進(jìn)入下一環(huán)節(jié)  
  42.             //下一環(huán)節(jié)是什么這里不探討了  
  43.             return input.col;  
  44.         }  
  45.         ENDCG  
  46.         }  
  47.     }  
  48.     //如果以上SubShader渲染失敗則回滾采用Diffuse  
  49.     FallBack "Diffuse"  
  50. }  


補(bǔ)充:

剛剛寫(xiě)掉了,為何vertexPos的值域?yàn)閧-0,5,-0.5,-0.5,1}至{0.5,0.5,0.5,1}而非{0,0,0,1}至{1,1,1,1}呢?

因?yàn)槲覀兊闹苯亲鴺?biāo)系原點(diǎn)沒(méi)有在頂點(diǎn)上而是在cube的幾何中心,故其值域?yàn)閧-0,5,-0.5,-0.5,1}至{0.5,0.5,0.5,1},over 


如果我的博客對(duì)您有幫助或者您有任何疑問(wèn),歡迎加入重慶u3d交流QQ群我會(huì)給您解答:68994667,也可以加群與我們一同交流技術(shù)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀(guān)點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多