ios - 设置索引和顶点数组 openGL ES

标签 ios iphone opengl-es indices

我正在为我的应用开发一个 .obj 加载器,为此,我设置了一个索引数组和一个顶点数组,并在运行时初始化它们。

结构是这样定义的:

typedef struct {
    float Position[3];
    float Color[4];
    float TexCoord[2];
} Vertex;

typedef struct {
    GLuint  v1;
    GLuint  v2;
    GLuint  v3;
} Face3D;

数组在 .h 文件中是这样的:

Vertex* VerticesArr;
Face3D* Faces;

但是当我初始化它们时,我在屏幕上看不到任何东西,而不是使用这种方式:

const Vertex Vertices[] = {
    {{1, -1, 0}, {1, 0, 0, 1},{0,0}},
    {{1, 1, 0}, {0, 1, 0, 1},{0,0}},
    {{-1, 1, 0}, {0, 0, 1, 1},{0,0}},
    {{-1, -1, 0}, {0, 0, 0, 1},{0,0}}
};

const GLubyte Indices[] = {
    0, 1, 2,
    2, 3, 0
};

通过使用这些常量数组,我可以在屏幕上绘制图形。

我的问题是,是否可以像我一样使用索引和顶点数组? 我相信它是,它似乎是错误的。

这就是我在前面介绍的两种方式上设置我的 VBO 的方式:

- (void)setupVBOs {

    GLuint vertexBuffer;
    glGenBuffers(1, &vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(VerticesArr), VerticesArr, GL_STATIC_DRAW);

    GLuint indexBuffer;
    glGenBuffers(1, &indexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Faces), Faces, GL_STATIC_DRAW);

}

以及我使用绘制元素的方式:

glDrawElements(GL_POINTS, sizeof(Faces)/sizeof(Faces[0]), GL_UNSIGNED_INT, 0);

我确实检查了两个数组是否都按照它们应该的方式进行了初始化,并且确实如此。

这是我为他们分配空间的方式:

// Allocate space for the Vertices array
NSLog(@"Size of vertice is: %lu",sizeof(Vertex));
VerticesArr = (Vertex*)(malloc(sizeof(Vertex) * vertexCombinations.count));
// Allocate space for the Faces
NSLog(@"Size of face is: %lu",sizeof(Face3D));
Faces = (Face3D*)(malloc(sizeof(Face3D)*faceCount));

最佳答案

我看到的第一个问题是在这部分代码中:

- (void)setupVBOs {

    GLuint vertexBuffer;
    glGenBuffers(1, &vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(VerticesArr), VerticesArr, GL_STATIC_DRAW);

    GLuint indexBuffer;
    glGenBuffers(1, &indexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Faces), Faces, GL_STATIC_DRAW);

}

当您创建常量数组时,sizeof(Faces) 将返回数组的大小,但是当您动态分配它们时,sizeof(Faces) 将返回数组的大小一个指针(通常是 4 个字节)。我看到的第二个问题是,在静态分配期间,您的索引是 GLUByte,但在 Face3D 中,它们是 GLUInt。不确定这是否是一个问题,但看起来可能是。

关于ios - 设置索引和顶点数组 openGL ES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21869127/

相关文章:

objective-c - 如何使用数组使按钮按特定顺序播放声音?

iphone - 字节 自 千字节

ios - 从 google api 获取 EN、IT、FR、DE、ES 本地化城市名称

ios - raywenderlich 的 AFNetworking 教程不在表格单元格上显示数据

java - JAVA和iOS的HMAC结果不同

iphone - 构建数组的数组

ios - OpenGL ES 纹理部分移除

ios - 如何避免 iOS OpenGL ES 应用程序自动旋转时的瞬间拉伸(stretch)

android - 更改 GlSurfaceView 渲染器

ios - 在运行时和方向更改期间居中和sizeToFit subview