2016-04-29 72 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控制。