OpenGL 4.4纹理图集文物

时间:2015-10-23 16:59:27

标签: opengl tile artifacts texture-atlas


我正在用OpenTK在C#中编写一个小的OpenGL tile map渲染器。 要渲染切片,我首先创建一个顶点数组,然后创建一个顶点缓冲区 接下来,我迭代所有切片并依赖切片类型我将两个三角形添加到顶点缓冲区,并带有相应的顶点(纹理坐标,颜色,位置)。
为了避免纹理昂贵的切换我使用一个大纹理与所有瓷砖纹理命名纹理图集。
但是在处理纹理图集时我遇到了问题 问题是,如果我缩小并移动相机,我会在某些瓷砖的边缘出现一些文物 我在互联网上找到的解决方案是......

  1. ...用半像素校正来计算纹理坐标。
  2. ...使用纹理数组
  3. 我试过的第一个但它没有达到预期的效果(更多解释如下) 第二个我不知道如何使用纹理数组,我无法在互联网上找到很多纹理数组。

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

    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;
    

    一块半像素校正的图块:
    One tile with half pixel correction

    一块瓷砖没有半像素校正:
    One tile without half pixel correction

    多个瓷砖 半像素校正:
    Multiple tiles with half pixel correction

    多个瓷砖没有半像素校正:
    Multiple tiles without half pixel correction

1 个答案:

答案 0 :(得分:1)

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

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

enter image description here

N像素宽度也取决于未来地图集的mip级别。因此,如果您要添加一个像素边框,则只能使用单个mip级别(零mip级别)。对于两个 - 你可以使用0 mip和1 mip等级。确保你使用mip级别而不是边框​​宽度。