glTranslatef的问题

时间:2011-03-09 09:30:11

标签: iphone objective-c opengl-es

我使用glTranslate命令来移动我在iPhone OpenGL App中从纹理加载的精灵的位置。我的问题是在我应用glTranslatef之后,图像看起来有点模糊。当我评论这行代码时,图像非常清晰。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

你可能没有准确地击中屏幕像素网格。这将导致纹理过滤使其模糊。问题有点复杂:不要将屏幕纹理视为点阵列,而是将其视为网格状纸张(纹理板可以拉伸,剪切,缩放)。为了使事物看起来清晰,网格必须完美对齐。纹理坐标(0,0)和(1,1)不会碰到纹理像素的中心,而是纹理图纸的外边缘。因此,您需要一点点偏移和缩放以解决纹理中心问题。将目标四边形放置在屏幕上也是如此,其中顶点位置必须与屏幕边缘对齐,而不是像素中心。如果您的投影和模型视图矩阵的设置不是模型视图空间中的一个单位是一个像素宽并且投影填满整个屏幕(或窗口视口),那么很难做到这一点。

通常以

开头
glViewport(0,0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, 0, height, -1, 1);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

// modelview XY range 0..width x 0..height now covers the whole viewport
// (0,0) don't address the lower left pixel but the lower left edge of this
// (width,height) similarily addresses the upper right corner

// drawing a 0..width x 0..height quad with texture coordinates 0..1 x 0..1
// will cover it perfectly

只要四边形具有完全相同的尺寸(即它的顶点位置匹配),纹理坐标顶点位置是整数,这将起作用。

现在有趣的部分是:如果他们不符合这些条件怎么办?然后出现混叠。在GL_NEAREST过滤模式中,事物看起来仍然很清晰,但是一些行/行只是缺失。在GL_LINEAR滤波模式中,相邻像素使用插值因子插值进行插值,确定它们离网格有多远(在外行中,实际实现看起来略有不同)。

那么如何解决您的问题:在与视口匹配的投影/模型视图中绘制精灵,仅使用顶点坐标的整数坐标并使纹理覆盖整个图片。如果你只使用纹理坐标范围的一部分,事情变得更有趣,因为一个解决了纹理网格,而不是纹素中心。

答案 1 :(得分:0)

我建议查看你的modelview矩阵声明,并确保调用glLoadIdentity()以确保在应用转换之前矩阵堆栈是干净的。

相关问题