2016-04-29 3 views
1

Может кто-нибудь объяснить мне, почему добавление следующих линийТребует ли OpenGL нормалей для создания теней?

glEnableClientState(GL_NORMAL_ARRAY); 
glNormalPointer(GL_FLOAT, 0, 0); 

закодировать

glewInit(); 
    glEnable (GL_LIGHTING) ; 
    glEnable (GL_COLOR_MATERIAL) ; 
    glColorMaterial (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE) ; 
    glEnable(GL_LIGHT0); 
    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_GREATER); 

    glEnable(GL_CULL_FACE); 
    glCullFace(GL_BACK); 

    glClearDepth(0); 


    GLuint vertexbuffer; 

    glGenBuffers(1, &vertexbuffer); 

    glBindBuffer(GL_ARRAY_BUFFER,vertexbuffer); 
    glBufferData(GL_ARRAY_BUFFER,sizeof(float)*Loader.verticesFixed.size(),&Loader.verticesFixed[0],GL_STATIC_DRAW); 

    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER,vertexbuffer); 
    glVertexAttribPointer(
      0,     // attribute 0. No particular reason for 0, but must match the layout in the shader. 
      3,     // size 
      GL_FLOAT,   // type 
      GL_FALSE,   // normalized? 
      12,     // stride 
      (void*)(0)   // array buffer offset 
     ); 
glDrawArrays(GL_TRIANGLES,0,Loader.verticesFixed.size()/3); 

превращает эту модель: enter image description here

в эту модель с тенями:

enter image description here

Я не представил никаких нормальных данных, и мне сказали, что OpenGL не вычисляет нормали. Но тогда как я получил правильные световые эффекты с тенями на модели? Я ошибаюсь, думая, что нормали нужны для теней или OpenGL действительно вычисляют нормали?

ответ

3

Для меня это выглядит как обычная формула ослабления, применяемая без нормалей. Прочность света будет уменьшаться на расстоянии, поэтому части модели дальше будут темнее.

Теперь, если вы были с помощью нормалей, вы увидите правильное затенение, то есть только лица, указывая в сторону источника света будет получить закурил, и тем больше света направление перпендикулярно к нормали, тем сильнее освещение. Без нормалей я предполагаю, что это просто игнорирует нормали целиком.

Кстати, вы можете добавить это к самому, самого длинного списка причин, почему вы должны использовать программируемый конвейер для визуализации объектов, как если бы вы должны были реализовать (довольно просто, как правило, около 5-15 линии кода для меня) алгоритм освещения самостоятельно, вы сможете сразу это узнать. Tutorial

+0

Очень интересное объяснение. Спасибо. –

1

В контуре фиксированной функции, обеспечиваемом устаревшей/совместимостью OpenGL, вам необходимо вручную указать нормали вершин с семейством функций glNormal*. Если вы не укажете нормали, OpenGL будет использовать определенное значение по умолчанию.

В программируемом конвейере, обеспечиваемом ядром, современным OpenGL, вы реализуете любую модель освещения, которую хотите в шейдерах. Если вы хотите использовать нормали, вы должны указывать их как общий атрибут вершины.

Единственное, что OpenGL вычисляет нормали для отбрасывания на обратную сторону, контролируется glCullFace.

Смежные вопросы