圖形著色器——理論與實踐(第2版)

圖形著色器——理論與實踐(第2版)

《圖形著色器——理論與實踐(第2版)》是2013年出版的圖書,作者是Mike Bailey Steve Cunningham 劉鵬。

基本信息

圖書信息

作者:Mike Bailey Steve Cunningham 劉鵬圖書詳細信息:

ISBN:9787302315995

定價:79元

印次:1-1

裝幀:平裝

印刷日期:2013-3-26

圖書簡介

本書詳細闡述了與著色器程式設計相關的高效解決方案及相應的數據結構和算法,主要包括固定功能管線、OpenGL著色

器的發展、著色器基本概念、使用glman、GLSL著色器語言、光照、頂點著色器、片元著色器和表面外觀、片元著色器中的表

面紋理、噪聲、基於著色器的圖像處理、幾何著色器的概念和示例、細分著色器、GLSL API、基於著色器的科學可視化計算以

及著色器套用等內容。此外,本書還提供了相應的算法、代碼以及偽代碼,以幫助讀者進一步理解相關方案的實現過程。

本書適合作為高等院校計算機及相關專業的教材和教學參考書,也可作為相關開發人員的自學教材和參考手冊。

圖書前言

下面的漫畫作品是否喚起了你的某些回憶?

你的腦海中是否縈繞著許多偉大、創新的理念卻苦於無法實現?那么,你就是我們正在尋找的人,本書專門為你而打造。

歡迎閱讀《圖形著色器 ——理論與實踐(第 2版)》。顧名思義,本書將討論著色器理論以及實踐過程,並輔以大量的實現代碼。為了方便讀者閱讀,本書採用全彩印刷,亦即多數示例均配以效果圖像,以便於讀者深入理解相關概念。因此,放慢你的腳步,靜下心來開始閱讀,並從中獲得極大的享受吧!

與第 1版相比,本書增加了 100多幅圖像。除此之外,本書還對以下內容進行了改版:

(1)本書遵循 OpenGL最新規範,即 OpenGL 4.x和GLSL 4.x0。

(2)全部示例代碼根據最新 GLSL語言標準加以編寫。

(3)新增了與細分著色器相關的部分章節(及其示例代碼)。

(4)各章增加了示例和練習。

(5)修改了大量的示意圖,並將 GLSL功能級別調整至 4.x0。

(6)OpenGL架構評審委員會( ARB)棄用了 OpenGL中的某些功能,但尚未將其完全去除。本書將對此加以闡述且對應代碼集中體現了這一重要變化。另外,本書全部示例代碼均遵循這一理念。在該策略的引導下,讀者還可向 OpenGL ES 2.0實現平穩過渡。

(7)本書附錄添加了與著色器對應的 C++類,進而簡化 OpenGL著色器應用程式的編寫過程,並對上述棄用策略提供某種支持。

可程式圖形著色器經歷了一段有趣的發展歷程。在以往的歲月中,計算機圖形內容均需要通過編程實現,相信某些讀者對此仍有清晰的記憶。鑒於圖像創建過程中存在可程式選項,這也意味著 “可程式 ”往往包含某種貶義成分 ——事實並非如此。若期望生成某種圖像結果,除了親自動手編寫程式之外,別無他法。

——

··

對於大多數圖形實踐者而言,計算機圖形 API可在一定程度上改變這一現狀。優秀的 API使得程式設計人員可輕鬆並出色地完成圖形程式設計任務,期間, API功能項可掌控大部分圖形處理操作。然而,程式設計人員也為此付出了一定的代價,即放棄 API無法處理的某些功能項,如表面著色技術。當時( 20世紀 90年代),大多數 API僅支持簡單的平滑光照表面操作。

然而,無論是計算機圖形開發社區還是高級圖形程式設計師,對此都難以感到滿意,這種滿意度的欠缺分別來自軟體和硬體方面。隨著圖形處理器的不斷發展,基於特定功能的程式設計逐漸打破固定功能圖形 API這一桎梏,此類功能項逐漸形成自己的標準,包括隸屬於 OpenGL標準的 GLSL著色器語言。可程式圖形著色器已成為計算機圖形學的關鍵特徵,其中,程式可載入圖形處理器,並執行早期固定功能管線標準之外的相關操作。

