1

したがって、私のコードのサブセット(もちろんレンダリングループ内)は次のとおりです。

    for(int x=0;x<data.length;x++) 
        for(int y=0;y<data[0].length;y++) {

            float r = colorData[x][y][0], g = colorData[x][y][1], b = colorData[x][y][2];
            glGetError();
            glColor3f(r,g,b);
            int xCoord = x*100;
            int yCoord = y*100;
            int height = (int) Math.round(data[y][x]*25);

            glBegin(GL_QUADS);


                //Top
                glVertex3f(xCoord,yCoord,height);
                glVertex3f(xCoord+100,yCoord,height);
                glVertex3f(xCoord+100,yCoord+100,height);
                glVertex3f(xCoord,yCoord+100,height);
                //*/

                //Sides
                glColor3f(r/2,g/2,b/2);          
                glVertex3f(xCoord,yCoord,height);
                glVertex3f(xCoord,yCoord,0);
                glVertex3f(xCoord+100,yCoord,0);
                glVertex3f(xCoord+100,yCoord,height);

                glVertex3f(xCoord,yCoord+100,height);
                glVertex3f(xCoord+100,yCoord+100,height);
                glVertex3f(xCoord+100,yCoord+100,0);
                glVertex3f(xCoord,yCoord+100,0);

                glVertex3f(xCoord,yCoord+100,height);
                glVertex3f(xCoord,yCoord+100,0);
                glVertex3f(xCoord,yCoord,0);
                glVertex3f(xCoord,yCoord,height);

                glVertex3f(xCoord+100,yCoord+100,height);
                glVertex3f(xCoord+100,yCoord,height);
                glVertex3f(xCoord+100,yCoord,0);
                glVertex3f(xCoord+100,yCoord+100,0);

                //Bottom
                glColor3f(r/4,g/4,b/4);
                glVertex3f(xCoord,yCoord,0);
                glVertex3f(xCoord,yCoord+100,0);
                glVertex3f(xCoord+100,yCoord+100,0);
                glVertex3f(xCoord+100,yCoord,0);



            glEnd();
            int err =  glGetError();
            if(err != GL_NO_ERROR)
                 System.out.println("An error has occured: #"+err);
            glColor3f(1,0,0);
            glBegin(GL_LINES);
                //Top
                glVertex3f(xCoord,yCoord,height);
                glVertex3f(xCoord+100,yCoord,height);
                glVertex3f(xCoord+100,yCoord+100,height);
                glVertex3f(xCoord,yCoord+100,height);
            glEnd();                
        }

コードは正しく機能し、ボックスの側面が上部よりもわずかに暗い 2 次元グリッドのボックスを描画します。(貧乏人の照明)

好奇心のために、箱の上部が無色になり、側面が同じままであることを期待して、glColor3f への最初の呼び出しを取り出しました。ただし、ボックスのグリッド全体が白くなります。どうしてこれなの?ここのコードに何かありますか?または、私のレンダー ループの他の部分がこれを引き起こしているのでしょうか?

(違いがある場合は、LWJGL の OpenGL1.1 の Java 実装を使用しています)

4

1 に答える 1

2

OpenGL 即時モードは、このように少し動作します (疑似コード)

glColor3f(r,g,b){
state.color.{r,g,b} = r,g,b;
}

glNormal(x,y,z){
state.normal.{x,y,z} = x,y,z;
}

/* and so on */

glVertex3f(x,y,z){
    send_vertex_to_rasterizer(state.color, state.normal, ..., {x,y,z})
}

つまり、OpenGL は最後に設定した色を記憶しており、それを別の色に変更するまで後続のすべての頂点に適用し、その色を適用します。

于 2012-05-25T09:09:35.447 に答える