本書詳細介紹了OpenGL4.5(包括4.4、SPIR—V和擴展功能),以及OpenGL著色語言的方方面面。全書共12章:第1章概述OpenGL主要特性和功能;第2章討論OpenGL中主要的特性——可編程著色器;第3章介紹使用OpenGL進行幾何體繪制的各種方法,以及一些可以讓渲染更為高效的優(yōu)化手段;第4章闡釋OpenGL對于顏色的處理過程,包括像素的處理、緩存的管理以及像素處理相關的渲染技術;第5章介紹在一個二維計算機屏幕上表現(xiàn)三維場景的操作細節(jié);第6章討論將幾何模型與圖像結合來創(chuàng)建真實的、高質量的三維模型的方法;第7章介紹計算機圖形的光照效果模擬方法;第8章介紹使用可編程著色器生成紋理和其他表面效果的方法細節(jié);第9章解釋OpenGL管理和細分幾何表面的著色器功能;第10章介紹在OpenGL渲染流水線中使用著色器進行幾何體圖元修改的特別技術;第11章介紹使用OpenGL幀緩存和緩存內存實現(xiàn)高級渲染技術和非圖形學應用的相關方法;第12章介紹了新的著色器階段,將通用計算的方法融合到OpenGL的渲染流水線當中。
Khronos小組編寫的OpenGL官方*威指南,素有“OpenGL紅寶*”美譽結合OpenGL 4.5的新特性,全方位闡釋OpenGL編程的各種技術細節(jié)、方法和*佳實踐,幫助程序員踏上OpenGL專家之路
作為如今世界知名的圖形學標準接口,OpenGL的*新版本(OpenGL 4.5)顯著提升了應用程序的運行效率、靈活性和性能。OpenGL 4.5是一個非常成熟而且穩(wěn)健的平臺,可以實現(xiàn)高質量的計算機圖像和交互程序的開發(fā)工作,并且使用2D和3D物體、彩色圖像以及著色器的方式來表達整個場景。
本書詳細介紹了OpenGL 4.5(包括4.4、SPIR-V和擴展功能),以及OpenGL著色語言的方方面面,能有效地幫助你編寫和維護OpenGL代碼。
本版新增OpenGL特性包括:
涵蓋OpenGL 4.5的直接狀態(tài)訪問(DSA)特性,這是對OpenGL開發(fā)模式及應用程序訪問對象的方式的一次重大變革。
有關著色器的功能和GPU處理過程的深入討論以及案例講解,而越來越多的程序功能正趨向于在圖形處理器上直接實現(xiàn)。
根據(jù)開發(fā)者社區(qū)的反饋和建議,增加了一些關鍵性功能的介紹和案例。
更新了附錄部分,包含*新的OpenGL庫、相關API、函數(shù)、變量、格式,以及調試和性能評價的方法。
OpenGL圖形系統(tǒng)是圖形硬件的一種軟件接口(GL表示Graphics Library,即圖形庫)。它使得用戶可以創(chuàng)建交互式的程序以產(chǎn)生運動的三維對象的顏色圖像。通過OpenGL,我們可以使用計算機圖形學技術產(chǎn)生逼真的圖像,或者通過一些虛構的方式產(chǎn)生虛擬的圖像。這本指南將告訴你如何使用OpenGL圖形系統(tǒng)進行編程,得到你所期望的視覺效果。
本書的主要內容本書中包含以下章節(jié):
第1章對OpenGL可以完成的工作進行了概覽。它還提供了一個簡單的OpenGL程序并解釋了一些本質性的編程細節(jié),它們可能會用于后續(xù)的章節(jié)中。
第2章討論了OpenGL中最主要的特性—著色語言和SPIR-V,并介紹了它們在應用程序中的初始化和使用方法。
第3章介紹了使用OpenGL進行幾何體繪制的各種方法,以及一些可以讓渲染更為高效的優(yōu)化手段。
第4章解釋了OpenGL對于顏色的處理過程,包括像素的處理、緩存的管理,以及像素處理相關的渲染技術。
第5章給出了將三維場景表現(xiàn)在一個二維計算機屏幕上的操作細節(jié),包括各種幾何投影類型的數(shù)學原理和著色器操作。
第6章討論了將幾何模型與圖像結合來創(chuàng)建真實的、高質量的三維模型的方法。
第7章介紹了計算機圖形的光照效果模擬方法,主要是這類方法在可編程著色器中的實現(xiàn)。
第8章介紹了使用可編程著色器生成紋理和其他表面效果的方法細節(jié),從而增強真實感和其他的渲染特效。
第9章解釋了OpenGL管理和細分幾何表面的著色器功能。
第10章介紹了在OpenGL渲染流水線中使用著色器進行幾何體圖元修改的一種特殊技術。
第11章介紹了使用OpenGL幀緩存和緩存內存實現(xiàn)高級渲染技術和非圖形學應用的相關方法。
第12章介紹了最新的著色器階段,將通用計算的方法融合到OpenGL的渲染管線當中。
此外,我們也提供了一系列作為參考的附錄內容。
附錄A介紹了本書示例程序中用到的一些第三方支持庫。GLFW是可移植的,它可以用來實現(xiàn)更簡短也更加可讀的代碼示例。而GL3W負責處理應用程序與OpenGL函數(shù)之間的綁定關系。
附錄B介紹了OpenGL體系中的其他API,包括用于嵌入式和移動平臺系統(tǒng)的OpenGL ES,以及用于Web瀏覽器內的交互式3D應用程序的WebGL。
附錄C提供了有關OpenGL著色語言的詳細參考文檔。
附錄D列出了OpenGL維護的所有狀態(tài)變量,并介紹了獲取其值的方法。
附錄E介紹了矩陣變換相關的一些數(shù)學方法。
附錄F對于OpenGL中所用到的浮點數(shù)格式做出了概述。
附錄G介紹了OpenGL中最新的調試特性。
附錄H給出了有關uniform緩存的使用的參考文檔,其中使用了OpenGL定義的標準內存布局。
本版中的新特性本版《OpenGL編程指南》已經(jīng)針對最新的OpenGL 4.5進行了修訂和更新。我們知道上一版是對以前版本的《OpenGL編程指南》內容的一次顛覆,而這一版則是在此基礎上進行了校對,修訂了錯誤,重寫了一些內容以便讓讀者更加愉悅地閱讀。從程序開發(fā)的角度來說,OpenGL 4.5版本所帶來的最重大的特性變更就是直接狀態(tài)訪問(direct state access),這是對OpenGL程序開發(fā)模型和對象訪問機制的一次重大革新。此外,我們也繼續(xù)嘗試將越來越多的功能移植到圖形處理器硬件中,因此本書將著重于對著色器功能和GPU處理機制的講解。
需要在閱讀本書之前掌握的知識本書假設你已經(jīng)了解了使用C++語言進行編程的方法(我們將使用少量的C++程序,如果你對C語言已經(jīng)比較熟悉的話,應該會比較容易理解它們),并且具有一定的數(shù)學背景(幾何、三角學、線性代數(shù)、微積分以及微分幾何)。即使對計算機圖形學技術沒有太多的經(jīng)驗或者一無所知,你也可以學習和理解本書中討論的大部分內容。當然,計算機圖形學是一個不斷延展的學科,因此你也許還需要閱讀以下補充內容來豐富自己的知識。
《Computer Graphics: Principles and Practice》第3版,John F. Hughes、Andries van Dam、Morgan McGuire、David F. Sklar、James D. Foley、Steven K. Feiner和Kurt Akeley著(Addison-Wesley,2013年出版):這本書是有關計算機圖形學的一本百科全書,它包含了大量有價值的信息,不過在閱讀之前,你最好已經(jīng)對這門學科有了一定的了解。
《OpenGL SuperBible: Comprehensive Tutorial and Reference》第7版,Graham Sellers、Richard S. Wright Jr.、Nicolas Haemel著(Addison-Wesley,2015年出版):這本書采用教程的形式編寫,即使是對計算機圖形學一無所知的讀者也可以從這本循循善誘的指導書中開始學習OpenGL。
《OpenGL Insights》,Patrick Cozzi和Christophe Riccio著(A. K. Peters,2012年出版):這是一本有關OpenGL高級技巧的論文集,包括一些資深開發(fā)者、研究者以及一線工作者的感悟。每篇文章都會專注于某一個特定的技術領域,而這本書也會成為從事相關行業(yè)的讀者的極佳的靈感來源。
Contents?目 錄
推薦語
譯者序
前 言
致 謝
第1章 OpenGL概述 1
1.1 什么是OpenGL 1
1.2 初識OpenGL程序 2
1.3 OpenGL語法 6
1.4 OpenGL渲染管線 7
1.4.1 準備向OpenGL傳輸數(shù)據(jù) 8
1.4.2 將數(shù)據(jù)傳輸?shù)絆penGL 8
1.4.3 頂點著色 9
1.4.4 細分著色 9
1.4.5 幾何著色 9
1.4.6 圖元裝配 9
1.4.7 剪切 9
1.4.8 光柵化 9
1.4.9 片元著色 10
1.4.10 逐片元的操作 10
1.5 第一個程序:深入分析 11
1.5.1 進入main()函數(shù) 11
1.5.2 OpenGL的初始化過程 12
1.5.3 第一次使用OpenGL進行渲染 21
第2章 著色器基礎 24
2.1 著色器與OpenGL 25
2.2 OpenGL的可編程管線 25
2.3 OpenGL著色語言概述 27
2.3.1 使用GLSL構建著色器 27
2.3.2 存儲限制符 33
2.3.3 語句 36
2.3.4 計算的不變性 40
2.3.5 著色器的預處理器 42
2.3.6 編譯器的控制 44
2.3.7 全局著色器編譯選項 44
2.4 數(shù)據(jù)塊接口 45
2.4.1 uniform塊 45
2.4.2 指定著色器中的uniform塊 46
2.4.3 從應用程序中訪問uniform塊 47
2.4.4 buffer塊 53
2.4.5 in/out塊、位置和分量 53
2.5 著色器的編譯 54
2.6 著色器子程序 59
2.6.1 GLSL的子程序設置 59
2.6.2 選擇著色器子程序 60
2.7 獨立的著色器對象 62
2.8 SPIR-V 64
2.8.1 選擇SPIR-V的理由 64
2.8.2 SPIR-V與OpenGL 66
2.8.3 使用GLSL在OpenGL中生成SPIR-V 67
2.8.4 Glslang 69
2.8.5 SPIR-V中包含了什么 69
第3章 OpenGL繪制方式 70
3.1 OpenGL圖元 70
3.1.1 點 71
3.1.2 線、條帶與循環(huán)線 72
3.1.3 三角形、條帶與扇面 72
3.2 OpenGL緩存數(shù)據(jù) 75
3.2.1 創(chuàng)建與分配緩存 75
3.2.2 向緩存輸入和輸出數(shù)據(jù) 77
3.2.3 訪問緩存的內容 81
3.2.4 丟棄緩存數(shù)據(jù) 86
3.3 頂點規(guī)范 86
3.3.1 深入討論VertexAttribPointer 87
3.3.2 靜態(tài)頂點屬性的規(guī)范 90
3.4 OpenGL的繪制命令 92
3.4.1 圖元的重啟動 99
3.4.2 多實例渲染 102
第4章 顏色、像素和片元 112
4.1 基本顏色理論 113
4.2 緩存及其用途 114
4.2.1 緩存的清除 116
4.2.2 緩存的掩碼 117
4.3 顏色與OpenGL 118
4.3.1 顏色的表達與OpenGL 118
4.3.2 平滑數(shù)據(jù)插值 119
4.4 片元的測試與操作 121
4.4.1 剪切測試 122
4.4.2 多重采樣的片元操作 123
4.4.3 模板測試 124
4.4.4 模板的例子 125
4.4.5 深度測試 127
4.4.6 融混 129
4.4.7 邏輯操作 133
4.4.8 遮擋查詢 134
4.4.9 條件渲染 138
4.5 多重采樣 139
4.6 逐圖元的反走樣 141
4.6.1 線段的反走樣 142
4.6.2 多邊形的反走樣 143
4.7 像素數(shù)據(jù)的讀取和拷貝 143
4.8 拷貝像素矩形 145
第5章 視口變換、裁減、剪切與反饋 147
5.1 觀察視圖 148
5.1.1 視圖模型 148
5.1.2 相機模型 148
5.1.3 正交視圖模型 151
5.2 用戶變換 152
5.2.1 矩陣乘法的回顧 153
5.2.2 齊次坐標 155
5.2.3 線性變換與矩陣 157
5.2.4 法線變換 167
5.2.5 OpenGL矩陣 168
5.3 OpenGL變換 170
5.3.1 高級技巧:用戶裁減和剪切 172
5.3.2 OpenGL變換的控制 173
5.4 transform feedback 174
5.4.1 transform feedback對象 175
5.4.2 transform feedback緩存 176
5.4.3 配置transform feedback的變量 179
5.4.4 transform feedback的啟動和停止 185
5.4.5 transform feedback的示例:粒子系統(tǒng) 187
第6章 紋理與幀緩存 192
6.1 紋理綜述 193
6.2 基本紋理類型 194
6.3 創(chuàng)建并初始化紋理 195
6.4 指定紋理數(shù)據(jù) 200
6.4.1 顯式設置紋理數(shù)據(jù) 200
6.4.2 從緩存中加載紋理 202
6.4.3 從文件加載圖像 203
6.4.4 獲取紋理數(shù)據(jù) 206
6.4.5 紋理數(shù)據(jù)的排列布局 207
6.5 紋理格式 211
6.5.1 內部格式 211
6.5.2 外部格式 214
6.6 壓縮紋理 216
6.7 采樣器對象 218
6.8 紋理的使用 220
6.8.1 紋理坐標 222
6.8.2 排列紋理數(shù)據(jù) 225
6.8.3 使用多重紋理 227
6.9 復雜紋理類型 229
6.9.1 3D紋理 229
6.9.2 紋理數(shù)組 230
6.9.3 立方體映射紋理 231
6.9.4 陰影采樣器 236
6.9.5 深度-模板紋理 237
6.9.6 緩存紋理 238
6.10 紋理視圖 240
6.11 濾波方式 243
6.11.1 線性濾波 243
6.11.2 使用和生成mipmap 245
6.11.3 計算mipmap層次 249
6.11.4 mipmap細節(jié)層次的控制 250
6.12 高級紋理查詢函數(shù) 250
6.12.1 顯式的細節(jié)層次控制 250
6.12.2 顯式的梯度設置 251
6.12.3 帶有偏移參數(shù)的紋理獲取函數(shù) 251
6.12.4 投影紋理 252
6.12.5 在著色器中執(zhí)行紋理查詢 253
6.12.6 紋素收集 255
6.12.7 組合功能的特殊函數(shù) 255
6.13 無綁定紋理 256
6.13.1 紋理句柄 256
6.13.2 紋理駐留 257
6.13.3 采樣無綁定紋理 258
6.14 稀疏紋理 259
6.14.1 稀疏紋理的數(shù)據(jù)提交 259
6.14.2