Java/lwjgl中的OpenGL照明问题
我用Java/lwjgl创建了一个带有旋转立方体的场景。 如果启用照明,无论我将光源放置在何处,我都会得到一个真实的行为,就像光源位于摄影机位置一样 以下是我初始化openGL的方法:Java/lwjgl中的OpenGL照明问题,java,opengl,lwjgl,lighting,Java,Opengl,Lwjgl,Lighting,我用Java/lwjgl创建了一个带有旋转立方体的场景。 如果启用照明,无论我将光源放置在何处,我都会得到一个真实的行为,就像光源位于摄影机位置一样 以下是我初始化openGL的方法: private void initGL() throws LWJGLException { Display.create(); Display.setFullscreen(true); Display.setVSyncEnabled(true); GL11.glViewport(
private void initGL() throws LWJGLException {
Display.create();
Display.setFullscreen(true);
Display.setVSyncEnabled(true);
GL11.glViewport(0, 0, WIDTH, HEIGHT);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GLU.gluPerspective(70, 4f / 3f, 1, 10000);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDepthMask(true);
GL11.glEnable(GL11.GL_CULL_FACE);
// ----IMPORTANT PART----
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_LIGHT0);
FloatBuffer position = ByteBuffer.allocateDirect(16).asFloatBuffer();
position.mark();
position.put(new float[] { -5f, 5f, 10f, 0f }); // even values about 10e3 for the first three parameters aren't changing anything
position.reset();
GL11.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, position);
FloatBuffer ambient = ByteBuffer.allocateDirect(16).asFloatBuffer();
ambient.mark();
ambient.put(new float[] { 0.5f, 0.5f, 0.5f, 1f });
ambient.reset();
GL11.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, ambient);
// Textures...
}
当我开始渲染时,调用这段代码:
private void renderGL() {
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
for (RenderObject ro : renderObjects) {
ro.render();
}
}
这画出了立方体。法线是正确的,我认为,反转法线会阻止绘制人脸,至少在我的测试中是这样
public void render() {
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, texID);
GL11.glColor3f(1f, 1f, 1f);
GL11.glPushMatrix();
GL11.glTranslatef(x, y, z);
GL11.glRotatef(rotation, 1, 1, 1);
GL11.glTranslatef(-x, -y, -z);
GL11.glBegin(GL11.GL_QUADS);
GL11.glNormal3f(0, 0, -1f);
GL11.glTexCoord2f(0, 0);
GL11.glVertex3f(x - dx, y - dy, z - dz);
GL11.glTexCoord2f(0, 1);
GL11.glVertex3f(x - dx, y + dy, z - dz);
GL11.glTexCoord2f(1, 1);
GL11.glVertex3f(x + dx, y + dy, z - dz);
GL11.glTexCoord2f(1, 0);
GL11.glVertex3f(x + dx, y - dy, z - dz);
// the other five faces
GL11.glEnd();
GL11.glPopMatrix();
}
我的照明设备出了什么问题
编辑:有关错误的其他信息
当我将灯光位置数组的最后一个值设置为0时,整个场景是黑色的。将其设置为任何其他值时,灯光将按所述从视口中发出。环境光不会改变任何东西,当光源不工作时,我要绘制的立方体保持黑暗。我试着把照明材料放在代码中的其他位置,例如直接放在GLU.GLU透视图(70,4f/3f,1,10000)之后代码>行,或进入循环,不改变任何描述的效果
我的照明设备出了什么问题
照明位置与模型视图矩阵相乘。所以您必须调用glLightfv(GL\u LIGHT\u,GL\u POSITION,…)当modelview矩阵包含查看转换时,代码>正确
从技术上讲,在initGL
函数中编写的所有内容都属于绘图函数。OpenGL不是您初始化的场景图
更新:
按如下方式更改代码:
public void render() {
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, texID);
GL11.glColor3f(1f, 1f, 1f);
GL11.glPushMatrix();
// this is where you set up your view:
GL11.glTranslatef(x, y, z);
GL11.glRotatef(rotation, 1, 1, 1);
GL11.glTranslatef(-x, -y, -z);
// and now it's time to set the light position:
GL11.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, position);
GL11.glBegin(GL11.GL_QUADS);
GL11.glNormal3f(0, 0, -1f);
GL11.glTexCoord2f(0, 0);
GL11.glVertex3f(x - dx, y - dy, z - dz);
GL11.glTexCoord2f(0, 1);
GL11.glVertex3f(x - dx, y + dy, z - dz);
GL11.glTexCoord2f(1, 1);
GL11.glVertex3f(x + dx, y + dy, z - dz);
GL11.glTexCoord2f(1, 0);
GL11.glVertex3f(x + dx, y - dy, z - dz);
// the other five faces
GL11.glEnd();
GL11.glPopMatrix();
}
然后您应该完全删除initGL
,将其代码移动到绘图函数中,将其转换为:
public void render() {
GL11.glViewport(0, 0, WIDTH, HEIGHT);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GLU.gluPerspective(70, 4f / 3f, 1, 10000);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
glLoadIdentity();
GL11.glPushMatrix();
// this is where you set up your view:
GL11.glTranslatef(x, y, z);
GL11.glRotatef(rotation, 1, 1, 1);
GL11.glTranslatef(-x, -y, -z);
// and now it's time to set the light position:
GL11.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, position);
// we do the rest of the light here as well
GL11.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, ambient);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDepthMask(true);
GL11.glEnable(GL11.GL_CULL_FACE);
// we enable lighting right before rendering
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_LIGHT0);
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, texID);
GL11.glColor3f(1f, 1f, 1f);
GL11.glBegin(GL11.GL_QUADS);
GL11.glNormal3f(0, 0, -1f);
GL11.glTexCoord2f(0, 0);
GL11.glVertex3f(x - dx, y - dy, z - dz);
GL11.glTexCoord2f(0, 1);
GL11.glVertex3f(x - dx, y + dy, z - dz);
GL11.glTexCoord2f(1, 1);
GL11.glVertex3f(x + dx, y + dy, z - dz);
GL11.glTexCoord2f(1, 0);
GL11.glVertex3f(x + dx, y - dy, z - dz);
// the other five faces
GL11.glEnd();
GL11.glPopMatrix();
}
谢谢你的回答!GL11.glLight()方法是C中glLightfv()方法的lwjgl版本。请参阅我的编辑,我认为我以前没有正确描述我的问题。@Sibbo:设置视图矩阵后必须正确放置灯光定位。这不是预测。查看我的答案编辑。所以我使用的glRotation矩阵围绕立方体旋转视图,而不是围绕视图旋转立方体?因为x、y和z变量是立方体的坐标,旋转应该围绕1/1/1轴旋转立方体。@Sibbo:从技术上讲,你只是在移动立方体。OpenGL没有像照相机这样的东西。但是如果你想一想,移动一个相机和移动另一个世界是一样的。modelview矩阵结合了模型转换和视图转换,因此称为“modelview”。投影矩阵可以被认为是OpenGL的“镜头”。啊,谢谢:)但我刚刚发现我的问题,在代码的另一个地方,如果复制到这里,什么都没有。。。我创建的FloatBuffers错误,没有使用flip()和order()。现在它工作了,但是光源随着立方体旋转:)但是现在我可以自己工作了,谢谢你。