加载纹理时,我已经在其中包含以下行:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

但是当我在渲染过程中在此处缩放图像时:
glTexCoord2d(0.0,0.0);
glTexCoord2d(0.0454,0.0);
glTexCoord2d(0.0454,1.0);
glTexCoord2d(1.0,1.0);

我对纹理的过滤真的很糟糕(纹理是带有多个帧的Spritesheet,我不想为每个帧制作一个单独的文件)。

最佳答案

就纹理过滤而言,您做得对。但是,仅仅避免所有采样伪影是不够的,尤其是在移动精灵时。您还必须确保:

  • 您的精灵大小(以像素为单位)(在屏幕上)是其大小以texel为单位(在纹理中)的整数倍。
  • 您可以在以像素为单位的整数坐标上绘制精灵(或整数个半,这取决于OpenGL如何在纹理中定位纹理元素,我不记得了)

  • 为了说明问题,假设您有一个32x32的sprite(在纹理中),并将其映射到屏幕上的43x43像素的四边形。然后,GPU仅具有32个像素,以填充43个像素的宽度,因此它需要复制一些像素。精确复制哪些纹理像素取决于屏幕上四边形的坐标(如果使用非整数坐标)。因此,当GPU决定复制不同的纹理像素以填充四边形时,运动的精灵似乎会出现奇怪的闪烁颜色。

    为避免此问题并获得最佳外观的精灵,您确实希望每个纹理像素映射到单个屏幕像素。如果执行此操作,则不再使用GL_NEARESTGL_LINEAR,因为每个像素将仅使用单个纹理像素的颜色。

    10-07 19:19
    查看更多