首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL正确显示纹理

OpenGL正确显示纹理
EN

Stack Overflow用户
提问于 2012-07-04 15:57:35
回答 2查看 305关注 0票数 1

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

在这种情况下,我只想显示其中一个纹理,同时获得以下内容

也就是说,我只想要第一个材料的纹理显示。

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

EN

回答 2

Stack Overflow用户

发布于 2012-07-04 16:05:53

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

要解决此问题,请增加深度缓冲区的精度(位深度),减少视图深度(距离远/近剪裁平面)或添加微小偏移,以便坐标不再完全(或几乎)相同。你也可以简单地禁用深度缓冲区(或清除它)来渲染它(在这种情况下,无论最后渲染的是什么,都会与其他所有东西重叠)。

票数 4
EN

Stack Overflow用户

发布于 2012-07-04 16:07:53

你的意思是你想一次显示几个纹理?那就使用多重纹理吧。使用以下命令将两个纹理附加到一个四边形:

代码语言:javascript
复制
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 0.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 0.0f);

并使用glTexEnvi将它们组合为您想要的。如果你只想显示一个纹理,那么画两个四边形,每个四边形上都有单独的纹理。和四个巫师将绘制稍后将是可见的。然后,如果你想从一个转到另一个,为每个四元组创建单独的按钮,在每个四元组图之前使用glClearColor,然后创建按钮来调用例如-(void)quad1-(void)来调用-(void)quad2

或者只使用深度缓冲区。

在你的情况下,我会使用多重纹理,因为所有的缓冲区对我来说都太难了。

我将展示我的代码是什么样子的。

使用多纹理的代码:

代码语言:javascript
复制
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();

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

代码语言:javascript
复制
-(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 here的信息这只是一个示例代码。写得很快,所以可能会有错误。如果我忘了什么,很抱歉。只是我很久没这么做了。它是在Mac上写的,所以如果你使用的是其他平台的maby,你将不得不修改一些东西(不是opengl)。关于深度缓冲呢?我不知道怎么用它。所以我不能为你解释。抱歉的。从来没用过。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11324776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档