現在、lwjgl を使用して OpenGL を学習しています。頂点で構築されたボックスを作成しました。また、ライトのパラメーターを設定し、最終的にライトを有効にするライト クラスも作成しました。
点灯できましたが、一つ問題があります。ボックスを任意の軸を中心に回転させても、ライトはボックスの表面を更新しません。つまり、次のことを意味します。
ライトがボックスの前にある場合... ボックスの前面は白く、ボックスの背面は暗いです。ボックスを 180° 回転させると、新しい前面は白く、古い前面 (現在は背面) は暗くなります。そうではありません!なんで?シーンを再度レンダリングするたびにライトを作成する必要がありますか?
光を作成するための私のコードは次のとおりです。
//creating buffers
FloatBuffer matSpecular = BufferUtils.createFloatBuffer(4);
matSpecular.put(1.0f).put(1.0f).put(1.0f).put(1.0f).flip();
FloatBuffer lightPosition = BufferUtils.createFloatBuffer(4);
lightPosition.put(1.0f).put(1.0f).put(1.0f).put(0.0f).flip();
FloatBuffer whiteLight = BufferUtils.createFloatBuffer(4);
whiteLight.put(1.0f).put(1.0f).put(1.0f).put(1.0f).flip();
FloatBuffer lModelAmbient = BufferUtils.createFloatBuffer(4);
lModelAmbient.put(0.5f).put(0.5f).put(0.5f).put(1.0f).flip();
//-----------------
GL11.glShadeModel(GL11.GL_SMOOTH);
GL11.glMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, matSpecular);
GL11.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 50.0f);
GL11.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, lightPosition);
GL11.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, whiteLight);
GL11.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, whiteLight);
GL11.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, lModelAmbient);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_LIGHT0);
GL11.glEnable(GL11.GL_COLOR_MATERIAL);
GL11.glColorMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE);
そして、これが私のボックスを描く方法です:
GL11.glPushMatrix();
GL11.glLoadIdentity();
GL11.glTranslatef(_position.x, _position.y, _position.z);
GL11.glRotatef(_rotation, 0, 0, 1);
GL11.glRotatef(_rotation, 0, 1, 0);
GL11.glColor3f(1f, 1f, 1f);
GL11.glBegin(GL11.GL_TRIANGLES);
for(int index : cubeIndices)
{
Vector3f vertex = _vertices[index];
GL11.glVertex3f(vertex.x, vertex.y, vertex.z);
}
GL11.glEnd();
GL11.glPopMatrix();