Cg語言(C for Graphics)是為GPU編程設計的高級著色器語言,由NVIDIA公司開發。Cg極力保留C語言的大部分語義,並讓開發者從硬件細節中解脫出來,Cg同時也有一個高級語言的其他好處,如代碼的易重用性,可讀性得到提高,編譯器代碼優化。

Cg語言主要參照ANSI C建模,但也從C++Java以及早期的繪製語言如RenderMan and the Stanford shading language中吸取了一些思想。這些使得很容易寫程序然後由編譯器進行優化,提高了可讀性。而且Cg的設計考慮了GPU的體系結構,如可編程多處理器單元(頂點處理器,像素處理器,外加不可編程單元)。這些部分和應用都是通過數據流連接起來。Cg語言允許分別為頂點和像素寫程序。Cg API引入了profiles的概念以處理頂點和像素編程所缺乏的通用性。一個Cg profile就定義了一套整個Cg語言的子集以適應不同的硬件平台和API。Cg程序可以根據運行時的需要或者事先編譯成GPU匯編代碼。這樣可以很容易地將一個Cg像素程序和手寫的頂點程序結合起來,或者甚至採用不可編程的OpenGL或者DirectX頂點流水線,反之亦然。

由於Nvidia和微軟合作緊密,Cg語言和HLSL的共通之處很多。[1]在早期的官方文檔里,這兩者被解釋成貼了兩個牌的同一門語言。[2]

細節

編輯

資料型別

編輯

Cg有6種數據型別(data types),跟C語言相當類似,有一些是為GPU特別定義的,型別如下:

  • float - 32位元浮點數
  • half - 16位元浮點數
  • int - 32位元整數
  • fixed - 12位元定點數
  • bool - 布爾值
  • sampler* - 代表紋理物件(texture object)

範例

編輯
  • A sample Cg vertex shader
 // 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;
 }

參照

編輯

外部連結

編輯
  1. ^ Fusion Industries :: Cg and HLSL FAQ ::. 2012-08-24 [2020-04-25]. (原始內容存檔於2012-08-24). 
  2. ^ The Cg Tutorial - Chapter 1. Introduction. developer.download.nvidia.cn. [2020-04-25]. (原始內容存檔於2022-04-15).