2015-08-22 333 views
1

我一直在努力開發一個opengles 2.0應用程序,直到我在一個不支持VAO的舊手機上測試它,現在我似乎陷入了沼澤。Opengles 2.0沒有VAO

我開始使用opengl之後VAO的標準和無處不在,所以我從來不必使用渲染。現在我必須編寫支持它的代碼,我遇到了一些麻煩。

頂點着色器

attribute vec3 position; 
attribute vec4 icolor; 
varying vec4 fcolor; 

void main() 
{ 
    gl_Position = vec4(position, 1.0); 
    fcolor = icolor; 
} 

片段着色器

precision mediump float; 
varying vec4 fcolor; 
void main (void) 
{ 
gl_FragColor = fcolor; 
} 

的事情應用側

初始化代碼:

glGenBuffers(1, &verticesBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, verticesBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(rend2d->vertices), rend2d->vertices, GL_STATIC_DRAW); 

glGenBuffers(1, &indicesBuffer); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(rend2d->indices), rend2d->indices, GL_STATIC_DRAW); 

glGenBuffers(1, &colorBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, colorBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(rend2d->colors), rend2d->colors, GL_STATIC_DRAW); 

呈現代碼: glClearColor(1.0f,1.0f,1.0f,1.0f); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(sp);

GLint posLoc = glGetAttribLocation(sp, "position"); 
GLint colLoc = glGetAttribLocation(sp, "icolor"); 

glBindBuffer(GL_ARRAY_BUFFER, verticesBuffer); 
glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); 

glBindBuffer(GL_ARRAY_BUFFER, colorBuffer); 
glVertexAttribPointer(colLoc, 4, GL_FLOAT, GL_FALSE, 0, 0); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer); 

glDrawElements(GL_TRIANGLES, rend2d->vertexCount, GL_UNSIGNED_INT, 0); 

我的錯誤可能是有目共睹,但我只是不想看到我目前沒有做正確的部分,並希望能得到一些幫助,半現代的OpenGL。這主要是爲支持opengles 2.0的應用程序提供支持,但不支持擴展名爲GL_OES_vertex_array_object的

+2

我在代碼中看不到任何'glEnableVertexAttribArray()'調用。每個屬性的啓用狀態也存儲在VAO中。 – derhass

回答

0

1)GL_UNSIGNED_INT沒有正式支持在ES 2.0爲指數型

您GL_UNSIGNED_INT必須是一個GL_UNSIGNED_BYTE或GL_UNSIGNED_SHORT

2)假設當您使用VBO沒有他們是朋友VAO。

glBindBuffer(); 
glVertexAttribPointer(); 
glEnableVertexAttribArray(); // you don't call it 

在的init()

GLint posLoc = glGetAttribLocation(sp, "position"); 
GLint colLoc = glGetAttribLocation(sp, "icolor"); 

glGenBuffers(1, &verticesBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, verticesBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(rend2d->vertices), rend2d->vertices, GL_STATIC_DRAW); 
glEnableVertexAttribArray(posLoc); 
glVertexAttribPointer(posLoc, GL_FLOAT,0,0,0); 

glGenBuffers(1, &colorBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, colorBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(rend2d->colors), rend2d->colors, GL_STATIC_DRAW); 
glEnableVertexAttribArray(colLoc) 
glVertexAttribPointer(colLoc, GL_FLOAT,0,0,0); 

在渲染()

glBindBuffer(GL_ARRAY_BUFFER, verticesBuffer); 
glEnableVertexAttribArray(posLoc); 
glVertexAttribPointer(posLoc, GL_FLOAT,0,0,0); 

glBindBuffer(GL_ARRAY_BUFFER, colorBuffer); 
glEnableVertexAttribArray(colLoc) 
glVertexAttribPointer(colLoc, GL_FLOAT,0,0,0); 

3)只是不要在ES 2.0中使用VAOs其中,VAO不正式支持。但是,IOS是個例外。

+0

我不明白在代碼中調用glEnableVertexAttribArray,如果我按照上面指定的順序調用它,我仍然沒有渲染輸出。 – user1610950

+0

@ user1610950已更新。嘗試一下。 – Sung

1

我想發佈答案,因爲它是很多小錯誤的東西。首先,我將發佈我用來保存我的gl數據的數據結構。

typedef struct 
{ 
    GLuint vertexCount; 

    GLfloat vertices[12]; 
    GLfloat colors[16]; 
    GLuint indices[6]; 
    GLfloat texCoords[8]; 

} renderable2d; 

第一個問題在這裏。正如@derhass在irc頻道上指出的,opengles 2.0不支持32位索引。所以第一步是要高於gluint改變glushort

typedef struct 
{ 
    GLushort vertexCount; //I made this a short as well 

    GLfloat vertices[12]; 
    GLfloat colors[16]; 
    GLushort indices[6]; //make this a short instead of an int 
    GLfloat texCoords[8]; 

} 

一旦這部分是固定的,然後我不得不產生我的緩衝區,將它們綁定並把數據在其中,然後解除綁定。

//bind n setup vertices 
glGenBuffers(1, &verticesBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, verticesBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(rend2d->vertices), rend2d->vertices, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

//bind n setup colors 
glGenBuffers(1, &colorBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, colorBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(rend2d->colors), rend2d->colors, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

//bind n setup indices 
glGenBuffers(1, &indicesBuffer); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(rend2d->indices), rend2d->indices, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

終於上做的一切,我得到的東西在兩臺設備上整理出來後,渲染代碼

glClearColor(0.2f, 0.3f, 0.3f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT); 

glUseProgram(sp); 

glBindBuffer(GL_ARRAY_BUFFER, verticesBuffer); 
glEnableVertexAttribArray(posLoc); 
glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, 0); 

glBindBuffer(GL_ARRAY_BUFFER, colorBuffer); 
glEnableVertexAttribArray(colLoc); 
glVertexAttribPointer(colLoc, 4, GL_FLOAT, GL_FALSE, 0, 0); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer); 
glDrawElements(GL_TRIANGLES, rend2d->vertexCount, GL_UNSIGNED_SHORT, 0); 

。爲了清晰起見,rend2d只是一個帶紋理的四邊形,所以rend2d->vertexCount = 6;對於更復雜的模型,您會在其他地方獲得該信息。