用glDrawElements很难理解索引

| 我正在尝试用
GL_TRIANGLE_STRIP
glDrawElements
绘制地形,但是我很难理解
glDrawElements
背后的指标... 这是我到目前为止的内容:
void Terrain::GenerateVertexBufferObjects(float ox, float oy, float oz) {
    float startWidth, startLength, *vArray;
    int vCount, vIndex = -1;

    // width = length = 256

    startWidth = (width / 2.0f) - width;
    startLength = (length / 2.0f) - length;

    vCount = 3 * width * length;
    vArray = new float[vCount];

    for(int z = 0; z < length; z++) {
        // vIndex == vIndex + width * 3  ||  width * 3 = 256 * 3 = 768
        for(int x = 0; x < width; x++) {
            vArray[++vIndex] = ox + startWidth + (x * stepWidth);
            vArray[++vIndex] = oy + heights[z][x];
            vArray[++vIndex] = oz + startLength + (z * stepLength);
        }
    }

    glGenBuffers(1, &vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(float) * vCount, vArray, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

void Terrain::DrawVBO(unsigned int texID, float ox, float oy, float oz) {
    float terrainLight[] = { 1.0f, 1.0f, 1.0f, 1.0f };

    if(!generatedVBOs) {
        GenerateVertexBufferObjects(ox, oy, oz);
        generatedVBOs = true;
    }

    unsigned int indices[] = { 0, 768, 3, 771 };

    glGenBuffers(1, &indexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * 4, indices, GL_STATIC_DRAW);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

    glEnableClientState(GL_VERTEX_ARRAY);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glVertexPointer(3, GL_FLOAT, 0, 0);

    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);

    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, terrainLight);
    glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, 0);

    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

    glDisableClientState(GL_VERTEX_ARRAY);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}
我相信我的
vArray
是正确的,在使用
glBegin(GL_TRIANGLE_STRIP)/glEnd
进行绘制时我使用相同的值,效果很好。 我的猜测是每个顶点仅使用
x
坐标的索引。但是我不知道这是使用带有ѭ1的索引的正确方法。 0:从三角形的第一个顶点开始的x坐标的索引。位置:(-128,-128)。 768:从三角形的第二个顶点开始的x坐标的索引。位置:(-128,-127) 3:从三角形的第三个顶点开始的x坐标的索引。位置:(-127,-128) 771:第四个顶点的x坐标索引,它将绘制第二个三角形。位置:(-127,-127)。 我认为到目前为止,一切都有意义吗? 无效的是,上面的位置值(我在
vArray
上进行了两次检查,它们是正确的)与
glDrawElements
正在使用的位置值不同。绘制了两个三角形,但它们比应有的要大得多。它可以正确地从(-128,-128)开始,但会转到(-125,-125)而不是(-127,-127)。 我不明白我在做什么错...     
已邀请:
使用类似以下的内容可以解决我的问题:
unsigned int indices[] = { 0, 256, 1, 257 };
我认为可以安全地假设索引为x坐标,并且OpenGL期望索引后跟y和z,但我们不应该自己增加3,服务器会为我们完成。 现在我想一想,
glDrawElements
上面有词元素,在这种情况下,是is3ѭ中指定的具有3个坐标的顶点,我们需要将索引传递给元素,而不是顶点。 我现在好笨     

要回复问题请先登录注册