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(

我用Java/lwjgl创建了一个带有旋转立方体的场景。 如果启用照明,无论我将光源放置在何处,我都会得到一个真实的行为,就像光源位于摄影机位置一样

以下是我初始化openGL的方法:

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,…)正确

从技术上讲,在
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()。现在它工作了,但是光源随着立方体旋转:)但是现在我可以自己工作了,谢谢你。