著色器——圖形卡上的程序
著色器(shader)這個(gè)詞帶有一定的誤導(dǎo)性。最初的著色器程序主要用于處理組成每個(gè)多邊形表面的像素,以便為模型著色。但是隨著時(shí)間推移,著色器程序的功能已經(jīng)被擴(kuò)展,現(xiàn)在還可以修改頂點(diǎn)屬性、創(chuàng)建新頂點(diǎn),甚至完成一般的操作。
著色器與運(yùn)行在CPU上的普通程序具有不同的工作方式。著色器程序在大量的元件上同時(shí)執(zhí)行,這意味著著色器程序是大規(guī)模并行程序,而運(yùn)行在CPU上的程序一般則是串行運(yùn)行的,一次只有一個(gè)實(shí)例運(yùn)行。著色器程序非常適合對(duì)構(gòu)成3D世界的像素和頂點(diǎn)的集合執(zhí)行操作。
目前共有3類著色器,分別是頂點(diǎn)著色器、幾何著色器和像素著色器,每種著色器都只能執(zhí)行特定的操作。頂點(diǎn)著色器處理頂點(diǎn),像素著色器處理像素,幾何著色器處理圖元。為了降低復(fù)雜性,并使硬件制造商可以更高效地進(jìn)行優(yōu)化,所有這些著色器都被一種叫統(tǒng)一著色器(unified shader)的著色器替代了。
著色器通過運(yùn)行在圖形卡上的特殊語言進(jìn)行編程。目前,這些語言比C++低級(jí)得多(更別提C#了)。OpenGL有一門叫做GLSL(OpenGL Shading Language,OpenGL著色語言)的著色語言,它與C語言有些類似,但是有大量用于處理向量和矩陣的特殊操作。DirectX也有自己的著色語言,叫做HLSL(High Level Shading Language,高級(jí)著色語言)。兩種語言十分類似。讓人更加困惑的是,除了這兩種語言以外,還有一種叫做Cg的語言,它由Microsoft和Nvidia開發(fā),與HLSL有些類似。
游戲中的著色器非常適合創(chuàng)建需要進(jìn)行大量計(jì)算的特殊效果,如視差貼圖的光照。當(dāng)前的技術(shù)使得著色器程序幾乎不能用于其他用途。本書主要介紹游戲編程,由于可編程流水線是一個(gè)很大的主題,所以不會(huì)討論該技術(shù)。如果對(duì)此主題感興趣,可以參閱附錄A部分,那里介紹了幾本非常好的書籍。
著色器的一種趨勢是用于一般性的并行編程任務(wù),而不只是處理圖形。例如,Nvidia PhysX庫允許在GPU而非CPU上完成物理計(jì)算,從而得到更佳的性能。PhysX是用另外一種叫做CUDA的著色器語言編寫的,但是CUDA與其他著色器語言有一些不同,這種語言不怎么關(guān)注像素和頂點(diǎn),而是更關(guān)注一般目的的并行編程。假設(shè)在游戲中要模擬一個(gè)城市,并且有一個(gè)非常新奇的并行算法可以更新城市中的全部居民,那么這種計(jì)算在GPU上可以更快地執(zhí)行,而CPU就可以被解放出來,執(zhí)行其他任務(wù)。CUDA通常用于科學(xué)研究項(xiàng)目,因?yàn)檫@是利用強(qiáng)大的計(jì)算能力的一種廉價(jià)的方式。使用CUDA的應(yīng)用程序包括量子化學(xué)計(jì)算、心肌模擬和黑洞建模。
2.4 Tao框架
Tao框架是C#使用OpenGL庫的一種方式。Tao包裝了許多C庫(見表2-1),并使得在C#中使用這些函數(shù)變得很簡單。Tao中還綁定了Mono,所以也可以用在Linux和Mac中。
通過Tao,C#不只可以使用OpenGL,還可以使用其他一些有用的庫。