我正在努力开发一个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 扩展名。
答案 0 :(得分: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位索引。所以第一步是将上面的胶合物改为 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;
对于更复杂的模型,你可以在其他地方获得这些信息。
答案 1 :(得分:0)
1)ES 2.0中没有正式支持 GL_UNSIGNED_INT 作为索引类型
您的GL_UNSIGNED_INT必须是 GL_UNSIGNED_BYTE或GL_UNSIGNED_SHORT
2)在没有VAO的情况下使用VBO时,假设他们是朋友。
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中使用VAO,其中VAO不受官方支持。但是,IOS作为例外。