GLSL內建變數

      在〈GLSL內建變數〉中尚無留言

OpenGL ES在vertexShader及fragmentShader之間有特定的功能, 有些在fragmentShader之後又有特定的功能. shader可以通過內建的變數和這些特定功能進行溝通

OpenGL ES的內建變數一部份來自vertexShader輸出變數, 一部份來自fragmentShader輸人及輸出變數. 若要在二者間進行傳遞, 就要使用varying變數

VertexShader 變數

gl_Position : 只能用於vertex中. 用來描述圖形的頂點位置. 所有的vertex shader都需給這個變數一個值. shader執行時期可以變更其值, 也可以隨時被讀取. 如果沒有值, 會被檢查出錯誤.

gl_PointSize : 只能用於vertex中. 用來寫入將要光柵化的點的尺寸, 單位是像素

上述二個變數的宣告方式如下
highp vec4 gl_Position; // should be written to
mediump float gl_PointSize; // may be written to

這些變數都是全域變數

fragmentShader內建變數

fragmentShader使用gl_FragColor及gl_FragData向管線輸出值. gl_FragColor是指定後面管線要用到的顏色值. gl_FragData為一陣列, 可用gl_FragData[n]指定n元素的值. 這二個不會同時存在.  如果shader執行discard關鍵指令, 則gl_FragColor及gl_FragData就不會運作

gl_FragCoord是fragmentShader的唯讀變數. 保存fragment相對窗口的坐標位置 : x, y,z, 1/w.

gl_FrontFacing是fragmentShader內建唯讀變數. 如果fragment是目前的作用圖形, 此值為true. 用來模擬正反二面.

gl_PointCoord也是唯讀變數. 其值是當前圖像的二維坐標. 範圍為0~1.

上述宣告方式如下
mediump vec4 gl_FragCoord;
bool gl_FrontFacing;
mediump vec4 gl_FragColor;
mediump vec4 gl_FragData[gl_MaxDrawBuffers];
mediump vec2 gl_PointCoord;

同樣的, 這些也都是全域變數

VertexShader內建attribute

內建常數

vertex及fragment提供如下內建常數
const mediump int gl_MaxVertexAttribs = 8;
const mediump int gl_MaxVertexUniformVectors = 128;
const mediump int gl_MaxVaryingVectors = 8;
const mediump int gl_MaxVertexTextureImageUnits = 0;
const mediump int gl_MaxCombinedTextureImageUnits = 8;
const mediump int gl_MaxTextureImageUnits = 8;
const mediump int gl_MaxFragmentUniformVectors = 16;
const mediump int gl_MaxDrawBuffers = 1;

內建uniform

為了方便取得OpenGL ES的處理狀態, 可以使用uniform變數. 如果fragment不支援highp, 則將使用mediump

//
// 窗口坐标的深度范围
//
struct gl_DepthRangeParameters {
highp float near; // n
highp float far; // f
highp float diff; // f – n
};

uniform gl_DepthRangeParameters gl_DepthRange;

發佈留言