2015-08-22 331 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;对于更复杂的模型,您会在其他地方获得该信息。