跳轉到內容

Cg 程式設計/簡介

來自華夏公益教科書,開放的書籍,開放的世界

關於 Cg

[編輯 | 編輯原始碼]

Nvidia 的程式語言 Cg (C for graphics) 是即時渲染中常用的幾種著色語言之一(其他例子包括 Direct3D 的 HLSL 和 OpenGL 的 GLSL)。這些著色語言用於程式設計著色器(即或多或少的小程式),這些著色器在 GPU(圖形處理單元)上執行,即計算機圖形系統的處理器 - 與計算機的 CPU(中央處理單元)相對。

GPU 是大規模並行處理器,非常強大。當今大多數遊戲和其他互動式圖形應用程式中的即時圖形都離不開 GPU。但是,要充分利用 GPU 的效能,有必要直接對它們進行程式設計。這意味著必須編寫可以由 GPU 執行的小程式(即著色器)。編寫這些著色器的程式語言是著色語言。Cg 就是其中之一。實際上,它是首批針對 GPU 的高階著色語言之一,已在多個 3D 圖形 API(應用程式程式設計介面)中實現,最重要的是 OpenGL 和 Direct3D。如今,它受歡迎的主要原因是它與 HLSL 的相似性,HLSL 是 Microsoft 的 Direct3D 的著色語言。

關於學習 Cg

[編輯 | 編輯原始碼]

學習 Cg 有很多好處

  • 它可以深入瞭解現代即時圖形,即 GPU 的工作方式。大多數高效能即時圖形應用程式(例如遊戲)都以某種方式依賴於 GPU 上的計算,即著色器程式。
  • 它使你能夠編寫 Cg 和 HLSL 著色器(從而實現高效的圖形應用程式)並理解其他著色語言(如 GLSL),因為它們的差異並不太大。
  • 它還能使你更好地理解和使用高階圖形開發工具,因為它們通常也基於著色器。
  • 它可能會幫助你找到工作,因為著色器程式設計技能對於遊戲程式設計師、圖形開發人員、技術美術師等來說是一個優勢。

Cg 不是一種特別複雜的程式語言,用 Cg 編寫的典型程式(即著色器)相當小。然而,學習 Cg 由於以下幾個原因可能具有挑戰性

  • Cg 只是其他圖形 API(例如 Nvidia 的 Cg Toolkit)的一部分;因此,Cg 通常與相當大的圖形 API 一起學習,而圖形 API 通常是為圖形應用程式設定 Cg 程式碼和所需圖形資料(例如網格和影像)所必需的。
  • Cg 程式設計需要一些關於 GPU 實現的可程式設計圖形管道的知識。
  • 大多數 Cg 著色器需要矩陣和向量運算,這需要對向量和矩陣運算有一些瞭解。

因此,如果你喜歡圖形,但討厭程式設計和數學,那麼 Cg 可能非常具有挑戰性。

關於此華夏公益教科書

[編輯 | 編輯原始碼]

這本華夏公益教科書的初衷是為了那些不喜歡程式設計或數學的學生。編寫此書的基本動機是,學生在進行特定專案時,學習程式設計環境、程式語言和 API 的積極性要高得多。此類專案通常在特定平臺上開發,因此本書的方法是在特定平臺或框架中展示 Cg,例如遊戲引擎 Unity、Nvidia 的 Cg Toolkit 等。(截至目前,只寫了關於 Unity 中頂點著色器和片段著色器的一部分。)

這本華夏公益教科書試圖展示在特定平臺上使用的 Cg 的特定版本。當然,這些 Cg 版本之間存在很大重疊,但差異往往很細微,可能會導致很多問題。實際上,要求學生弄清楚如何將 Cg 著色器的教科書示例調整到特定平臺的要求,並不是一個好主意。相反,針對每個平臺提供特定示例。

這本華夏公益教科書中關於 Unity 中的 Cg、Unity 的表面著色器、Nvidia 的 Cg Toolkit 等部分是相互獨立的。但是,有一定的進展

  • Unity 幾乎不需要任何設定程式碼;匯入網格和紋理通常只需拖放和一些滑鼠點選。
  • Nvidia 的 Cg Toolkit 需要幾個庫、一個編譯器和一個連結器。它還需要相當多的設定程式碼。

因此,即使你沒有計劃在 Unity 中使用 Cg,從 Unity 中開始編寫 Cg 也是一個好主意,這樣可以讓你快速學習基礎知識,而無需擔心設定程式碼和匯入網格和影像的煩人細節。

這本華夏公益教科書的每個部分都組織成一系列教程,其中包含產生特定效果的有效示例。這些示例決定了 Cg 語法的哪些部分將被討論。對 Cg 語法的全面描述在 Nvidia 的 Cg 語言規範 中提供。更易於理解的文件在 Nvidia 的 Cg 教程 中提供。

