gpt4 book ai didi

android - 没有 VAO 的 Opengles 2.0

转载 作者:太空宇宙 更新时间:2023-11-04 03:36:40 24 4
gpt4 key购买 nike

我在 opengles 2.0 应用程序上工作得很好,直到我在不支持 VAO 的旧手机上测试它,现在我似乎陷入了沼泽。

我开始使用 opengl,因为 VAO 已经成为一种标准并且无处不在,所以我不必在不使用 opengl 的情况下进行渲染。现在我必须编写支持它的代码,但遇到了一些麻烦。

顶点着色器

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

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

fragment 着色器

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 扩展。

最佳答案

我想发布答案,因为很多小事都错了。首先,我将发布我用来保存 gl 数据的数据结构。

typedef struct
{
GLuint vertexCount;

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

} renderable2d;

第一个问题就在这里。正如@derhass 在 irc channel 上指出的那样,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)它们并将数据放入其中,然后解除绑定(bind)。

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

关于android - 没有 VAO 的 Opengles 2.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32161150/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com