GLSL 內建函數

作者:桑榆
QQ:934440653
有問題,評論留言,或qq聯繫

OpenGL ES着色語言爲標量和向量操作定義了一套內建便利函數。有些內建函數可以用在多個類型的着色器中,有些是針對固定硬件的,所以這部分只能用在某個特定的着色器上。

內建函數基本上可以分爲一下三類:

(1)它們使用一些簡便的方式提供必要的硬件功能,如材質貼圖。這些函數單獨通過着色器是無法模擬出來的。

(2)它們展示了一些可以常簡單的寫入的繁瑣操作(clamp, mix等),但是這些操作非常普遍,並且提供直接對硬件的支持。對於編譯器來說,將表達式映射到複雜的裝配線指令上是非常困難的。

(3)它們提供了對圖形硬件的操作,並且在適當時候進行加速。三角函數就是一個很好的例子。

有些函數名稱和常見的C庫函數類似,但是它們支持向量的輸入和更多的傳統標量輸入。
建議應用程序儘量使用內建函數而不是在着色器中實現相同的計算,因爲內建函數是經過最大優化的(如,有些內建函數是直接操作硬件的)。
用戶定義的代碼可以重載內建函數,但最好不要重新定義它們。
內建函數的輸入參數(和相應的輸出的參數)可以是float, vec2, vec3, vec4。對於函數的任何特定應用,實際的類型必須和所有的參數和返回值相同。就像mat,必須爲mat2, mat3, mat4.
參數和返回值的精度修飾符是隱藏的,對於材質函數,返回類型的精度必須和採樣器類型匹配。

uniform lowp sampler2D sampler;
highp vec2 coord;

lowp vec4 col = texture2D (sampler, coord); // texture2D 返回類型的精度爲lowp

其他內建函數形參的精度修飾是沒有任何關聯的。內建函數的調用將返回輸入參數的最高精度。

1 角度和三角函數

標識爲angle的函數參數假定以弧度爲單位。這些函數不可能出現被0除的情況,如果被除數爲0,結果是未定義的。

radian函數是將角度轉換爲弧度,degrees函數是將弧度轉換爲角度。sin, cos, tan都是標準的三角函數。asin, acos, atan是反三角函數。genType有點像面向對象中泛型,即如果genType是float型的,那麼

( 1 ) genType radians (genType degrees)

角度轉弧度(degrees to radians)

( 2 ) genType degrees (genType radians)

弧度轉角度(radians to degrees)

( 3 ) genType sin (genType angle)

三角函數-正弦sine

( 4 ) genType cos (genType angle)

三角函數-餘弦cosine

( 5 ) genType tan (genType angle)

三角函數-正切tangent

( 6 ) genType asin (genType x)

反三角函數-反正弦arc sine

( 7 ) genType atan (genType y, genType x)

反三角函數-反餘弦arc cosine

( 8 ) genType atan (genType y_over_x)

反三角函數-反正切arc tangent

2 指數函數

(1)genType pow (genType x, genType y)

x的y次方。如果x小於0,結果是未定義的。同樣,如果x=0並且y<=0,結果也是未定義的。使用時應特別注意。

(2)genType exp (genType x)

e的x次方

(3)genType log (genType x)

計算滿足x等於e的y次方的y的值。如果x的值小於0,結果是未定義的。

(4)genType exp2 (genType x)

計算2的x次方

(5)genType log2 (genType x)

計算滿足x等於2的y次方的y的值。如果x的值小於0,結果是未定義的。

(6)genType sqrt (genType x)

計算x的開方。如果x小於0,結果是未定義的。

(7)genType inversesqrt (genType x)

計算x的開方之一的值,如果x小於等於0,結果是未定義的。

3 常用函數

(1)genType abs (genType x)

返回x的絕對值

(2)genType sign (genType x)

如果x>0,返回1.0;如果x=0,返回0,如果x<0,返回-1.0

(3)genType floor (genType x)

返回小於等於x的最大整數值

(4)genType ceil (genType x)

返回大於等於x的最小整數值

(5)genType fract (genType x)

返回x-floor(x),即返回x的小數部分

(6)genType mod (genType x, float y)、genType mod (genType x, genType y)

返回x – y * floor (x/y),即求模計算%

(7)genType min (genType x, genType y),genType min (genType x, float y)

返回x和y的值較小的那個值。

(8)genType max (genType x, genType y),genType max (genType x, float y)

