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

avatar
pajasv
8 апреля 2018 в 11:27
232
0
0

Я моделирую трехмерный лабиринт в 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);

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

enter image description here

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

Источник
pajasv
8 апреля 2018 в 13:58
0

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

pajasv
8 апреля 2018 в 14:19
0

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

Ответы (0)