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;