返回x和y的值較大的那個值。

(9)genType clamp (genType x, genType minVal, genType maxVal)、genType clamp (genType x, float minVal, float maxVal)

clamp翻譯爲夾具,就叫夾具函數吧,這個函數是什麼意思呢?看看解釋的意思是:獲取x和minVal之間較大的那個值,然後再拿較大的那個值和最後那個最大的值進行比較然後獲取較小的那個,意思就明白了,clamp實際上是獲得三個參數中大小處在中間的那個值。函數有個說明:如果minVal
minMax的話,函數返回的結果是未定的。也就是說x的值大小沒有限制,但是minval的值必須比maxVal小。

(10)genType mix (genType x, genType y, genType a)、genType mix (genType x, genType y, float a)

返回線性混合的x和y,如:x⋅(1−a)+y⋅a

(11)genType step (genType edge, genType x),genType step (float edge, genType x)

如果x < edge,返回0.0,否則返回1.0

(12)genType smoothstep (genType edge0,genType edge1,genType x),genType smoothstep (float edge0,float edge1,genType x)

如果x <= edge0,返回0.0 ;如果x >= edge1 返回1.0;如果edge0 < x <
edge1,則執行0~1之間的平滑埃爾米特差值。如果edge0 >= edge1,結果是未定義的。

4 幾何函數

(1)float length (genType x)

返回向量x的長度

(2)float distance (genType p0, genType p1)

計算向量p0,p1之間的距離

(3)float dot (genType x, genType y)

向量x,y之間的點積

(4)vec3 cross (vec3 x, vec3 y)

向量x,y之間的叉積

(5)genType normalize (genType x)

標準化向量,返回一個方向和x相同但長度爲1的向量

(6)genType faceforward(genType N, genType I, genType Nref)

如果Nref和I的點積小於0,返回N;否則,返回-N;

(7)genType reflect (genType I, genType N)

返回反射向量

(8)genType refract(genType I, genType N,float eta)

返回折射向量

5 矩陣函數

(1)mat matrixCompMult (mat x, mat y)

矩陣x乘以y,result[i][j]是 x[i][j] 和 y[i][j] 的標量積。注意,要獲取線性代數矩陣的乘法,使用乘法操作符*。

6 向量相關函數

相關或相等的操作符(<, <=, >, >=, ==, !=)被定義(或保留),返回一個標量布爾值。下面, “bvec” 是表示bvec2, bvec3, or bvec4的佔位符, “ivec”是ivec2, ivec3, or ivec4的佔位符, “vec” 是vec2, vec3, or vec4的佔位符. 在任何情況下,輸入和返回值向量的長度必須匹配。

(1)lessThan

比較x < y.

(2)lessThanEqual

比較x<=y

(3)greaterThan

比較x>y

(4)greaterThanEqual

比較x>=y

(5)equal

比較x==y

(6)notEqual

比較x!=y

(7)bool any(bvec x)

如果向量x的任何組件爲true,則結果返回true。

(8)bool all(bvec x)

如果向量x的所有組件均爲true,則結果返回true。

(9)bvec not(bvec x)

返回向量x的互補矩陣

7 材質查找函數

紋理(材質)查找函數對於定點着色器和片元着色器都適用。然而,定點着色器的細節級別並不是通過固定功能計算的,所以頂點着色器和片元着色器紋理查找之間還是有一些差別的。一下函數是通過採樣器訪問紋理,和使用OpenGL ES API是一樣的。紋理屬性如尺寸,像素格式,維數,過濾方法,紋理映射匹配數,深度比較等等在OpenGL ES API中都有定義。
在下面的函數中,bias參數對於片元着色器來說是可選的。但在定點着色器中不可使用。對於片元着色器,如果使用了bias這個參數,它被加到優先細節的計算級別中來執行紋理訪問操作。如果bias沒有使用,那麼實現將自動選擇一個默認級別。對於非紋理映射的紋理,紋理是直接被使用的。如果是紋理映射的,並且在片元着色器中執行,那麼使用LOD來進行紋理查找。如果是紋理映射的,並且在頂點着色器中執行,那麼使用的是基本紋理。
以Lod結尾的內建函數只能用在頂點着色器中,在帶有Lod的函數中,lod參數直接用來表示細節級別。

8 片元處理函數

片元處理函數只有在片元語言中才有,但在GLSL ES中沒有片元處理函數。

發佈了11 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章