在教學以及學習過程中,計算機圖形學也可採用並行方式實現。初學者通常會通過相關標準(如 OpenGL)了解計算機圖形學。當前,初學者還應理解可程式著色器所飾演的角色,並嘗試編寫和使用著色器。值得注意的是,基於著色器的程式設計往往會使我們重返昔日時光,並重新審視某些古老的圖形學問題(例如,某些問題出現於 20世紀 70年代)。時至今日,讀者可在 OpenGL的全力支持下實現頂點和獨立像素操作,這種體驗往往來自於遊戲、科學可視化計算以及通用圖形計算。

本書可用於傳統的教學課程中,其內容自成一體,向學生全面闡述了計算機圖形學著色器程式設計。同時,本書還可作為基於固定功能 API(尤其是 OpenGL)的輔助讀物。本書從整體上系統地講述了著色器程式設計,並重點講解了 GLSL著色器語言。除此之外,本書還介紹了靈活、易用的編程工具 glman,以幫助讀者在應用程式外部開發、調試著色器。

本書可作為本科、研究生層次計算機圖形學課程的高級教程,並假設讀者已了解 OpenGL以及相關圖形學知識。本書重點討論 GLSL語言並統一使用 OpenGL術語,對應內容同樣適用於其他圖形 API,如 Direct3D。鑒於著色器程式設計揭示了 API所隱藏的事實真相,因而讀者需要進一步了解某些基礎理論,包括幾何、光照以及著色等內容,相信讀者會加深對此類問題的理解。同時,著色器程式設計還會幫助讀者剖析 API的工作原理,因而有必要對上述內容加以回顧。

本書採用 GLSL作為示例著色器,其原因在於, OpenGL跨平台 API具有較為廣泛的套用範圍且兼具高效性。鑒於著色器理念之間的相似性,相關概念同樣適用於其他著色器 API,如 Cg和HLSL。本書首先通過著色器程式的基本角色和功能介紹固定功能圖形管線,隨後將在 glman和應用程式環境下編寫頂點著色器、片元著色器和幾何著色器。

儘管按照擴展圖形管線中的套用順序考察著色器更符合邏輯性,即頂點著色器 —幾何著色器 —片元著色器,但本書的處理方案則稍顯不同,即按照使用頻率這一順序考察著色器(片元著色器 —頂點著色器 —幾何著色器)。需要說明的是,該順序無法實現正確的工作流,其原因在於,片元著色器所接收的數據源自頂點著色器,因而頂點著色器位於初始位置,隨後依次為片元著色器、幾何著色器和細分著色器。

本書整體內容脈絡鮮明,第 1章涵蓋了後續章節所需要的背景知識,即基於固定功能的 OpenGL圖形管線。第 2章講述了 OpenGL的演化歷史。第 3章講解了頂點著色器、片元著色器和細分著色器的基本原理,以及基於 GLSL著色器語言的多個示例。第 4章以使用手冊方式引入了 glman軟體。第 5章討論了 GLSL著色器語言,並針對 C語言比較了兩者間的相似性和差異性。

第6~8章涉及頂點著色器和片元著色器等概念。其中,第 6章闡述著色器的視點光照,並引入了

··

ADS(環境光、漫反射光和鏡面光)光照函式,此類光照環境將在後續章節中多次提及。由於頂點著色器需要計算各頂點的光照,片元著色器負責計算各像素的光照,因而光照可視為頂點著色器和片元著色器的基礎內容。第 7章將重點探討頂點著色器,對應內容主要集中於輸入數據、輸出數據以及頂點幾何對象的調整方式。第 8章將討論片元著色器,包括輸入數據、輸出數據以及固定功能片元操作的替換方式。

第9~11章將分析片元著色器的特定功能項。第 9章將描述片元著色器與紋理貼圖之間的處理方式,包括凹凸貼圖、立方體貼圖以及場景的紋理渲染。第 10章將闡述噪聲函式及其在紋理和著色器中所飾演的角色。除此之外,第 10章還介紹了 noisegraph工具,以使讀者可對 1D和2D噪聲函式屬性進行調試。第 11章則根據片元著色器工具講述 2D圖像(紋理)的操控方式。

第12章講述了幾何著色器,包括幾何著色器與頂點著色器和片元著色器之間的關係,以及幾何著色器自身的功能項。本章通過多個示例強調幾何著色器針對幾何模型的擴展能力,以及細節級別的處理能力。第 13章介紹了細分著色器,著重說明該類型著色器與幾何著色器之間的相似性以及重大改進。

