即使使用GL_NEAREST(GL_TEXTURE_2D),OpenGL仍会尝试模糊

orl*_*rlp 8 opengl

一张图片说千言万语,那两个呢?我有这个地图艺术:

地图图片

为了将其实际用作地图,我将此纹理缩放6次.然而,这并没有像预期的那样:

期望 - 实际

所有OpenGL代码都在我的自制2D OpenGL渲染库中,由于OpenGL是状态机,因此很难实际记录整个渲染过程.但这里是+/-我做的(代码是Python):

width, height = window.get_size()
glViewport(0, 0, width, height)

glMatrixMode(GL_PROJECTION)
glPushMatrix()
glLoadIdentity()

glOrtho(0.0, width, height, 0.0, 0.0, 1.0)

glMatrixMode(GL_MODELVIEW)
glPushMatrix()
glLoadIdentity()

# displacement trick for exact pixelization
glTranslatef(0.375, 0.375, 0.0)

glDisable(GL_DEPTH_TEST)
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

glEnable(self.texture.target) # GL_TEXTURE_2D
glBindTexture(self.texture.target, self.texture.id)

glTexParameteri(self.texture.target, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexParameteri(self.texture.target, GL_TEXTURE_MAG_FILTER, GL_NEAREST)

glPushMatrix()

glTranslatef(self.x, self.y, 0.0) # self.x and self.y are negative int offsets
glScalef(self.scale_x, self.scale_y, 1.0) # scale_x and scale_y are both 6

glBegin(GL_QUADS)
glTexCoord2i(0, 0)
glVertex2i(0, 0)
glTexCoord2i(0, 1)
glVertex2i(0, self.texture.height)
glTexCoord2i(1, 1)
glVertex2i(self.texture.width, self.texture.height)
glTexCoord2i(self.texture.width, 0)
glVertex2i(self.texture.width, 0)
glEnd()

glPopMatrix()
glDisable(self.texture.target)
Run Code Online (Sandbox Code Playgroud)

但是,当我使用GL_TEXTURE_RECTANGLE_ARB时,不会发生这种"模糊"错误.我也想能够使用GL_TEXTURE_2D,所以有人可以指出如何阻止这种情况发生吗?

Kro*_*ica 7

如有疑问 - 请用相同尺寸的black'n'white棋盘(黑/白1px)替换您的纹理.它会让你很好地了解将要发生的事情 - 它是统一的灰色(位移是错误的)还是会产生波浪(缩放是错误的).

确保没有自动生成和使用的mip-maps.

通常,您不需要任何特殊位移,纹素与正确设置的glOrtho匹配像素.

另一个重要问题 - 使用PowerOfTwo纹理,因为较旧的GPU可以使用各种方案来支持NPOT纹理(对用户透明地缩放或填充),这可能导致这种模糊.

要手动使用NPOT纹理,您需要使用清晰的像素填充它们,直到下一个POT大小,并按glTextCoord2f(u,v)因子缩放UV值npotSize / potSize.请注意,这与平铺不兼容,但从您的艺术来看,您不需要它.