什麼是CgFX?

導讀:
  CgFX是一種強大的通用的着色器規範和交換格式。CgFX運行時,比如Cg,支持OpenGL,同樣也支持DirectX8和DirectX9。對於實時圖像藝術家和開發者來說,這種格式提供了幾個好處:
  1、交叉API,交叉平臺的兼容性和便攜性
  2、多技術(technique)的封裝,使細節層、功能性或性能退居其次。
  3、支持Cg,彙編語言以及固定功能的着色器
  4、文件中內嵌可編輯的參數和GUI描述
  5、多遍着色器
  6、渲染狀態和紋理狀態規範
  在實際情況下,通過將渲染狀態,紋理狀態和渲染次數(passes)與Cg頂點程序(Cg vertex programs)和Cg片段程序(Cg fragment programs)包裝在一起,開發人員可以在CgFX文件中描述一個完整的渲染效果。儘管一個單獨的Cg程序可以包含一個效果必須的核心渲染語法,但只有將這些額外的環境信息合併在一起才使着色器變得完整和自包含。對於藝術家很友好的GUI描述使得CgFX文件與被藝術家和程序員使用的產品流程很好的集成在一起。
  CgFX文件格式簡介
  Cg語言可以讓你輕鬆的表示出一個物體應該被怎麼渲染。雖然現在的Cg範本只是描述了一個單獨渲染過程,很多渲染技術,像shadow volume或shadow map,需要多於一次的渲染過程。
  許多應用程序需要面向很廣範圍的圖形硬件功能和性能。於是,在一個比較舊的硬件上運行的着色器的版本和對遠處物體協助性能的着色器的版本是重要的。
  每個Cg程序一般來說都是面向一個profile,並不能退到其它profile中,或者彙編語言着色器,或者是固定功能的頂點或片段處理過程。
  用Cg程序來產生圖像,一些關於它們的環境的信息是必須的。例如,一些程序可能需要alpha混合被打開而深度寫被關閉。其他的程序可能爲了正常工作需要特定的貼圖格式。這些信息在標準的Cg源文件中並沒有提供。
  CgFX通過一個基於文本的文件,來包含Cg,彙編,固定功能着色器以及爲了渲染一個效果需要的渲染狀態和和環境信息。這個文本文件的語法與Microsoft .fx 2.0格式(Direct 9.0 效果格式)很類似。
  CgFX在一個單獨文本文件中包含爲渲染效果所需要的所有東西。這個特點使得第三方工具或其它3D應用程序可以像它自己的文件一樣來使用CgFX,除了幾何和紋理數據之外不需要額外的擴展信息。在這種情況下,CgFX就像一個交換格式。CgFX使得在着色器可以在沒有相關C++代碼的情況下被交換,這些C++代碼在一般情況下都是爲了使一個Cg程序與OpenGL和Direct3D一起進行工作的。
  
  技巧(Techniques)
  每個CgFX文件通常表示一個着色器作者極力完成的特定的效果,例如凸凹貼圖,環境映射或各向異性燈光等。CgFX包含一個或多個技巧,每一個都描述了完成一個效果的方式。每個技巧都面下一個特定層次的GPU功能,因此一個CgFX文件可以包含一個針對帶有強大片段編程能力的高級GPU的技巧,同時另一個技巧是爲支持固定功能紋理混合的比較舊的圖形硬件準備的。CgFX也可以用於功能性,細節層和性能退化。例如:
  effect myEffectName
  {
  technique PixelShaderVersion
  {...};
  technique FixedFuntionVersion
  {...};
  technique LowDetailVersion
  {...};
  };
  應用程序可以對一個效果中那麼技巧正在被顯示出來進行查詢,也可以在運行時選擇一個合適的技巧,基於無論如何都適當的標準。
  輪迴(Passes)
  每個技巧都包含一個或多個輪迴(passes)。每個輪迴表示一系列的渲染狀態和着色器被應用到一個技巧的一個渲染輪迴上。例如,第一個輪迴可能僅僅是準備深度,只有這樣才能使接下來的輪迴得以應用一個添加的alpha混合技巧,而不必進行多邊形排序。
  每個輪迴可能包含一個頂點程序,一個片段程序,或者兩者,而且每一個輪迴都可以使用固定功能頂點或像素處理或二者。例如,第一個輪迴可以使用固定功能像素處理來輸出環境顏色。下一個輪迴可以使用ps_1_1片段程序和第三個輪迴可以使用ps_2_0片段程序。在實際中,在一個技巧中的所有輪迴通常都使用固定功能處理或都使用Cg或彙編程序。這個方法防止深度衝突,也就是說防止固定功能和一些GPU中的可編程部分在處理同樣數據的時候使用不同的方式。
  渲染狀態
  每個輪迴也可以包含渲染狀態,例如alpha混合,深度寫,以及紋理過濾模式。
  pass firstPass
  {
  DepthWriteEnable = true;
  AlphaBlendEnable = false;
  MinFilter[0] = Linear;
  MagFilter[0] = Linear;
  MaxFilter[0] = Linear;
  // Pixel shader written in assembly
  PixelShader = asm
  {
  ps.1.1
  tex t0;
  mov r0, t0;
  };
  };
  注意到CgFX額外嵌入了Cg程序,使你可以使用asm關鍵字來編碼彙編語言頂點和片段程序。
  變量和語義
  最後,CgFX文件包含了全局和每個技巧中的Cg風格的變量。這些變量通常作爲統一的參數傳遞給Cg函數,或者作爲一個爲渲染或紋理狀態設置準備的值。例如,一個bool變量可以被作爲統一參數給一個Cg函數來使用,或者作爲一個值是能或禁止alpha混合渲染狀態:
  bool AlphaBlending = false;
  float bumpHeight = 0.5f;
  這些變量可以包含一個用戶定義的語義,可以幫助應用程序提供一個正確的數據給着色器,而不必一定進行變量名的解釋:
  float4x4 myViewMatrix : ViewMatrix;
  texture2D someTexture : DiffuseMap;
  接下來,一個允許使用CgFX的應用程序就可以查詢這個CgFX文件的變量和它們的語義。
  註釋(Annotations)
  另外,每個變量都可以有一個可選的註釋。註釋是一個每變量擁有的結構,包含了效果作者與一個CgFX應用程序,例如一個藝術家工具,進行溝通的數據。這個應用程序允許對變量進行基於GUI方式的操作,這種操作方式是對於這些註釋比較合適的操作方式。
  一個註釋可以被用於描述用戶界面元素,從而操作統一的變量,或者用來描述在一次渲染輪迴中期待的渲染目標的類型。
  float bumpHeight
  <
string gui = "slider";
float uimin = 0.0f;
float uimax = 1.0f;
float uistep = 0.1f;
>  string gui = "slider";
  float uimin = 0.0f;
  float uimax = 1.0f;
  float uistep = 0.1f;
  >= 0.5f;
  註釋被放置在可選的語義之後,在變量初始化之前。應用程序可以查詢註釋,並使用它們在那些使用CgFX的工具中暴露特定的參數給藝術家,例如Discreet的3ds max 5或Alias|Wavefront的Maya 4.5
  Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1606370

本文轉自
http://blog.csdn.net/willoj/archive/2007/05/12/1606370.aspx
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章