繁体   English   中英

纹理重复四边形OpenGL

[英]Texture repeating on quads OpenGL

我正在写一个体素引擎,目前我正在研究Chunk-Rendering-System,但我有一个问题。 似乎在四边形上重复了纹理。

http://i.stack.imgur.com/6iuuN.png

草块底部有绿线,我不知道为什么。

这是OpenGL-Render-Code:

Texture texture = TextureManager.getTexture(block.getTextureNameForSide(Direction.UP));
texture.bind();
GL11.glBegin(GL11.GL_QUADS);
GL11.glTexCoord2d(0, 0); GL11.glVertex3f(0, 1, 0);
GL11.glTexCoord2d(1, 0); GL11.glVertex3f(0, 1, 1);
GL11.glTexCoord2d(1, 1); GL11.glVertex3f(1, 1, 1);
GL11.glTexCoord2d(0, 1); GL11.glVertex3f(1, 1, 0);
GL11.glEnd();

这是OpenGL设置:

GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glShadeModel(GL11.GL_SMOOTH);
GL11.glClearColor(0.1F, 0.4F, 0.6F, 0F);
GL11.glClearDepth(1F);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDepthFunc(GL11.GL_LEQUAL);
GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST);
GL11.glCullFace(GL11.GL_BACK);
GL11.glEnable(GL11.GL_CULL_FACE);

确保GL_TEXTURE_WRAP_SGL_TEXTURE_WRAP_T设置为GL_CLAMP_TO_EDGE

genpfault的答案应该为你做的伎俩,我只是想让你深入了解为什么你需要这个特定的包裹状态。

要清楚,屏幕截图中的绿线对应于您的一个体素的边缘?

看起来您正在使用GL_LINEAR过滤(默认)以及不适当的纹理包装状态(例如GL_REPEATGL_CLAMP )。 我将在后面解释为什么GL_CLAMP是一个坏主意。


你可能认为纹理坐标0.01.0完全在标准化的纹理坐标范围内,因此不会被包裹,但你会错的。

这种特殊的状态组合将在[0,1]纹理坐标范围的任一极端处从纹理的另一侧拾取纹素。 纹理坐标1.0实际上稍微超出了纹理中最后一个纹素的中心 ,因此当GL获取4个最接近的纹素以进行线性过滤时,它会围绕纹理的另一侧包裹至少2个纹素。

GL_CLAMP_TO_EDGE修改了这种行为,它将纹理坐标限制在实际上比[0,1]更具限制性的范围内,这样任何坐标都不会超出纹理中任何边纹理像素的中心 线性过滤不会使用此集从纹理的另一侧拾取纹素。 你也可以(大部分)通过使用GL_NEAREST过滤来解决这个问题,但这会导致很多纹理混叠。


您也可以使用GL_CLAMP ,顺便说一下,在OpenGL 3.1中删除了GL_CLAMP 在GL的旧版本中,它被设计为将坐标钳位到范围[0,1]中,然后如果线性过滤试图获取超出边缘的纹理元素,则它将使用一组特殊的边框纹理而不是环绕。 不再支持边框纹理,因此包装模式消失了。

底线是不使用GL_CLAMP ,它没有做大多数人的想法。 当你想到夹紧纹理时, GL_CLAMP_TO_EDGE几乎总是你真正想要的。


编辑:

genpfault提出了一个好点; 通过图表可以更容易理解...

下图说明了1维问题:

http://i.msdn.microsoft.com/dynimg/IC83860.gif

在我写给类似问题的答案中,我对这个图有了更全面的解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM