Я моделирую трехмерный лабиринт в 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);
для лучшего понимания есть рисунок
после этого кода все темно и нет света. Большое вам спасибо за ваше время. :)
@ Rabbid76, значит, вы говорите, что я должен вставлять pop и push между каждой командой




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