本書由淺入深地講解OpenGL的概念和用法,通過一個(gè)個(gè)簡(jiǎn)單的實(shí)例使讀者對(duì)各個(gè)知識(shí)點(diǎn)一目了然。書中包括渲染管道、著色器、緩存、紋理、矩陣、光照模型、陰影、幀緩存、拾取、文字、用戶界面、體渲染、透明和通用計(jì)算等內(nèi)容。讀者掌握這些之后,就可以自由地設(shè)計(jì)和編寫中等規(guī)模的三維圖形程序,并且能夠渲染百萬數(shù)量級(jí)頂點(diǎn)的模型。本書相關(guān)內(nèi)容將在Github上持續(xù)更新,讀者可參閱更多資料。
本書適用于熟悉C、C 、C#或Java等任何面向?qū)ο缶幊陶Z(yǔ)言的讀者,本書會(huì)對(duì)這些相關(guān)的基礎(chǔ)內(nèi)容進(jìn)行必要的介紹。讀者只需認(rèn)真實(shí)踐,完全可以掌握本書內(nèi)容。
大部分講解OpenGL的書都是用C\\C 編寫代碼的,但本書全部使用C#編寫OpenGL程序。這是因?yàn)椋cC\\C 等語(yǔ)言相比,C#需要的配置*少,運(yùn)行環(huán)境*簡(jiǎn)單,調(diào)試環(huán)境*方便,*適合用來學(xué)習(xí)復(fù)雜的OpenGL。本書所有代碼均可下載,方便讀者學(xué)習(xí)。
本書將以C#為工具介紹OpenGL的相關(guān)知識(shí)。如果讀者不太了解C#或面向?qū)ο蟪绦蛟O(shè)計(jì),可參考本書最后的附錄。
本書由淺入深地講解OpenGL的概念和用法,通過一個(gè)個(gè)簡(jiǎn)單的實(shí)例讓讀者一目了然地認(rèn)識(shí)OpenGL的各個(gè)知識(shí)點(diǎn)。本書包括渲染管道(Pipeline)、著色器(Shader)、緩存(Buffer)、紋理(Texture)、矩陣(Matrix)、光照模型(Lighting)、陰影(Shadow)、幀緩存(Framebuffer)、拾取(Picking)、文字(Text)、用戶界面(UI)、體渲染(Volume Rendering)、透明(Transparency)和通用計(jì)算(Compute Shader)等內(nèi)容。讀者掌握這些內(nèi)容后,就可以自由設(shè)計(jì)、編寫中等規(guī)模的三維圖形程序了,并且能夠渲染百萬數(shù)量級(jí)頂點(diǎn)的模型。
本書的網(wǎng)絡(luò)資料包含了書中所有的完整代碼,讀者可以從北航出版社網(wǎng)站(www.buaapress.com.cn)的下載專區(qū)的相關(guān)頁(yè)面獲取。另外,讀者也可以在CSharpGL托管頁(yè)面(https://github.com/bitzhuwei/CSharpGL)找到本書的全部代碼。如果讀者對(duì)本書內(nèi)容有任何疑問、指錯(cuò)或想進(jìn)一步深入討論,還可以在托管頁(yè)面進(jìn)行提問、討論。本書最后的附錄也提供了簡(jiǎn)單的Github入門教程。
感謝北京航空航天大學(xué)出版社提供的機(jī)會(huì)與平臺(tái),感謝家人以及業(yè)界的朋友在本書編寫的過程中給予的支持和幫助,這里還要特別感謝編輯劇艷婕在本書出版的過程中提出的寶貴意見。希望本書能夠幫助讀者打開計(jì)算機(jī)圖形學(xué)的大門。
作者畢業(yè)于北京理工大學(xué)軟件工程專業(yè),熱愛編程,潛心研究OpenGL和圖形學(xué)多年,自行設(shè)計(jì)編寫了CSharpGL開源庫(kù)。期望本書能將作者的感悟傳播給更多的同道中人。
第1章Hello OpenGL1
1.1從這里開始認(rèn)識(shí)1
1.2OpenGL是什么1
1.3如何使用OpenGL2
1.4Hello
OpenGL6
1.5輔助工具22
1.6不含位置屬性的頂點(diǎn)29
1.7總結(jié)31
1.8問題31
第2章紋理33
2.1二維紋理33
2.2其他類型的紋理40
2.3多個(gè)紋理43
2.4多個(gè)渲染方法46
2.5總結(jié)48
2.6問題48
第3章空間和矩陣50
3.1如何理解矩陣50
3.2空間和矩陣的關(guān)系52
3.3Pipeline中的空間60
3.4實(shí)例化渲染61
3.5總結(jié)63
3.6問題63
第4章幾何著色器64
4.1介紹64
4.2示例:渲染法線66
4.3總結(jié)69
4.4問題69
第5章光照70
5.1BlinnPhong光照模型70
5.2光源70
5.3反射光70
5.4BlinnPhong算法75
5.5同時(shí)使用多個(gè)光源77
5.6陰影80
5.7凹凸映射80
5.8噪聲84
5.9總結(jié)88
5.10問題88
第6章幀緩存89
6.1名詞術(shù)語(yǔ)90
6.2附著點(diǎn)90
6.3將Texture附著到Framebuffer91
6.4附著Renderbuffer95
6.5示例:Render to Texture95
6.6總結(jié)99
6.7問題100
第7章陰影101
7.2Shadow
Volume110
7.3模板緩存的初始化122
7.4多光源下的陰影123
7.5總結(jié)124
7.6問題124
第8章拾取125
8.1基礎(chǔ)125
8.2在DrawArraysCmd命令下的拾取140
8.3在DrawElementsCmd命令下的拾取146
8.4拖拽頂點(diǎn)157
8.5總結(jié)162
8.6問題163
第9章文字164
9.1固定尺寸且始終面向Camera164
9.2字形信息169
9.3三維世界的文字174
9.4總結(jié)177
9.5問題177
第10章簡(jiǎn)單的用戶界面178
10.1指定區(qū)域的貼圖178
10.2控件的布局機(jī)制179
10.3控件的事件機(jī)制188
10.4CtrlImage193
10.5CtrlLabel196
10.6CtrlButton200
10.7總結(jié)202
10.8問題202
第11章軌跡球203
11.1軌跡球203
11.2使用204
11.3設(shè)計(jì)205
11.4四元數(shù)209
11.5總結(jié)210
11.6問題210
第12章體渲染211
12.1什么是體渲染211
12.2靜態(tài)切片212
12.3動(dòng)態(tài)切片215
12.4Raycasting217
12.5總結(jié)223
12.6問題224
第13章半透明渲染225
13.1跳躍著色法225
13.2與順序無關(guān)的半透明渲染226
13.3Front
to Back Peeling235
13.4總結(jié)240
13.5問題240
第14章Transform Feedback Object241
14.1Transform
Feedback如何工作241
14.2使用Transform Feedback Object244
14.3輪流更新245
14.4粒子系統(tǒng)251
14.5總結(jié)254
14.6問題254
第15章Compute Shader255
15.1Compute
Shader簡(jiǎn)介255
15.2圖像處理257
15.3粒子系統(tǒng)261
15.4總結(jié)262
15.5問題263
附錄264
附錄AGithub入門264
附錄BC#和面向?qū)ο笕腴T277
附錄C解析簡(jiǎn)單的wavefront(*.obj)文件格式298
附錄D自制體數(shù)據(jù)的2種方法302