GLSL語言內建的變數詳解

2022-07-25 16:27:26 字數 3531 閱讀 7689

glsl語言內建的變數,包括內建的頂點屬性(attribute)、一致變數(uniform)、易變變數(varying)以及常量(const),一方面加深印象,另一方面今天的文章可以為以後的程式設計做查詢之用。

頂點屬性—— 指頂點的資訊,opengl據此繪製各個圖元,對於傳統的頂點屬性包括座標、紋理座標、顏色等glsl都會設定乙個內建變數與之對應,以便在需要時可以在 頂點或片元著色器中直接引用,這也體現了glsl與hlsl的乙個最大的不同,hlsl裡頂點的屬性是通過語義來定義的,而glsl充分考慮了 opengl是個狀態機這一事實,將頂點屬性設為乙個狀態變數。glsl中內建的頂點屬性包括以下幾個:

// 頂點屬性

attribute vec4 gl_color;              // 頂點顏色

attribute vec4 gl_secondarycolor;     // 輔助頂點顏色

attribute vec3 gl_normal;             // 頂點法線

attribute vec4 gl_vertex;             // 頂點物體空間座標(未變換)

attribute vec4 gl_multitexcoord[0-n]; // 頂點紋理座標(n = gl_maxtexturecoords)

attribute float gl_fogcoord;          // 頂點霧座標

值得一提的是使用者可以呼叫glvertexattrib設定自己的頂點屬性(當然個數是有限制的)函式參見:

一致變數—— 就是常說的uniform,這是使用者向glsl傳遞自己資料的最常用方法,比如光源位置等等。之所以稱為一致變數,是為了與易變變數相區別。不同於頂點屬 性在每個頂點有其自己的值,也不同於易變變數由頂點程式向片元程式插值傳遞,一致變數在乙個圖元的繪製過程中是不會改變的,而且可以在頂點shader和 片元shader間共享。這部分變數主要用來描述opengl的狀態,可以看作opengl狀態機的複製。glsl內建的一致變數包括:

// 矩陣狀態

uniform mat4 gl_modelviewmatrix;                // 模型檢視變換矩陣

uniform mat4 gl_projectmatrix;                  // 投影矩陣

uniform mat4 gl_modelviewprojectmatrix;         // 模型檢視投影變換矩陣(ftransform())

uniform mat3 gl_normalmatrix;                   // 法向量變換到視空間矩陣

uniform mat4 gl_texturematrix[gl_mattexturecoords];     // 各紋理變換矩陣

// 普通縮放因子

uniform float gl_normalscale;

// 視窗座標深度範圍

struct gl_depthrangeparameters

;uniform gl_depthrangeparameters gl_depthrange;

// 裁剪平面

uniform vec4 gl_clipplane[gl_maxclipplanes];

// 點屬性

struct gl_pointparameters

;uniform gl_pointparameters gl_point;

// 材質

struct gl_materialparameters

;uniform gl_materialparameters gl_frontmaterial;       // 正面材質

uniform gl_materialparameters gl_backmaterial;        // 反面材質

// 光源性質,引數性質就不解釋了,和opengl的三種光源性質是一樣的

struct gl_lightsourceparameters

;uniform gl_lightsourceparameters gl_lightsource[gl_maxlights];

struct gl_lightmodelparameters

;uniform gl_lightmodelparameters gl_lightmodel;

// 光照和材質的派生狀態

struct gl_lightmodelproducts

;uniform gl_lightmodelproducts gl_frontlightmodelproduct;

uniform gl_lightmodelproducts gl_backlightmodelproduct;

struct gl_lightproducts

;uniform gl_lightproducts gl_frontlightproduct[gl_maxlights];

uniform gl_lightproducts gl_backlightproduct[gl_maxlights];

// 紋理環境和生成

unifrom vec4 gl_textureenvcolor[gl_maxtextureimageunits];

unifrom vec4 gl_eyeplanes[gl_maxtexturecoords];

unifrom vec4 gl_eyeplanet[gl_maxtexturecoords];

unifrom vec4 gl_eyeplaner[gl_maxtexturecoords];

unifrom vec4 gl_eyeplaneq[gl_maxtexturecoords];

unifrom vec4 gl_objectplanes[gl_maxtexturecoords];

unifrom vec4 gl_objectplanet[gl_maxtexturecoords];

unifrom vec4 gl_objectplaner[gl_maxtexturecoords];

unifrom vec4 gl_objectplaneq[gl_maxtexturecoords];

// 霧引數

struct gl_fogparameters

;uniform gl_fogparameters gl_fog;

易變變數——易變變數只能在頂點shader和片元shader間傳遞,這期間實際上經過了乙個光柵化的過程。內建的易變變數比較少,如下:

varying vec4 gl_color;

varying vec4 gl_secondarycolor;

varying vec4 gl_texcoord[gl_maxtexturecoords];

varying float gl_fogfragcoord;

熟悉圖形管線的話可以自己描繪出這些易變變數是如何在頂點和片元程式間進行傳遞的。

內建常量——內建常量描述了顯示卡的渲染能力,依據各個顯示卡而定,這裡就不一一枚舉了,如果想要查詢的話可以用opengl的glget函式獲取max/min一族的常量值,這些值和內建變數的值是一致的。

GLSL 內建變數

有些opengl es操作在頂點處理器和片元處理器之間有特定的功能,有些在片元處理器之後又特定的功能,著色器通過內建變數同這些固定功能進行通訊。在opengl es中,內建特殊變數部分來自頂點著色器的輸出變數,部分來自於片元著色器的輸入變數和輸出變數。不同於使用者定義的varying變數,內建特殊變...

GLSL 內建變數

有些opengl es操作在頂點處理器和片元處理器之間有特定的功能,有些在片元處理器之後又特定的功能,著色器通過內建變數同這些固定功能進行通訊。在opengl es中,內建特殊變數部分來自頂點著色器的輸出變數,部分來自於片元著色器的輸入變數和輸出變數。不同於使用者定義的varying變數,內建特殊變...

GLSL學習筆記 之內置變數2

有些opengl es操作在頂點處理器和片元處理器之間有特定的功能,有些在片元處理器之後又特定的功能,著色器通過內建變數同這些固定功能進行通訊。在opengl es中,內建特殊變數部分來自頂點著色器的輸出變數,部分來自於片元著色器的輸入變數和輸出變數。不同於使用者定義的varying變數,內建特殊變...