1

実際には同じ位置と位置にある 2 つのサーフェスにテクスチャをレンダリングしています。

このような場合、テクスチャを 1 つだけ表示したいのですが、次のようになります。

ここに画像の説明を入力

つまり、最初のマテリアルのテクスチャだけを表示したいのです。

どこで解決策を探すべきか知りたいのですが、材料のブレンドで遊ぶべきですか?

4

2 に答える 2

4

これはかなり古い問題 ( z-fighting ) で、カードはどのオブジェクトを前に引くべきかわからないためです。リンクされたウィキペディアの記事には、これに関するより多くの例があります。

これを修正するには、深度バッファーの精度 (ビット深度) を上げるか、ビューの深度を減らすか (クリップ プレーンの遠/近距離)、小さなオフセットを追加して、座標が正確に (またはほぼ) 同じではないようにします。これをレンダリングするために、単純に深度バッファを無効にする (またはクリアする) こともできます (この場合、最後にレンダリングされたものが他のすべてにオーバーラップします)。

于 2012-07-04T08:05:53.083 に答える
1

一度にいくつかのテクスチャを表示したいということですか? 次に、マルチ テクスチャリングを使用します。以下を使用して、両方のテクスチャを 1 つのクワッドにアタッチします。

glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 0.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 0.0f);

glTexEnviそして、好きなように組み合わせて遊んでください。テクスチャを 1 つだけ表示したい場合は、それぞれに別々のテクスチャを持つ 2 つのクワッドを描画します。そして、後で描かれるクワッドウィッチが見えてきます。次に、あるものから別のものに切り替えたい場合は-(void)、クワッドごとに個別の を作成しglClearColor、各クワッドの前に描画してから、ボタンを呼び出す例-(void)quad1とボタンを呼び出すようにします-(void)quad2

または、深度バッファを使用してください。

あなたの状況では、すべてのバッファが常に私にとって難しすぎるように見えたので、マルチテクスチャリングを使用します。


私のコードがどのように見えるかを示します。

マルチ テクスチャを使用したコード:

glClear(GL_COLOR_BUFFER_BIT);

//Turn on blending and set glBlendFunc for your needs
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

//Describing multitexturing
glClientActiveTexture(GL_TEXTURE0_ARB); //Activating texture on unit 0
glActiveTexture(GL_TEXTURE0_ARB); //Activating texture on unit 0
glBindTexture(GL_TEXTURE_2D, Texture1); //Bind texture on unit 0
glEnable(GL_TEXTURE_2D); //Enable GL_TEXTURE_2D to set it's glTexEnvi for your needs
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE ); //Edit glTexEnvi for your needs (link bellow code)
glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_INTERPOLATE );

glClientActiveTexture(GL_TEXTURE1_ARB); //Activating texture on unit 1
glActiveTexture(GL_TEXTURE1_ARB); //Activating texture on unit 1
glBindTexture(GL_TEXTURE_2D, Texture2); //Bind texture on unit 0
glEnable(GL_TEXTURE_2D); //Enable GL_TEXTURE_2D to set it's glTexEnvi for your needs
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE ); //Edit glTexEnvi for your needs (link bellow code)
glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE );

//Drawing quad with multi texture
glBegin(GL_QUADS);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 0.0f); //Texture on unit 0 coords
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 0.0f); //Texture on unit 1 coords 
glVertex2f(0.0, 500);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 1.0f); //Texture on unit 0 coords
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 1.0f); //Texture on unit 1 coords 
glVertex2f(0.0, 0.0);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 1.0f, 1.0f); //Texture on unit 0 coords
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 1.0f); //Texture on unit 1 coords  
glVertex2f(800, 0.0);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 1.0f, 0.0f); //Texture on unit 0 coords
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 0.0f); //Texture on unit 1 coords 
glVertex2f(800, 500);
glEnd();

//Disable GL_TEXTURE_2D. We don't need it anymore
glDisable(GL_TEXTURE_2D);
//Disable blending
glDisable(GL_BLEND);
//Flush everything
glFlush();

テクスチャごとに 1 つのクワッドを使用するコード

-(void) drawQuad1 
{
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Texture1);
glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0, 500);
    glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0, 0.0);
    glTexCoord2f(1.0f, 1.0f); glVertex2f(800, 0.0);
    glTexCoord2f(1.0f, 0.0f); glVertex2f(800, 500);
glEnd();
glDisable(GL_TEXTURE_2D)
glFlush();
}

-(void) drawQuad2
{
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Texture2);
glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0, 500);
    glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0, 0.0);
    glTexCoord2f(1.0f, 1.0f); glVertex2f(800, 0.0);
    glTexCoord2f(1.0f, 0.0f); glVertex2f(800, 500);
glEnd();
glDisable(GL_TEXTURE_2D)
glFlush();
}

//and now when you want to draw `drawQuad1` you need to do `[self drawQuad1];`
//and where you want to draw `drawQuad2` you need to do `[self drawQuad2];`

glTexEnvi に関する情報はこちら. その単なるサンプルコード。急いで書いたので間違いがあるかもしれません。何かを忘れていたらごめんなさい。ただ、私は長い間それをしていません。これは Mac OS X で書かれているため、他のプラットフォームを使用している場合は、いくつか変更する必要があります (opengl ではありません)。そして深度バッファについて?使い方がわかりません。だから私はあなたにそれを説明することはできません。ごめん。それらを使用したことはありません。

于 2012-07-04T08:07:53.177 に答える