簡介
標量:標量也被稱為“無向量”其值只有大小,並不具有方向。標量之間的運算遵循簡單的代數法則,如質量、密度、體積、時間以及溫度等都屬於標量。OpenGLES著色語言支持的標量類型有布爾型(bool)、整形(int)和浮點型(float)。
向量:OpenGLES著色語言中,向量可以看做是用同樣類型的標量組成,其基本類型也分為bool、int和float三種。每個向量可以由2個、3個、4個相同的標量組成。具體情況如圖一:
向量在著色器代碼的開發中有著十分重要的作用,可以很方面的存儲以及存儲顏色、位置、紋理坐標等不僅包含一個組成部分的量。開發中,有時可能需奧單獨訪問向量中的某個分量,基本的語法為“<向量名>.<分量名>”,根據目的的不同,主要有以下幾種用法:
將一個向量看做顏色時,可以使用r,g,b,a四個分量名,分別代表紅、綠、藍、透明度4個色彩通道。具體用法如下:
//給向量aColor的紅色通道賦值 aColor.r = 0.6;
將一個向量看做位置時,可以使用x,y,z,w等4個分量名,分別代表X軸,Y軸,Z軸和向量的模四個分量,具體用法和顏色類似。
將一個向量看做紋理坐標時,可以使用s,t,p,q四個分量名,期分別代表紋理坐標的不同分量,具體用法同顏色。(對紋理坐標中的s,t等分量博友可能不是很明白,不用擔心,在後面介紹紋理貼圖的教程會進行詳細的介紹)
訪問向量中的各個不同的分量不但可以採用“.”加上不同的分量名,還可以將向量看做一個數組,用下標來進行訪問,具體用法如下:
//給向量aColor的紅色通道賦值 aColor[0] = 0.6;
矩陣:有一些基礎的開發人員都知道,3D場景中的移位、旋轉、縮放等變換都是由矩陣的運算來實現的。因此3D場景的開發中會非常多的使用矩陣,矩陣按尺寸分為2x2矩陣、3x3矩陣、4x4矩陣。具體如圖二所示。
對於矩陣的訪問,可以講矩陣作為列向量的數組來訪問。如matrix為一個mat4,可以使用matrix[2]取到該矩陣的第三列,其為一個vec4;也可以使用matix[2][2]取得第三列向量的第3個分量。
採樣器:採樣器是著色語言中不同於C語言的一種特殊的基本數據類型,其專門用來進行紋理採樣的相關操作。一般情況下,一個採樣器變數代表一幅或一套紋理貼圖,具體如圖三所示。
結構體:OpenGLES著色語言還提供了類似C語言中的用戶自定義結構體,同樣也是使用struct關鍵字進行聲明。其基本用法如下:
struct info{ vec3 color; vec3 position; vec2 textureCoor; }
數組:聲明數組的方式主要有兩種,在聲明數組的同時,指定數組的大小:
在聲明數組時,也可以不指定數組的大小,但是必須符合下列兩種情況之一。
引用數組之前,要再次使用第一種聲明方式來生命該數組:
//聲明了一個大小不定的vec3數組 vec3 position[]; //再次聲明該數組,並且指定大小。 vec3 position[5];
代碼中訪問數組的下標都是編譯時常量,這時編譯器會自動創建適當大小的數組,使得數組尺寸足夠存儲編譯器看到的最大索引值對應的元素。
//聲明了一個大小不定的vec3數組 vec3 position[]; //position需要一個大小為4的數組 position[3] = vec3(3.0); //position需要一個大小為21的數組 position[20] = vec3(6.0);
空類型使用void表示,僅用來聲明不返回任何值得函式。例如在頂點著色器以及片元著色器中必須存在的main函式就是一個返回值為空的函式,代碼如下:
離線渲染
離線渲染領域所使用的著色器語言通常可以生成高質量的圖像。這種著色器語言中,對材質屬性進行了高度抽象,使用時通常只需少量的編程知識、不需要硬體知識。
這類著色器通常可以達到照片級的效果,但同時需要花費大量時間和算力。因此,這類著色器的最終渲染通常都在
計算機集群上進行。
離線渲染中常見的著色器語言有:
RenderMan 著色語言(RSL)
開放著色器程式語言(OSL)
實時渲染
著色器語言在實時計算機圖形領域有著廣泛套用。與此前常見的硬編碼方式相比,這類語言對於硬體抽象的程度很高,同時還給予了程式設計師更大的靈活性,可以更好地控制整個渲染過程。
由於
串流處理的特點,這類直接在
GPU上運行的著色器也常被用於吞吐量較大的通用數據處理領域。
實時渲染中常見的著色器語言有:
ARB彙編語言
OpenGL 著色語言
DirectX 著色器彙編語言