我有一个2D游戏引擎,可通过从tileset图像绘制图块来绘制图块。由于默认情况下OpenGL只能包装整个纹理(GL_REPEAT
),而不仅仅是部分纹理,因此每个图块都被拆分为单独的纹理。然后,将同一图块的区域渲染为彼此相邻。这是按预期工作时的样子:
但是,一旦引入分数缩放,接缝就会出现:
为什么会这样?我以为这是由于线性过滤混合了四边形的边界,但仍然发生在点过滤中。到目前为止,我发现的唯一解决方案是确保所有定位和缩放仅在整数值处进行,并使用点过滤。这可能会降低游戏的视觉质量(尤其是子像素定位不再起作用,因此运动不太流畅)。
我尝试过/考虑过的事情:
- 抗锯齿可以减少但不能完全消除接缝
- 关闭mipmapping,无效
- 分别渲染每个图块并将其边缘拉伸1px-但这是一种非优化,因为它不再能够一次性渲染图块区域,并且会沿着透明区域的边缘创建其他伪像
- 在源图像周围添加1px边框并重复最后一个像素-但随后它们不再是2的幂,从而导致与不支持NPOT的系统的兼容性问题
- 编写自定义着色器以处理平铺图像-但是您将有何不同呢?
GL_REPEAT
应从边框的图像另一侧抓住像素,而不要选择透明度。 - 几何形状完全相邻,没有浮点舍入错误。
- 如果片段着色器经过硬编码以返回相同的颜色,则接缝消失。
- 如果将纹理设置为
GL_CLAMP
而不是GL_REPEAT
,则接缝消失(尽管渲染错误)。 - 如果纹理设置为
GL_MIRRORED_REPEAT
,则接缝消失(尽管渲染还是错误的)。 - 如果我将背景设为红色,则接缝仍为白色。这表明它是从某个地方(而不是透明度)采样不透明的白色。
因此,接缝仅在GL_REPEAT
设置时出现。仅出于某种原因,仅在此模式下,几何图形的边缘会出现渗色/泄漏/透明性。这个怎么可能?整个纹理是不透明的。
GL_NEAREST
,在R
坐标方向上进行采样的3D纹理与数组纹理也一样有效。Mipmapping无法正常工作,但是根据您的应用程序判断,您可能始终不需要mipmap。