我正在使用 OpenTK 用 C# 编写一个小型 OpenGL 平铺地图渲染器。为了渲染图块,我首先创建了一个顶点数组,然后创建了一个顶点缓冲区。
接下来,我遍历所有图块并根据图块类型将两个三角形添加到具有相应顶点(纹理坐标、颜色、位置)的顶点缓冲区。
为了避免昂贵的纹理切换,我使用了一个包含所有平铺纹理的大纹理,名为纹理图集。
但是我在使用纹理图集时遇到了问题。
问题是,如果我缩小并四处移动相机,我会在某些图块的边缘出现一些伪影。
我在互联网上找到的解决方案是......
- ...用半像素校正计算纹理坐标。
- ...使用纹理数组
我尝试的第一个,但没有达到预期的效果(下面有更多解释)。
第二个我不知道如何使用纹理数组,我在互联网上找不到太多关于纹理数组的信息。
我使用了以下纹理过滤器:
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;