2011-09-01 138 views
4

我是openGL的新手。 IAM使用蘋果的文檔,主修referens http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html#//apple_ref/doc/uid/TP40008793-CH107-SW6在OpenGL ES 1.1和ES 2.0中使用頂點緩衝區對象繪圖

我的問題是,我使用這些清單中所使用的OpenGL ES 1.1 沒有這樣的功能9-3例如glVertexAttribPointerglEnableVertexAttribArray沒有被識別...... :)

我試圖進行本文檔中描述的優化: 將索引和頂點作爲一個包含所有數據的結構:位置,顏色(代碼清單9-1)

typedef struct _vertexStruct 
{ 
    GLfloat position[3]; 
    GLubyte color[4]; 
} VertexStruct; 

const VertexStruct vertices[] = {...}; 
const GLushort indices[] = {...}; 

和使用維也納組織如清單9-2中,9-3

正如我所提到的,一些是用來在那裏的功能不存在在OpenGL ES 1.1。我想知道是否有一種方法可以在ES 1.1中使用其他代碼做同樣的事情?

感謝, 亞歷


編輯根據基督徒回答,試圖用glVertexPointer,glColorPointer。 下面是代碼,它打印的立方體,但沒有顏色... :(任何人,是否有可能使用使用在這樣menner 維也納組織ES 1.1

typedef struct { 
    GLubyte red; 
    GLubyte green; 
    GLubyte blue; 
    GLubyte alpha; 
} Color3D; 

typedef struct { 
    GLfloat x; 
    GLfloat y; 
    GLfloat z; 
} Vertex3D; 

typedef struct{ 
    Vector3D position; 
    Color3D color; 
} MeshVertex; 

多維數據集數據:

static const MeshVertex meshVertices [] = 
{ 

    { { 0.0, 1.0, 0.0 } , { 1.0, 0.0, 0.0 ,1.0 } }, 
    { { 0.0, 1.0, 1.0 } , { 0.0, 1.0, 0.0 ,1.0 } }, 
    { { 0.0, 0.0, 0.0 } , { 0.0, 0.0, 1.0 ,1.0 } }, 
    { { 0.0, 0.0, 1.0 } , { 1.0, 0.0, 0.0, 1.0 } }, 
    { { 1.0, 0.0, 0.0 } , { 0.0, 1.0, 0.0, 1.0 } }, 
    { { 1.0, 0.0, 1.0 } , { 0.0, 0.0, 1.0, 1.0 } }, 
    { { 1.0, 1.0, 0.0 } , { 1.0, 0.0, 0.0, 1.0 } }, 
    { { 1.0, 1.0, 1.0 } , { 0.0, 1.0, 0.0, 1.0 } } 

}; 

static const GLushort meshIndices [] = 
{ 0, 1, 2 , 
    2, 1, 3 , 
    2, 3, 4 , 
    3, 5, 4 , 
    0, 2, 6 , 
    6, 2, 4 , 
    1, 7, 3 , 
    7, 5, 3 , 
    0, 6, 1 , 
    1, 6, 7 , 
    6, 4, 7 , 
    4, 5, 7 
}; 

功能

GLuint vertexBuffer; 
GLuint indexBuffer; 

- (void) CreateVertexBuffers 
{ 
    glGenBuffers(1, &vertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(meshVertices), meshVertices, GL_STATIC_DRAW); 

    glGenBuffers(1, &indexBuffer); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(meshIndices), meshIndices, GL_STATIC_DRAW); 

} 

- (void) DrawModelUsingVertexBuffers 
{ 
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
    glVertexPointer(3, GL_FLOAT, sizeof(MeshVertex), (void*)offsetof(MeshVertex,position)); 
    glEnableClientState(GL_VERTEX_ARRAY); 


    glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(MeshVertex), (void*)offsetof(MeshVertex,color)); 
    glEnableClientState(GL_COLOR_ARRAY); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); 
    glDrawElements(GL_TRIANGLE_STRIP, sizeof(meshIndices)/sizeof(GLushort), GL_UNSIGNED_SHORT, (void*)0); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_COLOR_ARRAY); 
} 

回答

4

功能類似於glVertexAttribPointerglEnableVertexAttribArray用於通用自定義頂點屬性(這是在OpenGL ES 2.0中提交頂點數據的唯一支持方法)。當使用固定功能流水線時(就像在OpenGL ES 1.1中一樣),只需使用內置屬性(考慮調用glVertexglColor,您可能在切換到頂點數組之前使用過)。每個屬性都有與其直接模式相對應的功能,如glVertexPointerglColorPointer(而不是glVertexAttribPointer)。這些數組通過調用gl(En/Dis)ableClientState使用常量,如GL_VERTEX_ARRAYGL_COLOR_ARRAY(而不是gl(En/Dis)ableVertexAttribArray)來啓用/禁用。

但是作爲一般規則,你不應該學習2.0資源的OpenGL ES 1.1編程,因爲許多信息對你來說不會有用(至少如果你是OpenGL的新手)。例如,您的鏈接站點上描述的一些方法在1.1中可能不受支持,如VBO甚至VAO。但是我也必須承認,我完全沒有ES體驗,所以我不太確定。

編輯:關於您更新的代碼:我假設沒有顏色意味着立方體是單一顏色,可能是白色。在你的第一個代碼示例中,你使用了GLubyte color[4],現在它的一些Color3D類型,也許這不適合glColorPointer(4, GL_UNSIGNED_BYTE, ...)調用(其中第一個參數是組件數量,第二個是類型)?

如果您的Color3D類型只包含3種顏色或浮點顏色,我會建議您使用4-ubyte顏色,因爲與您的3個浮點位置一起,您應該獲得完美的16字節對齊頂點,也是和他們在你提供的鏈接中建議的優化。

順便說一下,在你的CreateVertexBuffers函數中重複創建索引緩衝區是一個錯誤,不是嗎?

編輯:您的顏色包含ubytes(範圍從0(黑色)到255(全色)),並且您使用浮動對它們進行初始化。所以你的浮點值1.0(這肯定意味着全色)被轉換爲ubyte,你得到1,與整個[0,255]範圍相比仍然很小,所以一切都是黑色的。當你使用ubytes的時候,你也應該用ubytes來初始化它們,所以在顏色數據中每0.0用0代替,每1.0用255代替。

順便說一下,由於您在ES 1.1中使用VBOs並且至少繪製了一些東西,因此ES 1.1似乎支持VBO。我不知道。但我不確定它是否也支持VAO。

順便說一下,在這兩個函數結束時使用它們之後,您應該調用glBindBuffer(GL_ARRAY_BUFFER, 0)以及元素數組緩衝區。 Othwerwise你可能會遇到其他函數中的問題,它們假設沒有緩衝區,但緩衝區仍然是綁定的。一定要記住,OpenGL是一個狀態機,並且您設置的每個狀態都會保持不變,直到它再次更改或者上下文被破壞。

+0

嘿,謝謝你的回覆,我試着用你提到的功能。使用它們,openGL繪製立方體,但沒有顏色...我通過添加一些代碼來編輯相應的問題,也許你可以給我一些代碼 – alexpov

+0

的建議@alexpov更新了我的答案。 –

+0

立方體是黑色的,是的重複是一個錯字:),修復它。 Color3D沒問題,它是一個帶有4字節組件的結構,我也添加了它的聲明,以及Vertex3D和@alexpov找到它的立方體數據 – alexpov