6

で地形を描画しようとしてGL_TRIANGLE_STRIPglDrawElementsますが、背後にあるインデックスのことを理解するのに非常に苦労してい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しかし、それが。でインデックスを使用する正しい方法であるかどうかはわかりませんglDrawElements

  • 0:三角形の最初の頂点からのx座標のインデックス。場所:(-128、-128)。
  • 768:三角形の2番目の頂点からのx座標のインデックス。場所:(-128、-127)
  • 3:三角形の3番目の頂点からのx座標のインデックス。場所:(-127、-128)
  • 771:2番目の三角形を描画する4番目の頂点からのx座標のインデックス。場所:(-127、-127)。

これまでのところすべてが理にかなっていると思いますか?

動作していないのは、上記の場所の値(私がダブルチェックしたものでvArrayあり、それらは正しい)がglDrawElements使用しているものと同じではないということです。2つの三角形が描かれていますが、それらは本来あるべきものよりもはるかに大きくなっています。正しくは(-128、-128)から始まりますが、(-127、-127)ではなく(-125、-125)のようになります。

ここで何が間違っているのか理解できません...

4

1 に答える 1

5

次のようなものを使用すると、私の問題が解決します。

unsigned int indices[] = { 0, 256, 1, 257 };

インデックスがx座標であり、OpenGLがyとzが続くことを期待していると仮定するのは安全だと思いますが、自分で3増やすべきではなく、サーバーがそれを行います。

そして今考えてみると、要素glDrawElementsという単語があります。この場合、で指定された3つの座標を持つ頂点であり、頂点でなく要素にインデックスを渡す必要があります。glVertexPointer

私は今とても愚かだと感じています...

于 2011-04-26T17:44:22.820 に答える