C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了objective-c – OpenGL ES 1.1顶点缓冲区对象不起作用大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用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];

现在的肉和土豆. SceneObject类. SceneObjects是游戏中可渲染的对象.它们引用TexturedQuad实例并包含有关旋转,平移和缩放的信息.

这是SceneObject中的render方法

- (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);
    glRotatef(rotation.y,0);
    glRotatef(rotation.z,1);

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

    // change alpha
    glColor4f(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,&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不能绘制我的SceneObjects.
>提供正确的方法来做我想做的事情(请根据我的框架)
>提供任何可能有用的建议或链接(可选)

非常感谢!

解决方法

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

功能OpenGL ES 1.1 docs中可疑缺失,但是在2.0,并且正在Apple’s OpenGL ES VBO article中使用(感谢JSPerfUnkn0wn).

以下是Vertex Buffer ObjectsIndex Buffer Objects上的一些其他优秀(但非ES)教程.

大佬总结

以上是大佬教程为你收集整理的objective-c – OpenGL ES 1.1顶点缓冲区对象不起作用全部内容,希望文章能够帮你解决objective-c – OpenGL ES 1.1顶点缓冲区对象不起作用所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。