Opengl es 使用纹理坐标的OpenGL ES 1.1纹理到像素映射不起作用,我做错了什么? 编辑

Opengl es 使用纹理坐标的OpenGL ES 1.1纹理到像素映射不起作用,我做错了什么? 编辑,opengl-es,texture-mapping,Opengl Es,Texture Mapping,好的,这个问题很老了 在学习了一些OpenGL ES和测试之后,我发现我的iPhone4实际上使用了两倍分辨率的图像。如果我没记错的话,我必须将OpenGL上下文比例点设置为2 然后图像看起来很清晰 希望这能帮助其他有同样问题的人 原始问题 我一直试图克制自己不去发问,并继续在互联网上搜索任何进一步的线索,以了解为什么我的texel到像素映射没有成功,但OpenGL被证明是一个需要正确处理的怪物 OpenGL开发环境: iphone4 OpenGL ES 1.1 纵向模式下的屏幕宽度=320像素

好的,这个问题很老了

在学习了一些OpenGL ES和测试之后,我发现我的iPhone4实际上使用了两倍分辨率的图像。如果我没记错的话,我必须将OpenGL上下文比例点设置为2

然后图像看起来很清晰

希望这能帮助其他有同样问题的人

原始问题 我一直试图克制自己不去发问,并继续在互联网上搜索任何进一步的线索,以了解为什么我的texel到像素映射没有成功,但OpenGL被证明是一个需要正确处理的怪物

OpenGL开发环境: iphone4
OpenGL ES 1.1
纵向模式下的屏幕宽度=320像素(UI屏幕边界宽度)
纵向模式下的屏幕高度=480像素(UI屏幕边界高度)
纹理图像宽度=480像素(图像文件像素) 纹理图像高度=320像素(图像文件像素)

您可以下载的资源: Xcode项目:
使用的纹理图像:

问题是: 我一直在研究将纹理映射到像素的问题,以便最终绘制的纹理像Photoshop中那样清晰锐利,即像素和纹理纹理纹理之间的像素完美映射

我理解问题在于纹理中心不是位于像素中心之上。我也知道解决这个问题的方法是将texel移动半个texel(或者是像素?)

我尝试过设置纹理坐标数组,如下所示:

const GLfloat texCoords[] = 
 {
 0.0 + (0.5 / 480.0), 1.0 + (0.5 / 320.0), 
 1.0 + (0.5 / 480.0), 1.0 + (0.5 / 320.0), 
 0.0 + (0.5 / 480.0), 0.0 + (0.5 / 320.0), 
 1.0 + (0.5 / 480.0), 0.0 + (0.5 / 320.0)
 };
(类似地,我也尝试设置顶点坐标。根据我阅读的一些示例,他们说可以更改纹理坐标或顶点坐标)

如果我使用纹理坐标0.0到1.0运行我的应用程序,纹理在iPhone模拟器中看起来非常完美,但是如果我在iPhone上运行应用程序,纹理会有一个非常轻微的模糊

我做错了什么

我是否需要将纹理坐标乘以屏幕宽高比因子

我已经上传了我用来绘制OpenGL场景的Xcode项目和我使用的纹理图像(上面链接)


干杯。

除了马库斯所说的之外,你更应该从1.0中减去半个texel,而不是相加。并对顶点位置执行相同的操作(下界加一半,上界减一半)。还应该确保纹理的宽度和高度用于纹理偏移,屏幕的宽度和高度用于位置偏移,而不是两者都使用(当然,除非它们相等)。这将为您提供相当完美的像素纹理贴图。

这显然是一个纹理重采样问题。您的iphone可能正在将纹理重新采样为新的大小n^2。例如512x512。只能使用2维幂的纹理,因为这是大多数图形硬件所要求的。

哪个是纹理大小,480x320(如上所述)还是320x480(我认为是)?如果将0.5/480.0更改为0.5/320.0,反之亦然,该怎么办?我的纹理是480 x 320像素的横向图像。在得到相同的结果(轻微模糊)之前,我尝试过切换这些值。我的纹理是一个宽度为480、高度为320像素的lanscape纹理。我已经试着按照你过去的建议来转换这些值。它给出了相同的模糊纹理结果。嘿,克里斯蒂安,我以前试过减法,它给出了相同的模糊纹理。我已经使用glOrtho设置了我的视口,并且使用了320的宽度值和480的高度值,所以我认为我有一个1到1像素的纹理映射,因为当我设置480 x 320纹理时,整个纹理适合屏幕。如果有人想进一步讨论这个问题,我正在使用gmail和hotmail。非常感谢你的帮助Dan我的图像是512 x 512。无论如何,我已经决定继续我未来的项目,使用2D游戏引擎进行2D图形,而不是尝试使用OpenGL 3D编程来渲染2D游戏世界。使用像Cocos2D这样的游戏引擎为我处理所有这些技术问题,让我能够专注于构建游戏,而不是试图让图像在屏幕上显示。更能激励人的是:D