1

我在实际上具有相同位置和位置的两个表面上渲染纹理。

在这种情况下,我只想显示其中一种纹理,同时我得到关注

在此处输入图像描述

即我只想显示第一种材料的纹理。

所以我想知道我在哪里寻找解决方案,我应该玩混合材料吗?

4

2 回答 2

4

这是一个相当古老的问题(z-fighting),因为卡片不确定要在前面绘制哪个对象。链接的维基百科文章有更多这样的例子。

要解决此问题,请增加深度缓冲区的精度(位深度),减少视图的深度(距离远/近剪辑平面)或添加一个微小的偏移量,以便坐标不再完全(或几乎)相同。您也可以简单地禁用深度缓冲区(或清除它)以进行渲染(在这种情况下,最后渲染的内容将与其他所有内容重叠)。

于 2012-07-04T08:05:53.083 回答
1

你的意思是你想一次显示几个纹理?然后使用多重纹理。使用以下方法将两个纹理附加到一个 Quad:

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

并根据glTexEnvi需要将它们组合在一起。如果您只想显示其中一个纹理,请在每个纹理上绘制两个带有单独纹理的四边形。并且稍后将绘制的四边形女巫将可见。然后,如果您想从一个转向另一个,-(void)请为每个四边形分别制作 's,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();

为每个纹理使用一个四边形的代码

-(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 回答