Cg 專為 GPU 圖形管道而設計,如 OpenGL API 和 Direct3D API 中所實現的那樣。以逐階段的方式展示此圖形管道非常誘人;但是,這種逐階段的方法往往使得更難理解管道的所有部分如何以各種組合協同工作以產生特定效果。因此,對每個示例的討論也決定了圖形管道的哪些部分將被討論。儘管如此,仍然存在與平臺無關的部分,以概述圖形管道、概述傳統的矩陣變換、概述 Cg 特定的向量和矩陣運算、討論如何將矩陣變換應用於點、向量和法線,以及其他一些一般性主題。

這本華夏公益教科書不包含的內容

[編輯 | 編輯原始碼]

顯然,這本華夏公益教科書不涉及 GLSL 或任何其他著色語言,只涉及 Cg 和 HLSL。(有關 GLSL 簡介,請參閱華夏公益教科書 GLSL 程式設計。)此外,這本華夏公益教科書不涉及針對 GLSL 程式設計師的 Cg。它面向所有人(包括 GLSL 程式設計師)。此外,這本華夏公益教科書不涉及編寫高效的 Cg 著色器。它旨在使讀者能夠編寫有效的著色器。最佳化會增加一層額外的任務(引入適當的近似值、選擇適當的精度、決定是否使用查詢表、透過巧妙的算術表示式避免分支等),這些都超出了 Cg 簡介的範圍。當然,現實情況是不同的;但是,你並不會透過參加一級方程式比賽來學習開車。

關於對本書的貢獻

[編輯 | 編輯原始碼]

當然歡迎所有人的貢獻。在新增新的示例時,應確保沒有侵犯版權,並且所有概念都已在示例本身或同一部分的先前示例中進行了解釋。

除非另有說明,否則這本華夏公益教科書中的所有示例原始碼均歸屬公共領域。因此,你可以隨意修改它並在你喜歡的任何許可下重新授權它。原始碼應嵌入在 <syntaxhighlight lang="..."> ... </syntaxhighlight> 中,以便使用語法突出顯示。

同一部分的其他維基頁面應透過模板進行引用,例如 {{{{BOOKTEMPLATE}}/Unity SectionRef|X}},該模板應以維基頁面的名稱(例如 X)作為第一個引數。輸出應類似於 “X”部分

在引用圖形時,請嘗試使用對任何圖形放置都有效的引用(例如,“相應的圖形”),或者使用模板為線上版本和印刷版生成不同的引用(例如,{{Hide in print|左側的}圖形{{Only in print|下方}})。忽略 PDF 版本的問題,因為線上版本是迄今為止最重要的版本,並且許多讀者對書籍版本抱有很高的期望。

為了便於編輯圖表,鼓勵使用表格。例如,使用以下內容

{|cellpadding="5px" cellspacing="0" style="text-align:center; vertical-align:center;"
|-
|colspan="3" style="width:30%; background:#e0e0d0;"|'''first stage or input data'''
|style="width:1%; font-size:200%;" |←
|style="width:69%; background:#e0e0d0;"|additional input (optional, 1st style)
|-
|style="width:14%;"|
|style="width:1%; text-align:right; padding:5px 0 5px 0; font-size:200%;" |↓
|colspan="3" style="width:85%; text-align:left;"|communicated data or operation
|-
|colspan="3" style="width:30%; background:#e0e0d0;"|'''second stage or processed data'''
|style="width:1%;font-size:200%;" |←
|style="width:69%; text-align:left;"|additional input (optional, 2nd style)
|-
|style="width:14%;"|
|style="width:1%; text-align:right; padding:5px 0 5px 0; font-size:200%;" |↓
|colspan="3" style="width:85%; text-align:left; "|communicated data or operation
|-
|colspan="3" style="width:30%; background:#e0e0d0;"|'''third stage or processed data'''
|style="width:1%;font-size:200%;" |
|style="width:69%; text-align:left;"|description of stage or data (optional)
|-
|style="width:14%;"|
|style="width:1%; text-align:right; padding:5px 0 5px 0; font-size:200%;" |↓
|colspan="3" style="width:85%; text-align:left; "|communicated data or operation
|-
|colspan="3" style="width:30%; background:#e0e0d0;"|'''fourth stage or processed data'''
|style="width:1%;font-size:200%; " |→
|style="width:69%; background:#e0e0d0; "|additional output (optional, 1st style)
|-
|style="width:14%;"|
|style="width:1%; text-align:right; padding:5px 0 5px 0; font-size:200%;" |↓
|colspan="3" style="width:85%; text-align:left; "|communicated data or operation
|-
|colspan="3" style="width:30%; background:#e0e0d0;"|'''final stage or output data'''
|style="width:1%; font-size:200%;" |→
|style="width:69%; text-align:left; "|additional output (optional, 2nd style)
|}

得到以下內容

第一階段或輸入資料 附加輸入(可選,第一種風格)
通訊資料或操作
第二階段或處理後的資料 附加輸入(可選,第二種風格)
通訊資料或操作
第三階段或處理後的資料 階段或資料的描述(可選)
通訊資料或操作
第四階段或處理後的資料 附加輸出(可選,第一種風格)
通訊資料或操作
最終階段或輸出資料 附加輸出(可選,第二種風格)

< Cg 程式設計

除非另有說明,否則本頁面上的所有示例原始碼均歸屬公共領域。
華夏公益教科書