概述
頂點渲染可在功能上取代傳統的變換與光照階段,它位於鑲嵌階段之後,剔除與裁剪階段之前。鑲嵌階段結束後,便將一個頂點數據傳遞給頂點渲染器,頂點可能包含位置、紋理坐標、頂點顏色、法線等數據。頂點渲染器不能創建或刪除頂點,它處理結束後至少要輸出頂點中的位置數據。
背景
隨著顯示卡的開發,3D圖形程式在某些方面變得越發複雜。為了簡化編程,一些新的特性被加入到顯示卡眾,包括用頂點著色程式修飾渲染管線。起先,定點渲染程式是用彙編語言開發的,雖然彙編語言給予編程者很好的靈活性,但是很難用。需要一種用於GPU開發的高級語言,於是Cg應運而生。比起彙編來Cg易學,易編,易讀,易懂。另外Cg適合更廣泛的硬體和系統平台。Cg的編譯器可以最佳化代碼並且自動處理低級任務,這在彙編是不可能的。
細節
數據類型
Cg 有六種基本數據類型,一些來自於C語言。float(32位浮點),half(16位浮點),int(32位整型),fixed(12位浮點),bool(布林型),sampler(代表一個材質)。
Cg還有vector(矢量)和matrix(矩陣)數值類型由基本類型二來,比如float3和float4x4。這種數據類型在處理3D圖形程式中常用到。Cg還有struct(結構)和array(數組)類型,和C的用法一樣。
操作符
Cg 支持算術操作符和邏輯操作符,和C中用法相同。
函式
Cg 也有if/else,while和for。另外定義函式和C語言也有相似之處。
標準Cg庫
和C相同,Cg有一些GPU編程常用到的函式。有些和C相同,比如數學函式,像abs和sin。另一些只在GPU程式中才用到,比如texture mapping函式tex 1D和tex 2D。
Cg實時庫
Cg 程式只是頂點和象素著色程式,它需要其它一些程式來支持以便處理渲染程式的其它部分。Cg可以用兩個API: OpenGL和DirectX。每一種都有其各自的Cg函式作為和Cg程式的接口,比如設定目前的Cg程式,傳遞參數之類的任務。除此之外,Cg的API還有編譯和執行著色程式的能力。但是,它需要著色程式的原始碼為text檔案,以使API可讀。這也被認為是一大缺點。
例子
// input vertex
struct VertIn {
float4 pos : POSITION;
float4 color : COLOR0;
};
// output vertex
struct VertOut {
float4 pos : POSITION;
float4 color : COLOR0;
};
// vertex shader main entry
VertOut main(VertIn IN, uniform float4x4 modelViewProj) {
VertOut OUT;
OUT.pos = mul(modelViewProj, IN.pos); // calculate output coords
OUT.color = IN.color; // copy input color to output
OUT.color.z = 1.0f; // blue component of color = 1.0f
return OUT;
}
與像素渲染區別
頂點渲染&象素渲染
頂點渲染程式是一些小程式,描述如何將某個過程套用於場景中的多邊形頂點。這些程式最多有128個指令,非常適用於模擬可變形的對象,如布、火、水和人臉等。開發人員也可以在場景中創造新的燈光效果。
像素渲染程式是一些小應用程式,描述幀緩衝中要套用到像素上的操作。像素渲染程式與頂點渲染程式的功能類似,但前者執行處理色彩和材質的操作,而不是處理幾何體的操作。