概述:
頂點著色器提供頂點操作的通用可編程方法.
屬性 : 用頂點數(shù)組提供的逐頂點數(shù)據(jù).
統(tǒng)一變量和統(tǒng)一變量緩沖區(qū) : 頂點著色器使用的不變數(shù)據(jù)
采樣器 : 代表頂點著色器使用的紋理的特殊統(tǒng)一變量類型.
著色器程序 : 頂點著色器程序源代碼或者描述在操作頂點的可執(zhí)行文件.
一個典型的著色器有下面的結(jié)構(gòu):
#version version_number
in type in_variable_name;
in type in_variable_name;
out type out_variable_name;
uniform type uniform_name;
int main()
{
// 處理輸入并進行一些圖形操作
...
// 輸出處理過的結(jié)果到輸出變量
out_variable_name = weird_stuff_we_processed;
}
修飾符
- uniform
uniform變量是外部application程序傳遞給(vertex和fragment)shader的變量.
uniform變量一般用來表示:變換矩陣巩螃,材質(zhì)演怎,光照參數(shù)和顏色等信息。
以下是例子:
uniform mat4 viewProjMatrix; //投影+視圖矩陣
uniform mat4 viewMatrix; //視圖矩陣
uniform vec3 lightPosition; //光源位置
- attribute
attribute變量是只能在vertex shader中使用的變量避乏。
它不能在fragment shader中聲明attribute變量爷耀,也不能被fragment shader中使用.
一般用attribute變量來表示一些頂點的數(shù)據(jù),如:頂點坐標拍皮,法線歹叮,紋理坐標,頂點顏色等铆帽。
- varying
varying變量是vertex和fragment shader之間做數(shù)據(jù)傳遞用的咆耿。一般vertex shader修改varying變量的值丧没,
然后fragment shader使用該varying變量的值殷绍。因此varying變量在vertex和fragment shader二者之間的聲明必須是一致的。application不能使用此變量吃衅。
頂點著色器內(nèi)建變量
- 特殊變量(頂點著色器的輸入輸出)
- 統(tǒng)一狀態(tài)(如深度范圍)
- 規(guī)定最大值(如屬性數(shù)量,頂點著色器輸出變量數(shù)量和統(tǒng)一變量數(shù)量)的常量
內(nèi)建特殊變量
- gl_VertexID是一個輸入變量,用于保存頂點的整數(shù)索引.
這個整數(shù)型變量用highp精度限定符聲明.
- gl_InstanceID是一個輸入變量,用于保存實例化繪圖調(diào)用中圖元的示例編號.
對于常規(guī)的繪圖調(diào)用,該值為0.
gl_InstanceID是一個整數(shù)型變量,用highp精度限定符聲明.
- gl_Position用于輸出頂點位置的裁剪坐標.
該值在裁剪和視窗階段用于執(zhí)行相應的圖元裁剪以及從裁剪坐標到屏幕坐標的頂點位置轉(zhuǎn)換.
如果頂點著色器未寫入gl_Position.則該值未定義.
gl_Position是一個浮點變量,用highp精度限定符聲明.
- gl_PointSize用于寫入以像素表示的點精靈尺寸,在渲染點精靈時使用.
頂點著色器輸出的gl_PointSize值被限定在OpenGL ES 3.0實現(xiàn)支持的非平滑點大小范圍之內(nèi).
該值是一個浮點變量,用highp精度限定符聲明.
- gl_FrontFacing是一個特殊變量,但不是由頂點著色器直接寫入的,而是根據(jù)頂點著色器生成的位置和渲染的圖元類型生成的.
該值是一個布爾變量
內(nèi)建統(tǒng)一狀態(tài)
struct gl_DepthRangeParameters {
highp float near;
highp float far;
highp float diff;
}
uniform gl_DepthRangeParameters gl_depthRange;
內(nèi)建常量
const mediump int gl_maxVertexAttribs = 16
const mediump int gl_maxVertexUniformVectors = 256
const mediump int gl_maxVertexOutputVectors = 16
const mediump int gl_maxVertexTextureImageUnits = 16
const mediump int gl_maxCombindedTextureImageUnits = 32
- gl_maxVertexAttribs : 是可以指定的頂點屬性的最大數(shù)量.
- gl_maxVertexUniformVectors : 頂點著色器可以使用的vec4統(tǒng)一變量項目的最大數(shù)量
- gl_maxVertexOutputVectors : 輸出向量的最大數(shù)量
- gl_maxVertexTextureImageUnits : 頂點著色器中可用的紋理單元的最大數(shù)量.
- gl_maxCombindedTextureImageUnits : 頂點和片段著色器中可用紋理單元最大數(shù)量的總和.
PS : 以上的內(nèi)建常量指定的值是所有OpenGL ES 3.0 實現(xiàn)必須支持的最小值.實現(xiàn)各種可能支持超過上面所述的最小值的常量值.實際支持的值可以用下面的代碼查詢.
GLint maxVerterAttribs,maxVerterUniforms, maxVaryings;
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVerterAttribs);
glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &maxVerterUniforms);
glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
GLint maxVerterTextureUnits,maxCombinedTextureUnits;
glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &maxVerterTextureUnits);
glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxCombinedTextureUnits);
精度限定符
highp lowp mediump
頂點著色器示例
演示如何在頂點著色器中實現(xiàn)如下功能
- 用一個矩陣變化頂點位置
- 進行照明計算,生成逐定點漫射和反射顏色
- 紋理坐標生成
- 頂點蒙皮
- 用紋理查找值代替頂點位置
矩陣變化
描述一個用OpenGLES 著色器語言編寫的簡單頂點著色器.這個頂點著色器獲取一個位置和其相關的顏色數(shù)據(jù)作為輸入或者屬性.用一個4x4矩陣變換位置,并輸出變化后的位置和顏色.
#version 300 es
uniform mat4 u_mvpMatrix;
layout (location = 0) in vec4 a_position;
layout (location = 1) in vec4 a_color;
out vec4 v_color;
void main() {
v_color = a_color;
gl_Position = u_mvpMatrix * a_position;
}
頂點著色器的位置輸入保存為物體坐標,而輸出位置保存為裁剪坐標.
MVP矩陣是3D圖形中進行這種變化的3個非常重要的變化矩陣的乘積:模型矩陣,視圖矩陣和投影矩陣.
組成MVP矩陣的每個單獨矩陣執(zhí)行的變化如下:
- 模型矩陣 ---- 將 物體 坐標變換為 世界 坐標.
- 視圖矩陣 ---- 將 世界 坐標變換為 眼鏡 坐標.
- 投影矩陣 ---- 將 眼睛 坐標變換為 裁剪 坐標.