2

我正在从 OGL 即时模式迁移到 VBO。我正在渲染四边形,我的法线在立即模式下工作。但我无法让法线与 VBO 一起正常工作。

设置:

            vertexData = BufferUtils.createFloatBuffer(12);
            vertexData.put(new float[]{xCor[0], yCor[0], zCor[0],xCor[1], yCor[1], zCor[1],xCor[2], yCor[2], zCor[2],xCor[3], yCor[3], zCor[3]});
            vertexData.flip();

            texData = BufferUtils.createFloatBuffer(8);
            texData.put(new float[]{tCor[0],tCor[1],tCor[2],tCor[3],tCor[4],tCor[5],tCor[6],tCor[7]});
            texData.flip();

            normalData = BufferUtils.createFloatBuffer(3);
            normalData.put(new float[]{nCor[0],nCor[1],nCor[2]});
            normalData.flip();

            normalHandle = glGenBuffers();
            glBindBuffer(GL_ARRAY_BUFFER, normalHandle);
            glBufferData(GL_ARRAY_BUFFER, normalData, GL_STATIC_DRAW);
            glBindBuffer(GL_ARRAY_BUFFER, 0);

            vboVertexHandle = glGenBuffers();
            glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
            glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW);
            glBindBuffer(GL_ARRAY_BUFFER, 0);

            vboTexHandle = glGenBuffers();
            glBindBuffer(GL_ARRAY_BUFFER, vboTexHandle);
            glBufferData(GL_ARRAY_BUFFER, texData, GL_STATIC_DRAW);
            glBindBuffer(GL_ARRAY_BUFFER, 0);

渲染:

    glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
    glVertexPointer(3, GL_FLOAT, 0, 0L);

    glBindBuffer(GL_ARRAY_BUFFER, vboTexHandle);
    glTexCoordPointer(2, GL_FLOAT, 0, 0);

    glBindBuffer(GL_ARRAY_BUFFER, normalHandle);
    glNormalPointer(GL_FLOAT,0,0L);


    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);


    glDrawArrays(GL_QUADS, 0, 4);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);

在当前状态下,它只点亮构成四边形的两个三角形中的一个。我明白为什么,但是将缓冲区大小加倍并重复法线向量坐标并不能完全解决它。应该如何将法线向量输入到具有一个四边形(即两个三角形)的 VBO?

4

1 回答 1

2

您的正常数据如何?请记住,每个顶点都包含多个属性,在您的情况下是[position, normal, texture_coordinate].

许多从即时模式过渡的新手都有这样的误解,即“顶点”只是位置。他们对 glNormal 进行了 1 次调用,然后对 glVertex 进行了 3 或 4 次调用,这使他们认为每 3 或 4 个顶点有 1 个法线。不是这种情况。事实上,glVertex 复制了所有其他顶点属性状态,glVertex 的参数提供了位置属性。

更合适的 API 应该是:

glNormal(…);
glPosition(…); /* that one doesn't exist */
glTexCoord(…);
glEmitVertex(); /* doesn't exist either, takes no parmeters */

然而,顶点数组只看到易于使用的数据。所以每个顶点都需要完整的蒙蒂,可以这么说。如果您这样做,则从您的代码中不清楚。但是考虑到您的问题的描述,这听起来很像这个问题。

于 2013-08-23T10:56:03.537 回答