2016-11-11 11 views
-1

異なるオブジェクトをレンダリングするために、OpenGLメインプログラム内の異なるプログラムに異なるシェーダを添付しようとしています。具体的には、私は惑星オブジェクト(obj)を持っていますが、2つの異なる惑星にレンダリングしたいのですが、1つは複数のテクスチャでバンプマッピングするバンプです。1つのメインOpenGLプログラム内の複数のシェーダ

私は次のフレームワークを思いついたが、うまくいかなかった。

void setUp(){ 
    planet_1_programID = createProgramAndAttachShader(parameters...) 
    planet_2_programID = createProgramAndAttachShader(parameters...) 
} 
void sendDataToOpenGL(){ 
    create VAO and bind the VAO 
    load data into a VBO 
    send the data to OpenGL 
} 

void paintGL(void){ 
    glm::mat4 lookatMatrix = ... 
    glm::mat4 projectionMatrix = ... 
    glm::mat4 lookatMatrix = ...   
    glm::mat4 transformationMatrix = ... 

    // planet 1 
    glUseProgram(planet_1_programID) 
    bind to the previous created VAO 
    bind texture information 
    some model transformation 
    glDrawArrays(); 

    // planet 2 
    glUseProgram(planet_2_programID) 
    bind to the previous created VAO 
    bind texture information 
    some model transformation 
    glDrawArrays(); 
} 

レンダリング結果は、最後のシーンに1つの惑星しか表示されないことです。関数glUseProgramを間違った方法で理解しているのではないかと思います。誰も私にいくつかのヒントを教えてもらえますか?

[更新] glUseProgramの後にすべての変数をもう一度定義する必要があるのでしょうか?現在、これらの2つの惑星は基本的に同じ変数を持つため、glUseProgramの前にほとんどの変数を定義しています。

+0

「すべての変数を定義する」とはどういう意味ですか?あなたがプログラムの制服を設定することを言及しているなら - はい、それらはプログラムごとですので、均一なバッファーオブジェクトを使用しない限り、各プログラムに個別に設定する必要があります。また、プログラムのパイプラインオブジェクトを見ることもできます。 – ybungalobill

答えて

1

glUseProgramの後にすべての変数をもう一度定義する必要があるからですか?現在、これらの2つの惑星は基本的に同じ変数を持つため、glUseProgramの前にほとんどの変数を定義しています。

「ユニフォーム」について言えば、そのようなもの(!)が問題です。あなたは均一な値がプログラムごとにに格納されているので、プログラムごとに少なくとも一度均一な値を設定する必要があります。それぞれの後に行う必要はありません。すべてglUseProgramですが、 "glUseProgram"ごとに少なくとも1回は実行する必要があります。

+0

私の統一MVP行列がすべてのオブジェクトで同じであるとします。使用プログラムごとに1つずつ設定する必要がありますか? –

+0

@LouisKuang:制服の値はプログラムオブジェクトに保存されます。したがって、すべてのプログラムに対して少なくとも1回値を設定する必要があります。これが非効率的だと思う場合:そうです。そのため、* Uniform Buffer Objects *が問題です:https://www.opengl.org/wiki/Uniform_Buffer_Object – datenwolf

関連する問題