【问题标题】:OpenGL 4.4 texture atlas artifactsOpenGL 4.4 纹理图集工件
【发布时间】:2015-10-23 16:59:26
【问题描述】:


我正在使用 OpenTK 用 C# 编写一个小型 OpenGL 平铺地图渲染器。 为了渲染图块,我首先创建了一个顶点数组,然后创建了一个顶点缓冲区。
接下来,我遍历所有图块并根据图块类型将两个三角形添加到具有相应顶点(纹理坐标、颜色、位置)的顶点缓冲区。
为了避免昂贵的纹理切换,我使用了一个带有所有平铺纹理的大纹理,名为纹理图集。
但是我在使用纹理图集时遇到了问题。
问题是,如果我缩小并四处移动相机,我会在某些图块的边缘看到一些伪影。
我在互联网上找到的解决方案是......

  1. ...用半像素校正计算纹理坐标。
  2. ...使用纹理数组

我尝试了第一个,但没有达到预期的效果(更多解释如下)。
第二个我不知道如何使用纹理数组,我在互联网上找不到太多关于纹理数组的信息。

我使用了以下纹理过滤器:

GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest);

纹理坐标计算带有半像素校正:

text_coord_x = (0.5f + pixel_x) / texture_width;
text_coord_y = (0.5f + pixel_x) / texture_height;

纹理坐标计算没有半像素校正:

text_coord_x = pixel_x / texture_width;
text_coord_y = pixel_y / texture_height;

一个图块具有半像素校正:

一个图块没有半像素校正:

多个图块具有半像素校正:

多个图块没有半像素校正:

【问题讨论】:

    标签: opengl tile artifacts texture-atlas


    【解决方案1】:

    为了解决您在地图集上的边框问题,您应该在每个精灵周围留下 N 个像素边框。此边框应包含像素信息,具体取决于您需要的平铺。此边框可能由很多 3d 程序生成。

    例如,Blender 可以通过边距选项将多个纹理烘焙成一个:


    N 像素宽度也取决于未来图集的 mip 级别。因此,如果您要添加一个像素边框,那么您可以只使用单个 mip 级别(零 mip 级别)。对于两个 - 您可以使用 0 mip 和 1 mip 级别等。确保您使用的 mip 级别不超过它们的边框宽度。

    【讨论】:

    • 谢谢,这可能是我必须使用的解决方案,但没有更好的方法吗?例如,minecraft tileset 文件不包含边框,并且在游戏中似乎没有文物。有人知道这是如何解决的吗?
    • 您能详细描述一下您的情况吗?你想做什么?
    • 我想知道我的世界如何在游戏中使用没有边框或填充的纹理图集。
    • Minecraft 使用 Nearest 就像您的示例一样。在这种情况下,他们可以使用质心插值来避免外推(看这里opengl.org/pipeline/article/vol003_6)或通过图集上的真实精灵坐标在片段着色器中钳制纹理坐标。但如果纹理被降采样,所有这些看起来都会很糟糕。
    猜你喜欢
    • 2014-12-30
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2020-04-03
    • 2015-02-05
    • 2012-12-09
    相关资源
    最近更新 更多