他のテクスチャを追加する方法がわからないのは、投稿したコードに2つの重要な機能、つまりglGenTextures
とglBindTexture
がないためです。最初は、OpenGLコンテキスト(テクスチャがグラフィックハードウェアに存在する場所)でテクスチャオブジェクトを生成します。 2番目のテクスチャオブジェクトは、その後の呼び出し(glTex ..)に影響を与えるテクスチャオブジェクトの1つを「選択」します。
まず、glTexParameteriやglTexImage2Dのような関数は、すべてのレンダリングループで再度呼び出す必要はありませんが、あなたのケースでは、イメージは常に変化しているため、そうする必要があります。デフォルトでは、コードでは、使用されるテクスチャオブジェクトは0番目のオブジェクトです(デフォルトの場合は予約されています)。あなたは、2つのテクスチャオブジェクトを作成し、望ましい結果を達成するためにそれらを次々にバインドする必要があります。
GLuint tex_obj[2]; //create two names for the texture (should not be global variables, but just for sake of this example).
void initGL() {
glClearColor (0.0,0.0,0.0,1.0);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,width,height,0);
glEnable(GL_TEXTURE_2D);
glGenTextures(2,tex_obj); //generate 2 texture objects with names tex_obj[0] and [1]
glBindTexture(GL_TEXTURE_2D, tex_obj[0]); //bind the first texture
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //set its parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glBindTexture(GL_TEXTURE_2D, tex_obj[1]); //bind the second texture
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //set its parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
}
void paintGL() {
glClear (GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glBindTexture(GL_TEXTURE_2D,tex_obj[0]); //bind the first texture.
//then load it into the graphics hardware:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width0, height0, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data0);
glBegin(GL_QUADS);
glTexCoord2i(0,0); glVertex2i(0,height); //you should probably change these vertices.
glTexCoord2i(0,1); glVertex2i(0,0);
glTexCoord2i(1,1); glVertex2i(width,0);
glTexCoord2i(1,0); glVertex2i(width,height);
glEnd();
glBindTexture(GL_TEXTURE_2D, tex_obj[1]); //bind the second texture.
//then load it into the graphics hardware:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width1, height1, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data1);
glBegin(GL_QUADS);
glTexCoord2i(0,0); glVertex2i(0,height); //you should probably change these vertices.
glTexCoord2i(0,1); glVertex2i(0,0);
glTexCoord2i(1,1); glVertex2i(width,0);
glTexCoord2i(1,0); glVertex2i(width,height);
glEnd();
}
、それがどのように行われるか、基本的です。しかし、私はOpenGLの知識が少し古くなっているので、これを行うより効率的な方法があるかもしれないと警告しなければなりません(少なくともglBegin/glEndはC++では廃止され、VBOでは置き換えられています。
動作しないでそれを思い出して - 私はgluOrtho2D(0、幅、高さ、0)を行う必要があります。すべてのペイントで何も表示されません - それはまだglTexImage2D()のどちらかを塗ります。特定のglTexImage2D()にテクスチャIDを関連付けるものは何ですか? [OK]を –
私は馬鹿だ - 、私が間違っている第二の画像のためのクワッド(!開始および終了幅が同じであった)だったが、私はまだテクスチャが作成されると、すべてのコール –
にgluOrtho2D(フルウィンドウCOORDS)を行う必要がありますglTexSubImage2Dを使用してデータを更新するだけです。毎回フル再初期化を行うglTexImageよりもはるかに高速です。実際には、glTexImageのデータパラメータにNULLを渡して、あとでglTexSubImageを使ってデータを初期化してから供給することだけを伝えることができます – datenwolf