2011-07-26 6 views
2

私は多くのオンライン記事を閲覧しており、照明を追加することは非常にストレートなようですが、私は結果を得ることができません。私はOpenGL 3.0を使用しています。私はアニメーションモデルに頂点とフラグメントシェーダを使用しています。 Btw、私はOpenGLを初めて使う人です。フラグメント/頂点シェーダと一緒に固定されたglEnable(GL_LIGHTING)を使用できますか?

照明を無視して、私は環境の周りを走る3Dチャーですべてうまく動作しています。

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(); 

は、私はちょうど私のモデルにいくつかの方向性照明を取得する簡単な方法をしたい:ここ

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()がどのように見えるかです。私はこの時点でライティングシェーダを書くのは面白くありません。

答えて

5

頂点シェーダを使用するとすぐに、ライティング計算を自分で実装する必要があります。古いOpenGLでは、固定機能頂点パイプラインを使用し、フラグメントステージのみをプログラムすることができます。しかし、OpenGL-3以降では、すべてのことを行う必要があります。

しかし、このことについてあまり気にしないでください。最終的には、固定関数を構成するために必要な膨大な関数呼び出しが、はるかに短くて簡潔なシェーダコードに置き換えられるため、あまり書きません。

+0

ありがとうございます。私はシェイダーで照明に飛び込むことしかできないと思う。たぶん誰かが良いチュートリアルの提案をしていますか? – Wollan

+0

@Wollan:Check http://www.lighthouse3d.com/ – datenwolf

+0

@Wollan:「Phong」シェーディングモデルを実装することをお勧めします。あなたはそのWPページを確認することができ、どこにでもチュートリアルがあります。 – Tuxer

関連する問題