Opengl 含元素的难理解指数

Opengl 含元素的难理解指数,opengl,vertex-buffer,vertex-array,indices,Opengl,Vertex Buffer,Vertex Array,Indices,我试图用GL\u三角形\u条带和gldrawerelements绘制地形,但我很难理解gldrawerelements背后的索引 以下是我目前掌握的情况: void Terrain::GenerateVertexBufferObjects(float ox, float oy, float oz) { float startWidth, startLength, *vArray; int vCount, vIndex = -1; // width = length =

我试图用
GL\u三角形\u条带
gldrawerelements
绘制地形,但我很难理解
gldrawerelements
背后的索引

以下是我目前掌握的情况:

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);
}
void地形::GenerateVertexBufferObjects(浮动ox、浮动oy、浮动oz){
浮起的星星数,惊人的长度,*瓦雷;
int vCount,vIndex=-1;
//宽度=长度=256
起始宽度=(宽度/2.0f)-宽度;
惊人长度=(长度/2.0f)-长度;
vCount=3*宽度*长度;
vArray=新浮点[vCount];
对于(int z=0;z
我相信我的
vArray
是正确的,我使用
glBegin(GL\u TRIANGLE\u STRIP)/glEnd
绘制时使用相同的值,效果很好

我的猜测是只使用每个顶点的
x
坐标索引。但我不知道这是否是将索引与
glpaurements
一起使用的正确方法

  • 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,服务器为我们做

现在我想一想,
glpaurements
上面有单词element,在本例中,它是一个顶点,有3个坐标,如
glvertexpinter
中指定的,我们需要将索引传递给元素,而不是顶点


我现在觉得自己太笨了……

传递给GLDrawerElements的索引应该与调用glVertex3fv(&vArray[index])时在glBegin/glEnd之间使用的索引相同。你确定问题不在别处吗?你确定创建的缓冲区正确吗(正确的大小/索引)?我从未将索引与
glBegin/glEnd
一起使用过,所以我不知道,我将坐标直接传递给
glVertex
。我什么都不确定,我只是开始学习VBO,而且示例很少。你在问题中只提到二维位置,但使用三维顶点。这是故意的吗?@pmr:是的,他在三维空间中有一个由顶点组成的二维网格@Nazgulled:尝试一些类似于我发布的使用glBegin/glEnd索引的语法。这将有助于确定问题是在缓冲区设置中还是在索引计算中。