2011-07-26 132 views
2

我瀏覽了許多在線文章,並添加照明似乎非常直接,但我無法得到結果。我使用的是OpenGL 3.0,我爲動畫模型使用了頂點和片段着色器。順便說一句,我是OpenGL的新手。我可以在片段/頂點着色器旁邊使用固定glEnable(GL_LIGHTING)嗎?

無視照明我擁有一切正常工作與3D環境中運行的字符。

glEnable(GL_DEPTH_TEST); 
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 

    *snip* 

    glEnable(GL_LIGHTING); 
    glEnable (GL_LIGHT0); 

    float ambientLight0[] = { 0.2f, 0.2f, 0.2f, 1.0f }; 
    float diffuseLight0[] = { 0.8f, 0.8f, 0.8f, 1.0f }; 
    float specularLight0[] = { 0.5f, 0.5f, 0.5f, 1.0f }; 
    float position0[] = { -2.5f, 1.0f, -1.0f, 1.0f }; 
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight0); 
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight0); 
    glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight0); 
    glLightfv(GL_LIGHT0, GL_POSITION, position0); 

    //glEnable(GL_COLOR_MATERIAL); 
    //float mcolor[] = { 1.0f, 0.0f, 0.0f, 1.0f }; 
    //glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mcolor); 

    m_Beast.onRender(); 

這裏的m_Beast.onRender()的外觀:

glPushMatrix(); 

    Vector3 pos = getPosition(); 
    glTranslatef(pos.x, pos.y, pos.z); 

    glBindTexture(GL_TEXTURE_2D, m_beastTextureID); 

    static float modelviewMatrix[16]; 
    static float projectionMatrix[16]; 

    glGetFloatv(GL_MODELVIEW_MATRIX, modelviewMatrix); 
    glGetFloatv(GL_PROJECTION_MATRIX, projectionMatrix); 

    m_shaderProgram->bindShader(); 
    m_shaderProgram->sendUniform4x4("modelview_matrix", modelviewMatrix); 
    m_shaderProgram->sendUniform4x4("projection_matrix", projectionMatrix); 
    m_shaderProgram->sendUniformTexture("texture0", 0); 

    glEnableVertexAttribArray(0); 
    glEnableVertexAttribArray(1); 

    glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); 
    glVertexAttribPointer((GLint)0, 3, GL_FLOAT, GL_FALSE, 0, 0); 

    glBindBuffer(GL_ARRAY_BUFFER, m_texCoordBuffer); 
    glVertexAttribPointer((GLint)1, 2, GL_FLOAT, GL_FALSE, 0, 0); 

    glDrawArrays(GL_TRIANGLES, 0, m_interpolatedFrame.vertices.size()); 

    glDisableVertexAttribArray(1); 
    glDisableVertexAttribArray(0); 

    glPopMatrix(); 

我只想要一個快速的方法來讓我的模型的一些定向照明。在這一點上編寫光照着色器我真的不感興趣。

回答

5

只要使用頂點着色器,就必須自己實現光照計算。在較舊的OpenGL中,仍然可以使用固定功能頂點管線並僅編程片段階段。但是隨着OpenGL-3及以上版本的發佈,你需要做到這一切。

但是,您不應該對此感到厭倦。最後你會寫得更少,因爲配置固定函數所需的大量函數調用可以被更簡短的着色器代碼所取代。

+0

感謝您詳細說明這一事實。我想我別無選擇,只能用着色器進入照明領域。也許有人有一個很好的教程建議? – Wollan

+0

@Wollan:檢查http://www.lighthouse3d.com/ – datenwolf

+0

@Wollan:我建議實施「Phong」陰影模型,它非常容易和美觀。你可以檢查它的WP頁面,並且到處都有教程。 – Tuxer

相關問題