我目前正在使用 lwjgl 学习 OpenGL。我创建了一个由顶点构建的 Box。我还创建了一个灯光类,它应该设置灯光的参数并最终启用灯光。
我可以让灯工作,但有一个问题。如果我围绕任何轴旋转盒子,灯光不会更新盒子的表面。这意味着:
如果我的灯在我的盒子前面......我的盒子的正面是白色的,我的盒子的背面是黑暗的。如果我将盒子旋转 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();