首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >开放2.0无VAO

开放2.0无VAO
EN

Stack Overflow用户
提问于 2015-08-22 21:51:10
回答 2查看 2.6K关注 0票数 1

我一直在开发一个opengles 2.0应用程序,直到我在一部不支持VAO的旧手机上进行了测试,现在我好像掉进了沼泽地。

我开始使用opengl后,VAO的标准,到处都是,所以我从来没有不使用一个渲染。现在我必须编写支持它的代码,我遇到了一些麻烦。

顶点着色机

代码语言:javascript
复制
attribute vec3 position;
attribute vec4 icolor;
varying vec4 fcolor;

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

破片着色机

代码语言:javascript
复制
precision mediump float;
varying vec4 fcolor;
void main (void)
{
gl_FragColor = fcolor;
}

事物的应用方

init代码:

代码语言:javascript
复制
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);

代码语言:javascript
复制
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。这主要是为了提供对开放2.0但不支持GL_OES_vertex_array_object扩展的应用程序的支持。

EN

回答 2

Stack Overflow用户

发布于 2015-08-23 16:46:02

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

代码语言:javascript
复制
typedef struct
{
    GLuint vertexCount;

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

} renderable2d;

第一个问题就在这里。正如@derhass在irc频道指出的,opengles 2.0不支持32位索引。所以第一步是把上面的胶水换成glushort

代码语言:javascript
复制
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];

} 

一旦修复了这个部分,我就不得不生成缓冲区,绑定它们并将数据放入其中,然后解除绑定。

代码语言:javascript
复制
//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);

最后是呈现代码。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-08-23 01:24:10

1) GL_UNSIGNED_INT作为索引类型在ES2.0中不受官方支持

您的GL_UNSIGNED_INT必须是一个GL_UNSIGNED_BYTE或GL_UNSIGNED_SHORT

2)当你使用VBO而不使用VAO时,假设他们是朋友。

代码语言:javascript
复制
glBindBuffer();
glVertexAttribPointer();
glEnableVertexAttribArray(); // you don't call it

在init()

代码语言:javascript
复制
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);

在渲染()

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32161150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档