0


我正在使用 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;

一个带有半像素校正的图块:
一张带半像素校正的图块

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

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

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

4

1 回答 1

1

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

例如 Blender 可以使用边距选项将多个纹理烘焙成一个:

在此处输入图像描述

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

于 2015-10-23T20:41:32.927 回答