Shader編程學習筆記(十)—— Cg語言入門2 - profile和基本數據類型


Cg入門二:profile和基本數據類型

  上一小結我們了解了Cg的輸入輸出,輸入使用“in”關鍵詞,輸出使用“out”關鍵詞,既是輸入也是輸出則使用“inout”關鍵詞;也了解了Cg基本的語義,頂點程序傳遞給片段程序的位置坐標使用“POSITION”語義,它不需要在片段程序中做特殊處理,圖形硬件會自動針對“POSITION”數據進行處理。

  本小結我們主要了解一下Cg的profile和基本數據類型。Cg作為一種類C的語言,它的基本數據類型也有float,32位浮點數,來使用一下float,接着上一小節的shader程序:

Shader "Lesson/vertex&fragment2"{
    SubShader{
        pass{
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            void vert(in float2 objPos:POSITION, out float4 col:COLOR, out float4 pos:POSITION){
                pos = float4(objPos,0,1);
                col = pos;
            }

            void frag(inout float4 col:COLOR){
                // col = float4(0,1,0,1);
                float r = 1;
                float g = 0;
                float b = 0;
                float a = 1;

                col = float4(r,g,b,a);
            }
            ENDCG
        }
    }
}
vertex&fragment

  float4也是Cg語言中的基本數據類型,它是一個四階向量,可以用四個float值組合成一個float4,可以了解它會形成一個紅色。

  在Cg當中除了“float”這個32位浮點數之外,還有一個16位的浮點數“half”,精度為“float”的一半。將當前shader程序中的float改為half,float4改為half4,在工程中可以得到跟原來一樣的結果。

  Cg還有一種基本類型為“fixed”,它是一種定點數,將程序中的float修改為fixed,float4修改fixed4也能得到相同的結果。

  針對float,了解一些Cg的數據類型。float可以組成二階向量float2,三階向量float3和四階向量float4,其他類型同理,如half、fixed等。其中需要注意的是,Cg向量最高的維度為四階。

  除了float、half、fixed這三個基本數據類型外,還有bool類型,表示真與假,有int類型,32位的整型等。

  接下來了解一下Cg的profile。一個Cg profile定義了一個“被特定圖形硬件或API所支持的Cg語言子集”,任意一種shader language都是基於可編程圖形硬件的(寄存器、指令集等),這也就意味着,不同的圖形硬件對應着不同的功能子集。這些可選的語言功能包括某些控制結構和標准庫函數。profile還定義了數據類型的精度,並且指定數據類型是否全局部或僅部分支持。profile按照功能可以划分為頂點profile和片段profile,而頂點profile和片段profile又基於OpenGL和DirectX的不同版本或擴展,划分為各種版本。從某種意義上而言,OpenGL和DirectX的發展歷程成就了Cg語言。

  以下是兩個鏈接,分別是關於Cg profile fp20和Cg language的描述。
  http://http.developer.nvidia.com/Cg/fp20.html
  http://http.developer.nvidia.com/Cg/Cg_language.html

  了解一下Cg profile fp20的描述,打開鏈接,可以看到fp20是一個OpenGL片段程序的profile,它支持硬件有GeForce3, GeForce4 Ti, Quadro DCC等。在頁面右面可以看到很多關於Cg profile的定義,它主要描述的就是有些硬件有特定的性能,不一定得完全地支持Cg的某些內容,在這種情況下profile就做了對硬件做了特性能力的描述。在fp20 profile中,尤其比較重要的就是“fixed”數據類型,相當於本地化的有符號的9位整型,並被標准化范圍為-1到+1。如果顏色值的分量都用fixed類型,那么每個顏色值分量都有256種,這個就是目前概念中的真彩色。因此在Unity中,fixed的精度已經足夠表示顏色值了。fp20中使用的各種語義和函數就不一一列舉了,要使用時可以查看一下文檔。

  打開第二個鏈接來了解一下Cg language。Cg最新版本已經到了3.1,Cg語言也是遵循Ansi C規范的語言,但它不同於C語言,Cg有bool類型,C語言沒有bool類型,C語言非零即是真,零即為假。Cg中數組為第一類類型,因為Cg不支持指針。第三個方面Cg函數參數使用值傳遞,使用“out”、“inout”、“in”等進行輸入輸出。

  語言profile實際上就是語言的一種特性,在不同的處理方法中會擁有不同的特性。在特殊情況下,語言profile就是關於一個使用for或者while循環的限制,意思就是有些情況下它不支持for或者while循環,有些profile僅僅loop循環。Cg不支持goto、switch、case、default等保留關鍵字;也不支持指針和指針相關的運算能力;Cg支持數組,但是有尺寸和維度的限制;Cg沒有枚舉和聯合;Cg在結構體當中沒有位成員;Cg中所有的整型都是有符號,沒有signed關鍵字。
  Cg有綁定語義,比如POSITON、COLOR0等;Cg內建的有swizzle操作;對於一個值來說,swizzle操作可以允許進行拼湊一個向量或矩陣;swizzle操作可以去訪問所有的分量;數據有不同的有限的類型,主要的類型有float、half、fixed,片段profile必須支持這三種數據類型,但是可以選擇使用half或fixed去實現float,頂點profile要求實現half和float,但是可以選擇實現halp和float,頂點profile可以忽略支持fixed,Cg允許profile去忽略支持運行時的int,實際上會把int轉換成float;Cg中的操作很多都是對於向量的操作,可以對向量的基本元素進行操作,Cg中也有?問號表達式,沒有全局的非靜態變量;Cg有新的sampler*集合;函數擁有默認值最為參數;函數和它們的操作可以被重載;變量可以定義在任何地方,但要在使用之前定義就行。還有其他一些不同於C語言的地方,詳細內容可以查看該文檔。
  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM