使用IBO与glDrawElements和GLSL显示不正确

时间:2014-01-27 12:03:15

标签: opengl glsl shader opengl-3

我写了一个简单的OpenGL程序来绘制一个简单的uv映射立方体(在Blender上创建)。但输出不正确。

enter image description here

这是OBJ文件内容:

o Cube
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -0.999999
v 0.999999 1.000000 1.000001
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
vt 0.626059 0.265705
vt 0.626059 0.487398
vt 0.404365 0.487398
vt 0.626060 0.930786
vt 0.404365 0.930786
vt 0.404365 0.709091
vt 0.847752 0.487397
vt 0.847753 0.709091
vt 0.626059 0.709091
vt 0.182672 0.487397
vt 0.626059 0.044011
vt 0.404366 0.265704
vt 0.182671 0.709091
vt 0.404366 0.044011
usemtl BoxMtl
s off
f 1/1 2/2 3/3
f 5/4 8/5 7/6
f 1/7 5/8 6/9
f 2/2 6/9 3/3
f 3/3 7/6 4/10
f 5/11 1/1 4/12
f 4/12 1/1 3/3
f 6/9 5/4 7/6
f 2/2 1/7 6/9
f 6/9 7/6 3/3
f 7/6 8/13 4/10
f 8/14 5/11 4/12

所以这是顶点位置数组:

static GLfloat position[24] =
{
    1.000000, -1.000000, -1.000000,
    1.000000, -1.000000, 1.000000,
    -1.000000, -1.000000, 1.000000,
    -1.000000, -1.000000, -1.000000,
    1.000000, 1.000000, -0.999999,
    0.999999, 1.000000, 1.000001,
    -1.000000, 1.000000, 1.000000,
    -1.000000, 1.000000, -1.000000
};

顶点纹理坐标数组:

static GLfloat texture[28] = {
    0.626059, 0.265705,
    0.626059, 0.487398,
    0.404365, 0.487398,
    0.626060, 0.930786,
    0.404365, 0.930786,
    0.404365, 0.709091,
    0.847752, 0.487397,
    0.847753, 0.709091,
    0.626059, 0.709091,
    0.182672, 0.487397,
    0.626059, 0.044011,
    0.404366, 0.265704,
    0.182671, 0.709091,
    0.404366, 0.044011
};

这是索引缓冲区的一个命题:

static GLuint indices[72] = {
    0, 1, 2, 0, 1, 2,
    4, 7, 6, 3, 4, 5,
    0, 4, 5, 6, 7, 8,
    1, 5, 2, 1, 8, 2,
    2, 6, 3, 2, 5, 9,
    4, 0, 3, 10, 0, 11,
    3, 0, 2, 11, 0, 2,
    5, 4, 6, 8, 3, 5,
    1, 0, 5, 1, 6, 8,
    5, 6, 2, 8, 5, 2,
    6, 7, 3, 5, 12, 9,
    7, 4, 3, 7, 10, 11
};

语法如下(但我不确定它是否正确):

v1, v2, v3, vt1, vt2, vt3,
v4, v5, v6, vt4, vt5, vt6,
etc.

现在这里是初始化VBO和IBO的代码:

GLuint vertex_vboId;
glGenBuffers(1, &vertex_vboId);

glBindBuffer(GL_ARRAY_BUFFER, vertex_vboId);
glBufferData(GL_ARRAY_BUFFER, 24 * sizeof(GLfloat), position, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

GLuint texture_vboId;
glGenBuffers(1, &texture_vboId);

glBindBuffer(GL_ARRAY_BUFFER, texture_vboId);
glBufferData(GL_ARRAY_BUFFER, 28 * sizeof(GLfloat), texture, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

GLuint indexId;
glGenBuffers(1, &indexId);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 36 * sizeof(GLuint), indices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

最后是主循环中的代码:

#define OFFSET_BUFFER(offset) ((char*)NULL + (offset))

[..]

glEnableVertexAttribArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, vertex_vboId);
            glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, OFFSET_BUFFER(0));
        glBindBuffer(GL_ARRAY_BUFFER, 0);

        glEnableVertexAttribArray(2);
        glBindBuffer(GL_ARRAY_BUFFER, texture_vboId);
            glBindTexture(GL_TEXTURE_2D, textureID);
            glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, OFFSET_BUFFER(0));
        glBindBuffer(GL_ARRAY_BUFFER, 0);

        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexId);
            glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, OFFSET_BUFFER(0));
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

        glDisableVertexAttribArray(2);
        glDisableVertexAttribArray(0);

我输了,但我几乎可以肯定问题来自索引数组的配置,但我找不到解决方案。也许我必须为每个VBO调用glDrawElements但我想要一个简单的。属于你,如果索引缓冲区是正确的,语法是否正确?有人可以帮助我吗?

0 个答案:

没有答案