OpenGL纹理图像模糊

3

我正在尝试创建一个代表高程的多级纹理图像,其尺寸必须为940 x 618。我意识到我的纹理必须具有2的幂次方宽度和高度。目前,我已经尝试逐步进行所有纹理处理(例如64 x 64、128 x 128,甚至512 x 512),但图像仍然模糊不清。有没有更好的方法来处理这种大小的图像纹理?

4个回答

3
使用1024x1024的纹理,将图像放置在图像的一部分中,即940x618。然后使用值940.0/1024.0和618.0/1024.0作为最大纹理坐标,或者缩放TEXTURE_MATRIX。这将使您的像素进行1:1映射。您可能还需要将模型移动半个像素以获得完美的贴合,这取决于您的模型设置和视图。
这是我在为Mac制作的屏幕保护程序中使用的技术。http://memention.com/void/它捕捉屏幕内容,并在一些3D 效果上使用它作为纹理,我真的想要一个像素完美的贴合。

好的,我认为我的问题是我没有一对一地映射像素。我要使用glMultiTexCoord2f()设置最大纹理坐标吗?我需要在调用gluBuild2DMipmaps()之前这样做吗?感谢您的帮助! - anthv123
你可以使用新值来调用 glTexCoord2f,或者使用 glMatrixMode(GL_TEXTURE); glScalef(*nv1*,*nv2*,1.0); glMatrixMode(GL_TEXTURE); ... draw your thing as before ...; reset texture matrix to identity 来绘制你的图形。 - epatel
这是我正在使用的代码。看起来什么都没起作用。 glEnable(GL_LIGHTING); glLightfv(...); glMatrixMode(GL_TEXTURE); glScalef(940.0/1024.0, 618.0/1024.0, 1.0); glMatrixMode(GL_TEXTURE); glDrawElements(...); glLoadIdentity(); glDisable(GL_LIGHTING); - anthv123
哎呀...抱歉,刚才看到我两次使用了 GL_TEXTURE,最后一个 glMatrixMode(..) 应该重置为 glMatrixMode(GL_MODELVIEW) - epatel

2
据我所知,现代技术不要求您使用2的幂来设置尺寸。但是请注意,如果在旧机器上运行此代码,可能会遇到一些问题。请问您的机器有多久了?

绝对不是老旧的问题。有什么想法为什么会模糊吗?如果我尝试使用一个128 x 128的纹理来贴图整个图像,它会非常模糊,如果我使用256 x 256,它就会变得不那么模糊,以此类推... - anthv123
2
@anthv123 当你将纹理拉伸到比纹理本身更大或不同的宽高比时,它当然会变得模糊。因此,如果你的硬件不是很旧,只需尝试使用940x618的纹理,看看是否有效。你可以查看一下你的驱动程序是否支持GL_ARB_texture_non_power_of_two扩展(或者OpenGL 2.0作为替代)。 - Christian Rau
我已经尝试使用完全相同的纹理,但没有更好的效果。OpenGL 2.0以下的版本是否需要2的幂纹理? - anthv123
你可以尝试关闭过滤:glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - Ville Krumlinde

1

纹理可能没有1:1的映射,并且您正在使用GL_LINEAR或GL_NEAREST过滤。请尝试更高分辨率的纹理,使用mipmapping以及进行1:1屏幕映射。


此外,对于任何非英特尔极差显卡,您只需使用TEXTURE_NON_POWER_OF_2扩展即可加载任意大小的纹理。在这种情况下,您可以将其与范围为[0;1]的坐标映射,并且它应该是1:1的。 - Coder

0
使用一个940x618大小的纹理(如果这确实是应用于其上的表面的大小),并将纹理的缩小/放大设置为使用GL_LINEAR。这应该可以给你想要的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接