glVertexAttribPointer

glVertexAttribPointer 指定了渲染時索引值為 index 的頂點屬性數組的數據格式和位置。

簡介,描述,注意,錯誤,實例,

簡介

OpenGL函式。
void glVertexAttribPointer( GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride,const GLvoid * pointer);
參數:
index
指定要修改的頂點屬性的索引值
size
指定每個頂點屬性的組件數量。必須為1、2、3或者4。初始值為4。(如position是由3個(x,y,z)組成,而顏色是4個(r,g,b,a))
type
指定數組中每個組件的數據類型。可用的符號常量有GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT,GL_UNSIGNED_SHORT, GL_FIXED, 和 GL_FLOAT,初始值為GL_FLOAT。
normalized
指定當被訪問時,固定點數據值是否應該被歸一化(GL_TRUE)或者直接轉換為固定點值(GL_FALSE)。
stride
指定連續頂點屬性之間的偏移量。如果為0,那么頂點屬性會被理解為:它們是緊密排列在一起的。初始值為0。
pointer
指定第一個組件在數組的第一個頂點屬性中的偏移量。該數組與GL_ARRAY_BUFFER綁定,儲存於緩衝區中。初始值為0;

描述

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 };         m_pShaderProgram->use();     m_pShaderProgram->setUniformsForBuiltins();        ccGLBindTexture2D( m_uName );           ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position | kCCVertexAttribFlag_TexCoords );     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); }

相關詞條

熱門詞條

聯絡我們