2016-08-26 10 views
0

AKA私は間違っていますか?ルックの方向に基づいてOpenGLの照明が変わります

私はOpenGLを使いこなしていますが、私はちょうど現在キューブを点灯させようとしています。カメラを動かすと、キューブの照明が変わるので、私が正しく何をすべきか理解しているかどうかはわかりません。

上から下のキューブを見る:周りのすべての検索から

enter image description here

top down

がサイドからキューブを見てみると例えば

私が見た答えの中には、これが正常が正しく設定されていないときに起こると言われていますが、私は(それらが描かれているために、顔でグループ化された)、私は彼らの法線と一緒に頂点のすべてをプリントアウトしたときに、これは結果であるので、彼らは、正しく設定されていると思う:

Position: 0 0 0  Normal: -1 0 0 
Position: 0 30 0  Normal: -1 0 0 
Position: 0 30 30  Normal: -1 0 0 
Position: 0 0 30  Normal: -1 0 0 

Position: 0 0 0  Normal: 0 1 0 
Position: 0 0 30  Normal: 0 1 0 
Position: 30 0 30  Normal: 0 1 0 
Position: 30 0 0  Normal: 0 1 0 

Position: 0 0 0  Normal: 0 0 -1 
Position: 30 0 0  Normal: 0 0 -1 
Position: 30 30 0  Normal: 0 0 -1 
Position: 0 30 0  Normal: 0 0 -1 

Position: 0 0 30  Normal: 0 0 1 
Position: 0 30 30  Normal: 0 0 1 
Position: 30 30 30  Normal: 0 0 1 
Position: 30 0 30  Normal: 0 0 1 

Position: 0 30 0  Normal: 0 -1 0 
Position: 30 30 0  Normal: 0 -1 0 
Position: 30 30 30  Normal: 0 -1 0 
Position: 0 30 30  Normal: 0 -1 0 

Position: 30 0 0  Normal: 1 0 0 
Position: 30 0 30  Normal: 1 0 0 
Position: 30 30 30  Normal: 1 0 0 
Position: 30 30 0  Normal: 1 0 0 

ここにもいくつかのですケースには間違いをレンダリングするために使用されるコードはそこにある:

RenderEngine::RenderEngine(int width, int height) { 
    //initializing the window... 

    glClearDepth(1.f); 
    glClearColor(217.f/256.f, 233.f/256.f, 255.f/256.f, 1.f); 

    glEnable(GL_DEPTH_TEST); 
    glDepthMask(GL_TRUE); 

    glFrontFace(GL_CW); 
    glEnable(GL_CULL_FACE); 

    glEnable(GL_LIGHTING); 

    //glEnable(GL_COLOR_MATERIAL); 

    GLfloat lightPos[] = { 0.f, -1.0f, 0.0f, 0.f }; 
    GLfloat ambient[] = {0.3f,0.3f,0.3f,1.0f}; 
    GLfloat diffuse[] = {0.7f,0.7f,0.7f,1.0f}; 
    glLightfv(GL_LIGHT0, GL_POSITION, lightPos); 
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); 
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); 
    glEnable(GL_LIGHT0); 

    //more window related things 
} 

void RenderEngine::beginRender() { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 

void RenderEngine::endRender() { 
    //window stuff 
} 

void RenderEngine::translatePlayer(const sf::Vector3f& position) { 
    glTranslatef(-(position.x + 0.5) * 30, -(position.y + 1.75) * 30, -(position.z + 0.5) * 30); 
} 

void RenderEngine::rotatePlayer(const sf::Vector3f& rotation) { 
    glRotatef(rotation.x, 1.f, 0.f, 0.f); 
    glRotatef(rotation.y, 0.f, 1.f, 0.f); 
    glRotatef(rotation.z, 0.f, 0.f, 1.f); 
} 

void RenderEngine::renderVertexArray(const std::vector<Vertex>& vertices) { 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_COLOR_ARRAY); 
    glEnableClientState(GL_NORMAL_ARRAY); 

    glVertexPointer(3, GL_FLOAT, sizeof(Vertex), &vertices[0].pos[0]); 
    glColorPointer(3, GL_FLOAT, sizeof(Vertex), &vertices[0].color[0]); 
    glNormalPointer(GL_FLOAT, sizeof(Vertex), &vertices[0].normal[0]); 

    glDrawArrays(GL_QUADS, 0, vertices.size()); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_COLOR_ARRAY); 
    glDisableClientState(GL_NORMAL_ARRAY); 
} 

頂点オブジェクト:

struct Vertex { 
    float pos[3]; 
    float color[3]; 
    float normal[3]; 

    Vertex(float _pos[3], float _color[3], float _normal[3]) : 
     pos {_pos[0], _pos[1], _pos[2]}, 
     color {_color[0], _color[1], _color[2]}, 
     normal{_normal[0], _normal[1], _normal[2]} {} 

    Vertex() : pos{0,0,0}, color{0,0,0}, normal{0,0,0} {} 
}; 

すべてのランダムな30年代を無視してください。私はそれらが外れていることを認識しており、そのようにしてはいけませんが、それはここでは問題ではありません。次呼び出すと

+0

私はあなたがOpenGLを使って作業しているだけであることを理解していますが、これはいくつかのアドバイスです。 OpenGL 1.0のレガシーバージョンを覚えようとはしません。そして、バージョン3.3から現在の4.5まで、現代のOpenGLの何かを学ぶことに目を向けるでしょう。ここではOpenGL http://learnopengl.com/とhttp://www.MarekKnows.comを学ぶための優秀なウェブサイトがいくつかあります。最初は100%モダンでテキストベース、2番目のサイトはレガシーとモダンがありますがダウンロード可能です低価格の手頃なメンバーシップのビデオチュートリアル。 –

+0

利点/プロジェクト全体をアップグレードする価値はありますか? –

+0

申し訳ありませんより早く反応しません。利点は、最新のOpenGLシェーダを使用して、CPUとは対照的にGPU側の頂点のすべての処理を行うという事実にあります。 GPUは計算をより効率的に処理できます。また、レガシーAPI上で最新のOpenGLを使用することで、「固定機能」パイプラインから遠ざかり、GLSLシェーダのVertex、Geometry、Fragment(ピクセル)シェーダなどを使用した別の言葉で、プログラマはその関数のパイプラインを変更できます最新のOpenGLをプログラム可能なパイプラインにしています。 –

答えて

3

glLightfv(GL_LIGHT0, GL_POSITION, lightPos); 

を...そして渡さlightPosは、現在のモデルビュー行列で形質転換した後、カメラ座標に格納されます。したがって、あなたの光はカメラと共に動くでしょう。静的にしたい場合は、モデルビューマトリックスを設定した後、上記の行を再度実行する必要があります。

+0

わかりました。私はそれがそれを変えたことに気づいていませんでした。今の照明は静的ですが、明るさはちょっとばかりです。しかし、私はちょうどそれを調整するためにパラメータで遊ぶ必要があります。ありがとう! –

関連する問題