1

戦略ゲームの非常に初期の前駆体として、.bmp ファイルから地形を生成しています。私のコードでは、BMP ファイルを openGL テクスチャとしてロードし、二重ループを使用して座標 (x, y redChannel) を生成します。次に、(x,y) から (x+1, y+1) までの正方形の三角形を再びダブル ループして生成することにより、インデックスを作成します。しかし、コードを実行すると、ある行の終わりから次の行の最初に向かう余分な三角形ができてしまい、解決できないようです。これは、さまざまな高さと十分に大きなマップを使用するか、少なくともそれ以外の場合は表示されない場合にのみ発生します。

これはコードです:

void Map::setupVertices(GLsizei* &sizeP, GLint * &vertexArray, GLubyte* &colorArray){

    //textureNum is the identifier generated by glGenTextures
    GLuint textureNum = loadMap("heightmap.bmp");

    //Bind the texture again, and extract the needed data
    glBindTexture(GL_TEXTURE_2D, textureNum);
    glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
    glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height);
    GLint i = height*width;
    GLubyte * imageData = new GLubyte[i+1];
    glGetTexImage(GL_TEXTURE_2D,0,GL_RED, GL_UNSIGNED_BYTE, &imageData[0]);

    //Setup varibles: counter (used for counting vertices)
    //VertexArray: pointer to address for storing the vertices. Size: 3 ints per point, width*height points total
    //ColorArray: pointer to address for storing the color data. 3 bytes per point.
    int counter = 0;
    vertexArray = new GLint[height*width*3];
    colorArray = new GLubyte[height*width*3];

    srand(time(NULL));
    //Loop through rows
    for (int y = 0; y < height; y++){
        //Loop along the line
        for (int x=0; x < width; x++){
            //Add vertices: x, y, redChannel
            //Add colordata: the common-color.
            colorArray[counter] = imageData[x+y*width];
            vertexArray[counter++] = x;
            colorArray[counter] = imageData[x+y*width];
            vertexArray[counter++] = y;
            colorArray[counter] =  imageData[x+y*width];//(float) (rand() % 255);
            vertexArray[counter++] = (float)imageData[x+y*width] /255 * maxHeight;
        }
    }
    //"Return" total vertice amount
    sizeP = new GLsizei(counter);

}

void Map::setupIndices(GLsizei* &sizeP, GLuint* &indexArray){
    //Pointer to location for storing indices. Size: 2 triangles per square, 3 points per triangle, width*height triangles
    indexArray = new GLuint[width*height*2*3];
    int counter = 0;
    //Loop through rows, don't go to top row (because those triangles are to the row below)
    for (int y = 0; y < height-1; y++){
        //Loop along the line, don't go to last point (those are connected to second last point)
        for (int x=0; x < width-1; x++){
            //
            //  TL___TR
            //  |  /  |
            //  LL___LR
             int lowerLeft = x + width*y;
             int lowerRight = lowerLeft+1;
             int topLeft = lowerLeft + width+1;
             int topRight =  topLeft + 1;

             indexArray[counter++] = lowerLeft;
             indexArray[counter++] = lowerRight;
             indexArray[counter++] = topLeft;

             indexArray[counter++] = topLeft;
             indexArray[counter++] = lowerRight;
             indexArray[counter++] = topRight;
        }
    }
    //"Return" the amount of indices
    sizeP = new GLsizei(counter);
}

私は最終的にこのコードでこれを描画します:

void drawGL(){
    glPushMatrix();
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3,GL_INT,0,mapHeight);
    glEnableClientState(GL_COLOR_ARRAY);
    glColorPointer(3,GL_UNSIGNED_BYTE,0,mapcolor);
    if (totalIndices != 0x00000000){
        glDrawElements(GL_TRIANGLES, *totalIndices, GL_UNSIGNED_INT, indices);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);
    glPopMatrix();
}

結果の写真は次のとおりです。

http://s22.postimg.org/k2qoru3kx/open_GLtriangles.gif

そして、青い線と黒い背景だけです。 http://s21.postimg.org/5yw8sz5mv/triangle_Error_Blue_Line.gif

また、これらの 1 つが右端で他の方向にも進んでいるように見えますが、今のところ、同じ問題に関連している可能性があると思います。

4

1 に答える 1

0

この部分を単純化します。

         int lowerLeft = x + width * y;
         int lowerRight = (x + 1) + width * y;
         int topLeft = x + width * (y + 1);
         int topRight = (x + 1) + width * (y + 1);

問題topLeft+ 1+ width. これにより、「上部」の頂点が両方とも 1 列だけシフトされます。グリッド内のオフセットに気付かないかもしれません。ご指摘のとおり、高さが変わるまでオフセットは見えません。

また、戻るnew GLsizei(counter)のは少し面倒です。を渡すだけではどうですかGLsizei& counter

これらも一見の価値があるかもしれません。多くのプロシージャル オブジェクトに対してストリップ プリミティブを使用すると、かなりの量のデータを節約できます。

于 2013-10-23T15:18:13.583 に答える