簡介
OpenGL函式。void glVertexAttribPointer( GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride,const GLvoid * pointer);
參數:
pointer
指定一個指針,指向數組中第一個頂點屬性的第一個組件。初始值為0。
stride
指定連續頂點屬性之間的偏移量。如果為0,那么頂點屬性會被理解為:它們是緊密排列在一起的。初始值為0。
normalized
指定當被訪問時,固定點數據值是否應該被歸一化(GL_TRUE)或者直接轉換為固定點值(GL_FALSE)。
type
指定數組中每個組件的數據類型。可用的符號常量有GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT,GL_UNSIGNED_SHORT, GL_FIXED, 和 GL_FLOAT,初始值為GL_FLOAT。
size
指定每個頂點屬性的組件數量。必須為1、2、3或者4。初始值為4。(夢維:如position是由3個(x,y,z)組成,而顏色是4個(r,g,b,a))
index
指定要修改的頂點屬性的索引值
描述
glVertexAttribPointer 指定了渲染時索引值為 index 的頂點屬性數組的數據格式和位置。size指定每個屬性值的組件數量且必須為1、2、3、4之一。type指定每個組件的數據格式,stride指定了一個屬性到下一個屬性之間的步長(這就允許屬性值被存儲在單一數組或者不同的數組中)。當數組中的值被訪問並被轉換至浮點值時,如果normalized被設定為GL_TRUE,意味著整數型的值會被映射至區間[-1,1](有符號整數),或者區間[0,1](無符號整數),反之,這些值會被直接轉換為浮點值而不進行歸一化處理。如果一個名稱非零的緩衝對象被綁定至GL_ARRAY_BUFFER目標(見glBindBuffer)且此時一個定點屬性數組被指定了,那么pointer被當做該緩衝對象數據存儲區的位元組偏移量。並且,緩衝對象綁定(GL_ARRAY_BUFFER_BINDING)會被存為索引為index的頂點屬性數組客戶端狀態(GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING);(Also, the buffer object binding (GL_ARRAY_BUFFER_BINDING) is saved as generic vertex attribute array client-side state (GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) for index index.)
當一個頂點屬性數組被指定時,除了當前的頂點數組緩衝對象綁定,size, type, normalized, stride, 和 pointer 也會被存為客戶端狀態
要啟用或者禁用頂點屬性數組,調用glEnableVertexAttribArray和glDisableVertexAttribArray傳入參數index。如果啟用,那么當glDrawArrays或者glDrawElements被調用時,頂點屬性數組會被使用。
注意
當glDrawArrays或者glDrawElements被調用時,每個頂點屬性數組初始狀態是禁用的,不會被訪問。glVertexAttribPointer一般在客戶端實現。
錯誤
GL_INVALID_ENUM錯誤:如果 type 不是可接受的值。GL_INVALID_VALUE錯誤: 如果 index 大於等於 GL_MAX_VERTEX_ATTRIBS.
GL_INVALID_VALUE錯誤: 如果 size 不是 1, 2, 3, 或 4.
GL_INVALID_VALUE錯誤: 如果 stride 小於零.
實例
cocos2D-x中CCNode的畫圖函式void CCTexture2D::drawAtPoint(const CCPoint& point)
{
GLfloat coordinates[] = {
0.0f, m_fMaxT,
m_fMaxS,m_fMaxT,
0.0f, 0.0f,
m_fMaxS,0.0f };
GLfloat width = (GLfloat)m_uPixelsWide * m_fMaxS,
height = (GLfloat)m_uPixelsHigh * m_fMaxT;
GLfloat vertices[] = {
point.x, point.y,
width + point.x, point.y,
point.x, height + point.y,
width + point.x, height + point.y };
ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position | kCCVertexAttribFlag_TexCoords );
m_pShaderProgram->use();
m_pShaderProgram->setUniformsForBuiltins();
ccGLBindTexture2D( m_uName );
glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices);
glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, 0, coordinates);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}