2

このコードを使用して、LWJGL を使用して異なる色の異なる立方体を描画しています。

    GL11.glBegin(GL11.GL_QUADS);
        GL11.glColor3f(rcol.x, rcol.y, rcol.z); // Color Vector
        GL11.glVertex3f(rpos.x + rsiz.x, rpos.y + rsiz.y, rpos.z - rsiz.z);         // Top Right Of The Quad (Top)
        GL11.glVertex3f(rpos.x - rsiz.x, rpos.y + rsiz.y, rpos.z - rsiz.z);         // Top Left Of The Quad (Top)
        GL11.glVertex3f(rpos.x - rsiz.x, rpos.y + rsiz.y, rpos.z + rsiz.z);         // Bottom Left Of The Quad (Top)
        GL11.glVertex3f(rpos.x + rsiz.x, rpos.y + rsiz.y, rpos.z + rsiz.z);             // Bottom Right Of The Quad (Top)

        GL11.glVertex3f(rpos.x + rsiz.x, rpos.y - rsiz.y, rpos.z + rsiz.z);         // Top Right Of The Quad (Bottom)
        GL11.glVertex3f(rpos.x - rsiz.x, rpos.y - rsiz.y, rpos.z + rsiz.z);         // Top Left Of The Quad (Bottom)
        GL11.glVertex3f(rpos.x - rsiz.x, rpos.y - rsiz.y, rpos.z - rsiz.z);         // Bottom Left Of The Quad (Bottom)
        GL11.glVertex3f(rpos.x + rsiz.x, rpos.y - rsiz.y, rpos.z - rsiz.z);         // Bottom Right Of The Quad (Bottom)

        GL11.glVertex3f(rpos.x + rsiz.x, rpos.y + rsiz.y, rpos.z + rsiz.z);         // Top Right Of The Quad (Front)
        GL11.glVertex3f(rpos.x - rsiz.x, rpos.y + rsiz.y, rpos.z + rsiz.z);         // Top Left Of The Quad (Front)
        GL11.glVertex3f(rpos.x - rsiz.x, rpos.y - rsiz.y, rpos.z + rsiz.z);         // Bottom Left Of The Quad (Front)
        GL11.glVertex3f(rpos.x + rsiz.x, rpos.y - rsiz.y, rpos.z + rsiz.z);         // Bottom Right Of The Quad (Front)

        GL11.glVertex3f(rpos.x + rsiz.x, rpos.y - rsiz.y, rpos.z - rsiz.z);         // Bottom Left Of The Quad (Back)
        GL11.glVertex3f(rpos.x - rsiz.x, rpos.y - rsiz.y, rpos.z - rsiz.z);         // Bottom Right Of The Quad (Back)
        GL11.glVertex3f(rpos.x - rsiz.x, rpos.y + rsiz.y, rpos.z - rsiz.z);         // Top Right Of The Quad (Back)
        GL11.glVertex3f(rpos.x + rsiz.x, rpos.y + rsiz.y, rpos.z - rsiz.z);         // Top Left Of The Quad (Back)

        GL11.glVertex3f(rpos.x - rsiz.x, rpos.y + rsiz.y, rpos.z + rsiz.z);         // Top Right Of The Quad (Left)
        GL11.glVertex3f(rpos.x - rsiz.x, rpos.y + rsiz.y, rpos.z - rsiz.z);     // Top Left Of The Quad (Left)
        GL11.glVertex3f(rpos.x - rsiz.x, rpos.y - rsiz.y, rpos.z - rsiz.z);         // Bottom Left Of The Quad (Left)
        GL11.glVertex3f(rpos.x - rsiz.x, rpos.y - rsiz.y, rpos.z + rsiz.z);         // Bottom Right Of The Quad (Left)

        GL11.glVertex3f(rpos.x + rsiz.x, rpos.y + rsiz.y, rpos.z - rsiz.z);         // Top Right Of The Quad (Right)
        GL11.glVertex3f(rpos.x + rsiz.x, rpos.y + rsiz.y, rpos.z + rsiz.z);         // Top Left Of The Quad (Right)
        GL11.glVertex3f(rpos.x + rsiz.x, rpos.y - rsiz.y, rpos.z + rsiz.z);         // Bottom Left Of The Quad (Right)
        GL11.glVertex3f(rpos.x + rsiz.x, rpos.y - rsiz.y, rpos.z - rsiz.z);         // Bottom Right Of The Quad (Right)
    GL11.glEnd();

立方体をきれいに描き、色は完璧ですが、光を加えるとすぐにすべてが白くなり、ひどく見えます. ここに私の照明コードがあります:

GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_LIGHT0);

float lightAmbient[] = { 0.5f, 0.5f, 0.5f, 1.0f };  // Ambient Light Values
float lightDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };      // Diffuse Light Values
float lightPosition[] = { 20.0f, 15.0f, 20.0f, 1.0f }; // Light Position
float lightSpecular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; // Light Position

ByteBuffer temp = ByteBuffer.allocateDirect(16);
temp.order(ByteOrder.nativeOrder())
GL11.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, (FloatBuffer)temp.asFloatBuffer().put(lightSpecular).flip());   
GL11.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, (FloatBuffer)temp.asFloatBuffer().put(lightAmbient).flip());              // Setup The Ambient Light
GL11.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, (FloatBuffer)temp.asFloatBuffer().put(lightDiffuse).flip());              // Setup The Diffuse Light
GL11.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION,(FloatBuffer)temp.asFloatBuffer().put(lightPosition).flip());         // Position The Light

ここで私が間違っていることを誰かが知っていますか? ここに例の写真があります: 照明なし 点灯

4

1 に答える 1

6

でクワッドに法線ベクトルを定義する必要がありますglNormal3f。法線ベクトルはライティングの計算に使用されます。

法線ベクトルは、サーフェスに対して垂直です。たとえば、最初のクワッドでは次のようになります。

GL11.glVertex3f(rpos.x + rsiz.x, rpos.y + rsiz.y, rpos.z - rsiz.z);         // Top Right Of The Quad (Top)
GL11.glVertex3f(rpos.x - rsiz.x, rpos.y + rsiz.y, rpos.z - rsiz.z);         // Top Left Of The Quad (Top)
GL11.glVertex3f(rpos.x - rsiz.x, rpos.y + rsiz.y, rpos.z + rsiz.z);         // Bottom Left Of The Quad (Top)
GL11.glVertex3f(rpos.x + rsiz.x, rpos.y + rsiz.y, rpos.z + rsiz.z);             // Bottom Right Of The Quad (Top)

y 座標は一定であるため、このサーフェスに垂直な法線ベクトルはまたは
になります。(0, 1, 0)(0, -1, 0)

于 2011-05-30T19:15:17.607 に答える