2011-03-09 81 views
1

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

回答

3

您可能没有完全按下屏幕像素网格。这将导致纹理过滤模糊它。这个问题有点复杂:不是将纹理看作一系列点,而是将它看作网格规则纸(纹理表可以被拉伸,剪切,缩放)。为了使东西看起来很脆,网格必须完美对齐。纹理坐标(0,0)和(1,1)不会触及纹理元素的中心,而会触及纹理表的外边缘。因此,您需要一点点抵消和缩放以解决texel中心问题。将目标四边形放置在屏幕上也是一样,顶点位置必须与屏幕边缘对齐,而不是像素中心。如果您的投影和模型视图矩阵没有以模型视图空间中的一个单位是一个像素宽的方式进行设置,并且投影填充了整个屏幕(或窗口视口),则很难做到这一点。

人们通常用

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滤波模式下,相邻像素被插值,插值因子beding确定它们离网格有多远(以俗语来说,实际实现看起来稍微不同)。

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

0

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