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