Android OpenGL skybox light на самом деле не работает

#android #opengl-es #light

#Android #opengl-es #свет

Вопрос:

Хорошо, я сделал «skybox» (на самом деле это 5 плоскостей, из-за разных текстур). Он работает нормально, но есть проблема с lightning. Это не моя сильная сторона в OpenGL, поэтому я не удивлюсь, если ответ будет не таким сложным.

Итак, это мой вид начальной позиции. Как вы можете видеть, передняя плоскость яркая, но левая, верхняя, правая не совсем, и между ними и передней частью есть граница.

http://img696.imageshack.us/img696/3673/light01.png

Когда я подхожу к абсолютному центру (почти) skybox, граница не так заметна (я думаю, в абсолютном центре границы нет.

http://img233.imageshack.us/img233/2949/light02.png

Сначала я попробовал использовать один светильник в положении (0,0,0) с этими настройками, но ничего, я попытался изменить окружающий, рассеянный, но не очень помогает:

     private float[] lightAmbient = {0.5f, 0.5f, 0.5f, 1.0f};
    private float[] lightDiffuse = {1.0f, 1.0f, 1.0f, 1.0f};
    private float[] lightPosition = {0.0f, 0.0f, 0.0f, 1.0f};

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            gl.glEnable(GL10.GL_DITHER);
            gl.glEnable(GL10.GL_TEXTURE_2D);
            gl.glShadeModel(GL10.GL_SMOOTH);
            gl.glClearColor(0, 0, 0, 0);

            gl.glClearDepthf(1.0f);
            gl.glEnable(GL10.GL_DEPTH_TEST);
            gl.glDepthFunc(GL10.GL_LEQUAL);
            gl.glEnable(GL10.GL_LIGHT0);
            gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
            gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbientBuffer);
            gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuseBuffer);
            gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPositionBuffer);
    }

    public void onDrawFrame(GL10 gl) {
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
            gl.glLoadIdentity();
            gl.glEnable(GL10.GL_LIGHTING);

            GLU.gluLookAt(gl, eyeX, eyeY, eyeZ, centerX, centerY, centerZ, 0.0f, 1.0f, 0.0f);
    }

    public void onSurfaceChanged(GL10 gl, int width, int height) {
            if(height == 0) {
                height = 1;                         
            }

            gl.glViewport(0, 0, width, height);
            gl.glMatrixMode(GL10.GL_PROJECTION);
            gl.glLoadIdentity();
            GLU.gluPerspective(gl, 65.0f, (float)width / (float)height, 1.0f, 80.0f);
            gl.glMatrixMode(GL10.GL_MODELVIEW);
            gl.glLoadIdentity();
    }
  

Итак, вопрос в том, как я могу заставить это работать в любом месте, где я нахожусь. Я надеюсь, что кто-нибудь сможет мне помочь, потому что теперь это выглядит не очень красиво (без света хорошо, но я действительно не хочу ночную сцену, особенно с текстурой, где есть солнце :).

РЕДАКТИРОВАТЬ (как это работает сейчас): как и в ответе, для skybox больше нет нормалей, но после того, как я включил lightning, мне нужно было добавить эту строку в код, и теперь она работает как шарм, и небо везде яркое.

     gl.glLightModelf(GL10.GL_LIGHT_MODEL_TWO_SIDE, GL10.GL_TRUE);
  

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

1. Почему вы не создаете свой мир внутри сферы? Это устранит всю проблему освещения, если вы определите правильные нормали для каждой вершины сферы.

2. Хм. На самом деле это неплохая идея, может быть, если до завтра ответа не будет, я попробую. Проблема в том, что я действительно не знаю, как создать сферу. (Может быть, я делаю один в Blender и каким-то образом импортирую его, потому что вручную я действительно не знаю, как человек может это сделать.)

3. Для этого есть ручные способы (с некоторой работой). Проверьте это: swiftless.com/tutorials/opengl/sphere.html

Ответ №1:

Ответ действительно не так уж и сложен; вы просто не должны вообще использовать освещение в своем skybox.

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

1. Спасибо, теперь все хорошо, но есть еще одна проблема. Теперь переднее небо действительно темное, но задняя часть становится ярче, когда я удаляюсь от него, к передней части. С левой и правой сторон подсветка градиентная. Там, где они соединяются с задней частью, они такие же яркие, как задняя плоскость, но там, где они соединяются с передней частью, они темные. Я действительно не могу понять, что происходит 🙂

2. Я отредактировал свой собственный вопрос о том, как я смог решить эту проблему.