解讀Unity中的CG編寫(xiě)Shader系列1——初識(shí)CG

[解讀Unity中的CG編寫(xiě)Shader系列1——初識(shí)CG]
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顏色的立方體如圖:

具體代碼及其含義如下:

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

補(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Unity shader 官網(wǎng)文檔全方位學(xué)習(xí)(一)What?? Shader,看起來(lái)好高級(jí)的樣子,是的,這是Uni...
    狼之獨(dú)步閱讀 6,286評(píng)論 0 12
  • <轉(zhuǎn)>我也忘了轉(zhuǎn)自哪里,抱歉,感謝原作者 什么是Shader Shader(著色器)是一段能夠針對(duì)3D對(duì)象進(jìn)行操作...
    星易乾川閱讀 5,858評(píng)論 1 16
  • 轉(zhuǎn)載注明出處:點(diǎn)擊打開(kāi)鏈接 Shader(著色器)是一段能夠針對(duì)3D對(duì)象進(jìn)行操作、并被GPU所執(zhí)行的程序。Shad...
    游戲開(kāi)發(fā)小Y閱讀 3,685評(píng)論 0 4
  • 文章轉(zhuǎn)自:https://onevcat.com/2013/07/shader-tutorial-1/ Shade...
    Lamzz閱讀 3,827評(píng)論 1 7
  • 因?yàn)閷?duì)自己的不自信,所以開(kāi)始在啟動(dòng)前,讀了好多遍依然忘記流程! 從唱誦開(kāi)始,找到共振的感覺(jué),專(zhuān)注于當(dāng)下,...
    湯立娟閱讀 366評(píng)論 0 1

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