第14~16章集中討論應用程式中的圖形著色器。第 14章定義了 GLSL API,讀者可在應用程式中編譯、連結並使用著色器。另外,本章還分析了著色器程式的數據和圖形狀態信息的傳遞方式,並使用 C++類封裝著色器程式的整合操作。第 15章闡述了著色器在可視化應用程式中的套用方式,並演示了多個可視化操作示例。第 16章則考察了基於圖形著色器的多個有趣示例。

附錄部分顯示了 C++類的套用方案,以方便讀者編寫 OpenGL應用程式並處理某些 API棄用問題。

本書多數內容均較為直觀,部分內容則包含一定的技巧性,因而應引起讀者的足夠重視。本書中的數學知識源自 Nicholas Bourbaki所著教材,並採用符號加以標識,進而強調該問題的重要性。

由於著色器函式仍處於不斷發展中,因而新鮮事物以及對應處理方案層出不窮。相應地,本書採用

符號加以標識,希望讀者對此有充分的認識。

通過本書的閱讀,讀者可進一步提升圖形編程能力,並盡享圖形編程的無限樂趣。 OpenGL前進的步伐從未停止,不久的將來,著色器或許是幾何對象以及渲染操作的唯一處理方式,我們有理由相信,讀者將會再次認識到本書的價值所在。

圖書目錄

第1章固定功能管線 1

傳統的視見方案 1頂點操作 1管線的片元處理 3圖形管線中的狀態 4傳統視見機制的實現方案 5頂點處理操作 5渲染處理操作 6固定管線中的齊次坐標 9頂點數組 10本章小結 13本章練習 14

第2章 OpenGL著色器的發展 16

著色器發展史 17 OpenGL著色器發展史 19 OpenGL 2.0/GLSL 1.10 19 OpenGL 3.x/GLSL 3.30 19 OpenGL 4.0/GLSL 4.00 20 OpenGL 4.x/GLSL 4.x0 21內部原因 21 OpenGL ES 22處理不同版本 22本書方案 22變數名命名規則 23本章練習 23

第3章著色器基本概念 24

圖形管線中的著色器 24頂點著色器 26片元著色器 29細分著色器 31幾何著色器 34

GLSL著色器語言 35應用程式與著色器之間的數據傳遞 38在應用程式中定義 attribute變數 38在應用程式中定義 uniform變數 40 GLSL新版本之間的轉換方式 42本章練習 44

第4章 glman的使用 45

使用 glman 46載入 GLIB檔案 47編輯 GLIB檔案和著色器檔案 47生成 GLIB場景 47視窗和視見操作 47轉換操作 48定義幾何對象 48定義紋理 50定義著色器名 50其他命令 51定義 uniform變數 51 GLIB檔案示例 53紋理和噪聲 54使用紋理 55使用噪聲紋理 55 glman界面視窗功能 56生成並顯示場景的硬拷貝 56全局場景轉換 57眼睛轉換 57對象拾取和轉換 57紋理轉換 58顯示幀速率 58其他功能項 59本章練習 59

第5章 GLSL著色器語言 61

著色器語言的成因 61圖形卡功能項 62通用 GLSL語言 63共享命名空間 64函式擴展和操作符功能項 64

··

新增函式 64新增變數類型 65新增函式參數類型 65具體實現 65忽略的語言功能項 66新增矩陣和向量類型 66名稱集 67向量構造函式 67矩陣和向量擴展函式 68矩陣和向量的擴展操作 70新增函式 71混合操作 75新增函式參數類型 75 const變數 76兼容模式 76定義兼容模式 76 OpenGL 2.1內建數據類型 77綜述 81本章練習 81

第6章光照 82

ADS光照模型 82 ADS光照模型函式 83光源類型 85固定光源 85有向光源 86聚光燈 86構建基於著色器的光照機制 88固定著色 88平滑著色 89 Phong著色方案 89各向異性著色 90本章練習 91

第7章頂點著色器 92

圖形管線中的頂點著色器 93頂點著色器的輸入數據 93源自頂點著色器的輸出數據 94幾何體 94頂點著色器之後的固定功能處理 96

頂點著色器和細分著色器之間的關係 96頂點著色器和幾何著色器之間的關係 96利用頂點著色器替換固定功能圖形操作 97標準的頂點處理過程 97基於頂點著色器的固定功能管線擴展 97頂點修正 98頂點著色器中的問題 100生成法線 100綜述 101本章練習 102

第8章片元著色器和表面外觀 103

