GLSL語言内置變量
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
{
float near;
float far;
float diff; // far-near
};
uniform gl_DepthRangeParameters gl_DepthRange;
// 裁剪平面
uniform vec4 gl_ClipPlane[gl_MaxClipPlanes];
// 點屬性
struct gl_PointParameters
float size;
float sizeMin;
float sizeMax;
float fadeThresholdSize;
float distanceConstantAttenuation;
float distanceLinearAttenuation;
float distanceQuadraticAttenuation;
uniform gl_PointParameters gl_Point;
// 材質
struct gl_MaterialParameters
vec4 emission; // 自身光照Ecm
vec4 ambient; // 環境光吸收系數Acm
vec4 diffuse; // 漫反射吸收系數Dcm
vec4 specular; // 鏡面反射吸收系數Scm
float shininess; // Srm
uniform gl_MaterialParameters gl_FrontMaterial; // 正面材質
uniform gl_MaterialParameters gl_BackMaterial; // 反面材質
// 光源性質,參數性質就不解釋了,和OpenGL的三種光源性質是一樣的
struct gl_LightSourceParameters
vec4 ambient; // Acii
vec4 diffuse; // Dcii
vec4 specular; // Scii
vec4 position; // Ppii
vec4 halfVector; // Hi
vec3 spotDirection; // Sdli
float spotExponent; // Srli
float spotCutoff; // Crli
float spotCosCutoff; // cos(Crli)
float constantAttenuation; // K0
float linearAttenuation; // K1
float quadraticAttenuation; // K2
uniform gl_LightSourceParameters gl_LightSource[gl_MaxLights];
struct gl_LightModelParameters
vec4 ambient; // Acs
uniform gl_LightModelParameters gl_LightModel;
// 光照和材質的派生狀态
struct gl_LightModelProducts
vec4 sceneColor; // Ecm+Acm*Acs
uniform gl_LightModelProducts gl_FrontLightModelProduct;
uniform gl_LightModelProducts gl_BackLightModelProduct;
struct gl_LightProducts
vec4 ambient; // Acm * Acli
vec4 diffuse; // Dcm * Dcli
vec4 specular; // Scm * Scli
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
vec4 color;
float density;
float start;
float end;
float scale; // 1/(end-start)
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;
熟悉圖形管線的話可以自己描繪出這些易變變量是如何在頂點和片元程式間進行傳遞的。