Проблема с освещением Java Open GL

#java #opengl

#java #opengl

Вопрос:

Я только начинаю изучать Open GL и столкнулся с препятствием на пути. По какой-то причине вращение объектов даже с выталкиваемыми матрицами, похоже, преобразует освещение. Кто-нибудь знает, что я делаю не так?

Вот мой код:

 import java.nio.FloatBuffer;

import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;

public class DisplayExample {

    int cube;
    private FloatBuffer pos;
    private int cube2;

    public void start() {
        int width=800;
        int height=600;
        try {
            Display.setDisplayMode(new DisplayMode(width, height));
            Display.setTitle("Abarrow");
            Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
            System.exit(0);
        }

        //setup colors
        FloatBuffer red= BufferUtils.createFloatBuffer(4).put(new float[] { 1, 0, 0, 1});
        FloatBuffer green = BufferUtils.createFloatBuffer(4).put(new float[] { 0, 1, 0, 1});
        FloatBuffer blue= BufferUtils.createFloatBuffer(4).put(new float[] { 0, 0, 1, 1});
        FloatBuffer yellow= BufferUtils.createFloatBuffer(4).put(new float[] { 1, 1, 0, 1});
        red.flip();
        green.flip();
        blue.flip();
        yellow.flip();
        //setup positions
        pos = BufferUtils.createFloatBuffer(4).put(new float[] { 5.0f, 5.0f, 10.0f, 0.0f});
        pos.flip();

        //projection
        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GL11.glFrustum(-4, 4, -3, 3, 5, 60);
        //model view
        GL11.glMatrixMode(GL11.GL_MODELVIEW);
        GL11.glLoadIdentity();
        GL11.glTranslatef(0, 0, -10);
        //light source
        GL11.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, pos);
        //lighting
        GL11.glEnable(GL11.GL_LIGHTING);
        GL11.glEnable(GL11.GL_LIGHT0);
        //other
        GL11.glEnable(GL11.GL_DEPTH_TEST);
        GL11.glEnable(GL11.GL_NORMALIZE);


        cube=GL11.glGenLists(1);
        GL11.glNewList(cube, GL11.GL_COMPILE);
        GL11.glShadeModel(GL11.GL_SMOOTH);
        GL11.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE, green);
        createCube();
        GL11.glEndList();

        cube2=GL11.glGenLists(1);
        GL11.glNewList(cube2, GL11.GL_COMPILE);
        GL11.glShadeModel(GL11.GL_SMOOTH);
        GL11.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE, red);
        createCube();
        GL11.glEndList();

        loop();
    }

    private void createCube() {
        GL11.glBegin(GL11.GL_QUADS);
        //front
        GL11.glVertex3f(-1,-1,-1);
        GL11.glVertex3f(-1,1,-1);
        GL11.glVertex3f(1,1,-1);
        GL11.glVertex3f(1,-1,-1);
        //back
        GL11.glVertex3f(-1,-1,1);
        GL11.glVertex3f(-1,1,1);
        GL11.glVertex3f(1,1,1);
        GL11.glVertex3f(1,-1,1);
        //left
        GL11.glVertex3f(-1,-1,-1);
        GL11.glVertex3f(-1,1,-1);
        GL11.glVertex3f(-1,1,1);
        GL11.glVertex3f(-1,-1,1);
        //right
        GL11.glVertex3f(1,-1,-1);
        GL11.glVertex3f(1,1,-1);
        GL11.glVertex3f(1,1,1);
        GL11.glVertex3f(1,-1,1);
        GL11.glEnd();       
    }

    private void loop() {
        float spot=0;
        while (!Display.isCloseRequested()) {
            spot =1;
            // Clear the screen and depth buffer
            GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);

            //reset model view
            GL11.glMatrixMode(GL11.GL_MODELVIEW);
            GL11.glLoadIdentity();
            GL11.glTranslatef(0, 0, -10);
            GL11.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, pos);

            //cube
            GL11.glPushMatrix();
            GL11.glTranslatef(-2, 0, 0);
            GL11.glRotatef(spot, 0, 1, 0);
            //render cube
            GL11.glCallList(cube);
            //undo transform
            GL11.glPopMatrix();

            //cube2
            GL11.glPushMatrix();
            GL11.glTranslatef(2, 0, 0);
            GL11.glRotatef(-spot, 0, 1, 0);
            //render cube
            GL11.glCallList(cube2);
            //undo transform
            GL11.glPopMatrix();


            //render the graphics
            Display.update();
            //cap at 60 fps
            Display.sync(60);
        }

        Display.destroy();
    }

    public static void main(String[] argv) {
        DisplayExample displayExample = new DisplayExample();
        displayExample.start();
    }
}
  

Комментарии:

1. Учитывая отсутствие нормалей к полигонам, я удивлен, что освещение даже притворяется, что работает.

Ответ №1:

Попробуйте добавить некоторые полигональные нормали через glNormal3f() .

Я думаю, вы видите нормальное значение по умолчанию для (0, 0, 1) .