片元著色器的基本功能 104片元著色器的輸入數據 104片元著色器的 in變數 105坐標系 106片元著色器處理機制 107源自片元著色器的輸出數據 107利用片元處理器替換固定功能處理 107著色機制 107傳統的紋理貼圖 108偽色 108片元著色器後續步驟 110其他著色器效果 110像素丟棄 111 Phong著色 111基於解析法線的著色機制 112各向異性著色 113基於數據驅動的色彩方案 114使用其他數據生成圖像 115本章練習 116

第9章片元著色器中的表面紋理 117

紋理坐標 117傳統的紋理貼圖 117 GLSL紋理貼圖 118紋理上下文 120固定功能管線中的紋理環境 121紋理採樣參數 121

··

採樣器 122過程紋理 122凹凸貼圖 127立方體貼圖 132渲染至紋理 135渲染至紋理( glman多路渲染) 138本章練習 140

第10章噪聲 141

噪聲的基本概念 141 3種噪聲類型:數值、梯度以及數值 +梯度 142三次插值和五次插值 142噪聲方程 143其他噪聲 145分形布朗運動( FBM,1/f,倍頻程) 146二維噪聲和三維噪聲 146基於 glman的噪聲 148基於內建 GLSL函式使用噪聲紋理 149湍流 149不同環境中的噪聲示例 151大理石著色器 153雲彩著色器 153木材著色器 155與噪聲相關的高級話題 156 noisegraph應用程式 156本章練習 157

第11章基於著色器的圖像處理 159

基本概念 160單幅圖像處理 160亮度 160 CMYK轉換 161色調轉換 163圖像過濾機制 165圖像模糊操作 166色度鍵圖像 167立體視圖 169 3D電視 171邊檢測技術 173 浮雕效果 174卡通著色器 176藝術視覺效果 177圖像的翻轉、旋轉和扭曲 178圖像混合處理 182基於固定基圖像的圖像混合操作 183反像 183亮度 184對比度 184圖像的自身混合操作 185飽和度 185銳利度 186不同圖像間的混合操作 187其他合成方案 188圖像漸變 190內容提示 194本章練習 195

第12章幾何著色器的概念和示例 198

幾何著色器的功能 198新型鄰接圖元 200基於輸入和輸出變數的布局結構 201新增 OpenGL API函式 201新增 GLSL變數以及變數類型 203頂點著色器或細分著色器與幾何著色器之間的通信 203幾何著色器中的法線 204套用示例 205 Bezier曲線 205收縮三角形 207球體細分 208 3D對象輪廓邊 211本章練習 213

第13章細分著色器 214

細分著色器定義 214細分著色器與幾何著色器 215細分著色器概念 216設定細分級別時的問題 219套用示例 219

··

等值線 219 Bezier曲面 222球體細分 228基於螢幕覆蓋率的整球細分 233 PN三角形 236綜述 241本章練習 241

第14章 GLSL API 243

OpenGL程式處理中的著色器 243處理 OpenGL擴展 244 GLSL著色器程式的創建方式 245創建並編譯著色器對象 245 CheckGLErrors()函式 247創建、綁定、連結並激活著色器程式 248生成著色器程式並綁定著色器對象 248著色器程式的連結操作 249激活著色器程式 250向著色器傳遞數據 250在應用程式中定義 uniform變數 251兼容模式下的 uniform變數 253在應用程式中定義 attribute變數 254兼容模式下的 attribute變數 255著色器程式的 C++控制類 256本章練習 257

第15章基於著色器的科學可視化計算 258

基於圖像的可視化技術 258負像 258圖像邊檢測 259卡通渲染 259雙曲線幾何學 260 3D標量數據可視化計算 263點雲 264剖切面 267體探測 270直接體渲染 271其他轉換函式 276通過幾何對象傳遞數據值 279 地形凹凸貼圖 280流顯示 283 2D線積分卷積 283 3D線積分卷積 285獲取流線對象 286幾何可視化 289輪廓邊技術 289刺狀區 290本章練習 292

第16章著色器套用 295

光線干涉現象 295衍射光柵 295油膜 299透鏡效果 301浴室玻璃 304大氣效果 306彩虹 307輝光效果 310其他視效函式 312 glman Timer函式 313迪斯科球 313霧效果 315 3D幾何體變形 316算法藝術 319 Connett圓 319運動狀態下的可見信息 321爆炸效果著色器 322本章練習 324

參考文獻 326

附錄 A基於 GLSL程式的 C++類 329

附錄 B Matrix4 C++類 331

附錄 C Vec C++類 334

附錄 D頂點數組類 336

相關詞條

相關搜尋

熱門詞條

聯絡我們