Java OpenGL, настройка освещения

Я моделирую трехмерный лабиринт в Java OpenGL (JOGL), и у меня возникла проблема с освещением. Как бы я ни старался, свет не работает так, как я хочу.

Это настраивается в методе инициализации (который вызывается при создании окна):

    // nastaveni materialu - difusni slozka
    float[] mat_dif = new float[] { 0.3f, 0.3f, 0.3f, 0.3f };
    // nastaveni materialu - zrcadlova slozka
    float[] mat_spec = new float[] { 1, 1, 1, 1 };
    // nastaveni materialu - ambientni slozka
    float[] mat_amb = new float[] { 0.3f, 0.3f, 0.3f, 0.3f };

    gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_AMBIENT, mat_amb, 0);
    gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_DIFFUSE, mat_dif, 0);
    gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_SPECULAR, mat_spec, 0);


//nastaveni bileho svetla
float[] lightWhite = new float[] { 1, 1, 1, 1 };
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT_AND_DIFFUSE, lightWhite, 0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_SPECULAR, lightWhite, 0);

//nastaveni cerveneho
float[] lightRed = new float[] { 1, 0, 0, 1 };
gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_AMBIENT_AND_DIFFUSE, lightRed, 0);
gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_SPECULAR, lightRed, 0);

//nastaveni modreho
float[] lightBlue = new float[] { 0, 0, 1, 1 };
gl.glLightfv(GL2.GL_LIGHT2, GL2.GL_AMBIENT_AND_DIFFUSE, lightBlue, 0);
gl.glLightfv(GL2.GL_LIGHT2, GL2.GL_SPECULAR, lightBlue, 0);

и код в методе отображения (вызывается при рендеринге каждого кадра)

        gl.glMatrixMode(GL2.GL_MODELVIEW);
    gl.glLoadIdentity();

    light_position = new float[] {6.0f, 2.0f, -6.0f, 1.0f};// bod v prostoru
    light_direction = new float[] {0.0f, 0.0f, -6.0f, 0.0f};

    light_position2 = new float[] {8.0f, 2.0f, -7.0f, 1.0f};// bod v prostoru
    light_direction2 = new float[] {15.0f, 0.0f, -7.0f, 0.0f};

    light_position3 = new float[] {8.0f, 2.0f, -4.0f, 1.0f};// bod v prostoru
    light_direction3 = new float[] {8.0f, 0.0f, 0.0f, 0.0f};

    gl.glPushMatrix();
    gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, light_position, 0);
    gl.glLightf(GL2.GL_LIGHT0,GL2.GL_SPOT_CUTOFF,60.0f);
    gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_SPOT_DIRECTION, light_direction, 0);
    gl.glLightf(GL2.GL_LIGHT0,GL2.GL_SPOT_EXPONENT,10.0f);
    gl.glPopMatrix();

    gl.glPushMatrix();
    gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_POSITION, light_position2, 0);
    gl.glLightf(GL2.GL_LIGHT1,GL2.GL_SPOT_CUTOFF,60.0f);
    gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_SPOT_DIRECTION, light_direction2, 0);
    gl.glLightf(GL2.GL_LIGHT1,GL2.GL_SPOT_EXPONENT,10.0f);
    gl.glPopMatrix();

    gl.glPushMatrix();
    gl.glLightfv(GL2.GL_LIGHT2, GL2.GL_POSITION, light_position3, 0);
    gl.glLightf(GL2.GL_LIGHT2,GL2.GL_SPOT_CUTOFF,35.0f);
    gl.glLightfv(GL2.GL_LIGHT2, GL2.GL_SPOT_DIRECTION, light_direction3, 0);
    gl.glLightf(GL2.GL_LIGHT2,GL2.GL_SPOT_EXPONENT,10.0f);
    gl.glPopMatrix();

    gl.glColorMaterial (GL2.GL_FRONT_AND_BACK, 
    GL2.GL_AMBIENT_AND_DIFFUSE ) ;
    gl.glEnable(GL2.GL_COLOR_MATERIAL);

    gl.glEnable(GL2.GL_LIGHTING);
    gl.glEnable(GL2.GL_LIGHT0);
    gl.glEnable(GL2.GL_LIGHT1);
    gl.glEnable(GL2.GL_LIGHT2);

    gl.glShadeModel(GL2.GL_SMOOTH);

для лучшего понимания есть рисунок

Java OpenGL, настройка освещения

после этого кода все темно и нет света. Большое вам спасибо за ваше время. :)

@ Rabbid76 Я добавил настройку в редактирование .. так что я могу видеть некоторый свет (на 6x10), но его очень мало ... на мой взгляд, ошибка в установке направления или что-то в этом роде, как вы думаете? Настройки соответствуют моему плану на фото?

pajasv 08.04.2018 15:58

@ Rabbid76, значит, вы говорите, что я должен вставлять pop и push между каждой командой

pajasv 08.04.2018 16:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
193
0

Другие вопросы по теме