Я создал сцену с вращающимся кубом в 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.gluPerspective(70, 4f / 3f, 1, 10000);
или в цикле, не меняя ни один из описанных эффектов.