【问题标题】:Texture repeating on quads OpenGL纹理在四边形 OpenGL 上重复
【发布时间】:2014-04-10 17:34:51
【问题描述】:

我正在编写一个体素引擎,目前 我正在研究块渲染系统,但我遇到了问题。 似乎纹理在四边形上重复了。

  

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

这是 OpenGL 渲染代码:

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);

【问题讨论】:

    标签: java opengl rendering lwjgl repeat


    【解决方案1】:

    确保将GL_TEXTURE_WRAP_S 和GL_TEXTURE_WRAP_T 设置为GL_CLAMP_TO_EDGE。

    【讨论】:

    • @user3512521:您应该接受这个答案,而不是用“谢谢”来评论。现在这个问题似乎没有答案,因为没有可接受的答案。
    • 我是新来的,对不起。我不知道。
    【解决方案2】:

    genpfault 的回答应该可以帮到你,我只是想让你了解一下为什么你需要这种特殊的包装状态。

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

    您似乎正在使用GL_LINEAR 过滤(默认)和不适当的纹理环绕状态(例如GL_REPEAT 或GL_CLAMP)。我稍后会解释为什么GL_CLAMP 是个坏主意。


    您可能认为纹理坐标 0.0 和 1.0 完全在归一化纹理坐标范围内,因此不受环绕,但您错了。 p>

    这种特殊的状态组合将从纹理的另一侧在 [0,1] 纹理坐标范围的任一极端处拾取纹素。纹理坐标 1.0 实际上略超出纹理中最后一个纹素的 中心,所以当 GL 获取用于线性过滤的 4 个 最近 纹素,对于其中至少 2 个,它环绕到纹理的另一侧。

    GL_CLAMP_TO_EDGE 修改了这种行为,它将纹理坐标限制在实际上比 [0,1] 更严格的范围内,因此没有坐标超出您的任何边缘纹理的 center质地。使用此设置,线性过滤不会从纹理的另一侧拾取纹素。您也可以(大部分)通过使用GL_NEAREST 过滤来解决此问题,但这会导致大量纹理混叠。


    也有可能您正在使用GL_CLAMP,顺便说一句,它已在 OpenGL 3.1 中被删除。在旧版本的 GL 中,它被设计为将坐标限制在 [0,1] 范围内,然后如果线性过滤试图获取超出边缘的纹素,它将使用一组特殊的边框纹素而不是环绕。不再支持边框纹素,因此该环绕模式消失了。

    底线是不要使用GL_CLAMP,它不像大多数人想的那样。 GL_CLAMP_TO_EDGE 几乎总是真正在您想到夹紧纹理时想要的。


    编辑:

    genpfault 提出了一个很好的观点;用图表会更容易理解......

    下图一维说明问题:

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

    我在写给similar issue 的回复中对此图有更详尽的解释。

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多