gpt4 book ai didi

objective-c - OpenGL ES 1.1 顶点缓冲对象不工作

转载 作者:搜寻专家 更新时间:2023-10-30 19:48:18 25 4
gpt4 key购买 nike

我正在使用 OpenGL ES 1.1 开发一款 iPhone 游戏,需要使用顶点缓冲对象才能在不降低性能的情况下渲染 500 多个粒子。

我的游戏能够使用非 VBO 方法成功绘制,但现在我已经尝试合并 VBO,不再绘制任何东西。

请帮我找出我做错了什么,并提供一个正确的例子。

我有一个名为 TexturedQuad 的类,它包含以下内容:

// TexturedQuad.h

enum {
ATTRIB_POSITION,
ATTRIB_TEXTURE_COORD
};

@interface TexturedQuad : NSObject {

GLfloat *textureCoords; // 8 elements for 4 points (u and v)
GLfloat *vertices; // 8 elements for 4 points (x and y)
GLubyte *indices; // how many elements does this need?

// vertex buffer array IDs generated using glGenBuffers(..)
GLuint vertexBufferID;
GLuint textureCoordBufferID;
GLuint indexBufferID;

// ...other ivars
}

// @synthesize in .m file for each property
@property (nonatomic, readwrite) GLfloat *textureCoords;
@property (nonatomic, readwrite) GLfloat *vertices;
@property (nonatomic, readwrite) GLubyte *indices;
@property (nonatomic, readwrite) GLuint vertexBufferID;
@property (nonatomic, readwrite) GLuint textureCoordBufferID;
@property (nonatomic, readwrite) GLuint indexBufferID;

// vertex buffer object methods
- (void) createVertexBuffers;
- (void) createTextureCoordBuffers;
- (void) createIndexBuffer;

TexturedQuad.m 中,创建了顶点缓冲区:

- (void) createVertexBuffers {
glGenBuffers(1, &vertexBufferID);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
}

- (void) createTextureCoordBuffers {
glGenBuffers(1, &textureCoordBufferID);
glBindBuffer(GL_ARRAY_BUFFER, textureCoordBufferID);
glBufferData(GL_ARRAY_BUFFER, sizeof(textureCoords), textureCoords, GL_STATIC_DRAW);
}

- (void) createIndexBuffer {
glGenBuffers(1, &indexBufferID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLubyte) * 16, indices, GL_STATIC_DRAW);
}

上述 VBO 创建方法由自定义 AtlasLibrary 类调用,该类初始化每个 TexturedQuad 实例。

首先,顶点按以下格式排列:

// bottom left
quad.vertices[0] = xMin;
quad.vertices[1] = yMin;

// bottom right
quad.vertices[2] = xMax;
quad.vertices[3] = yMin;

// top left
quad.vertices[4] = xMin;
quad.vertices[5] = yMax;

// top right
quad.vertices[6] = xMax;
quad.vertices[7] = yMax;

其次,纹理坐标按以下格式排列(翻转以说明 OpenGL ES 的镜像倾向):

// top left (of texture)
quad.textureCoords[0] = uMin;
quad.textureCoords[1] = vMax;

// top right
quad.textureCoords[2] = uMax;
quad.textureCoords[3] = vMax;

// bottom left
quad.textureCoords[4] = uMin;
quad.textureCoords[5] = vMin;

// bottom right
quad.textureCoords[6] = uMax;
quad.textureCoords[7] = vMin;

...接下来,调用 VBO 创建方法(在 AtlasLibrary 中)

[quad createVertexBuffers];
[quad createTextureCoordBuffers];
[quad createIndexBuffer];

现在是肉和土 bean 。 场景对象 类。场景对象是游戏中可渲染的对象。它们引用 TexturedQuad 实例并包含有关旋转、平移和缩放的信息。

这是 SceneObject 中的渲染方法:

- (void) render {

// binds texture in OpenGL ES if not already bound
[[AtlasLibrary sharedAtlasLibrary] ensureContainingTextureAtlasIsBoundInOpenGLES:self.containingAtlasKey];

glPushMatrix();

glTranslatef(translation.x, translation.y, translation.z);

glRotatef(rotation.x, 1, 0, 0);
glRotatef(rotation.y, 0, 1, 0);
glRotatef(rotation.z, 0, 0, 1);

glScalef(scale.x, scale.y, scale.z);

// change alpha
glColor4f(1.0, 1.0, 1.0, alpha);

// vertices
glBindBuffer(GL_ARRAY_BUFFER, texturedQuad.vertexBufferID);
glVertexAttribPointer(ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT), &texturedQuad.vertices[0]);


// texture coords
glBindBuffer(GL_ARRAY_BUFFER, texturedQuad.textureCoordBufferID);
glVertexAttribPointer(ATTRIB_TEXTURE_COORD, 2, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT), &texturedQuad.textureCoords[0]);

// bind index buffer array
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, texturedQuad.indexBufferID);

// draw
glDrawElements(GL_TRIANGLE_STRIP, sizeof(texturedQuad.indices) / sizeof(texturedQuad.indices[0]), GL_UNSIGNED_BYTE, texturedQuad.indices);

glPopMatrix();
}

我有一种强烈的感觉,要么我的索引数组结构不正确,要么 glDrawElements(..) 函数调用不正确。

要回答这个问题,请:

  • 指出我做错了什么会导致 OpenGL ES 无法绘制我的场景对象。
  • 提供正确的方法来做我想做的事情(请根据我的框架)
  • 提供任何可能有帮助的建议或链接(可选)

非常感谢!

最佳答案

我对 OpenGL 和 OpenGL ES 之间的差异没有经验,但我没有看到对 glEnableVertexAttribArray() 的任何调用在您的代码中。

OpenGL ES 1.1 docs 中可疑地缺少该函数, 但在 2.0 , 并用于 Apple's OpenGL ES VBO article (感谢 JSPerfUnkn0wn)。

以下是关于 Vertex Buffer Objects 的其他一些不错的(尽管是非 ES)教程, 和 Index Buffer Objects .

关于objective-c - OpenGL ES 1.1 顶点缓冲对象不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8554257/

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