【问题标题】:Can't draw OpenGL ES textures to non-round locations无法将 OpenGL ES 纹理绘制到非圆形位置
【发布时间】:2010-03-07 22:35:41
【问题描述】:

在绘制 OpenGL ES 纹理时,它们似乎“捕捉”到圆形像素位置,就好像绘制位置正在被四舍五入一样。 IE。在 (x:1.1, y:5.4) 绘制实际上在 (x:1, y:5) 绘制。这会导致纹理在滚动时看起来“跳跃”,而不是平滑移动。

是的,我正在为我的顶点等使用浮点类型。

画线等适用于非圆形位置。

纹理的位置只有两个因素:

  1. 视口的翻译: glTranslatef(viewWidth/2.0f, viewHeight/2.0f, 0.0f);

  2. 抽奖地点: glVertexPointer(...); // see below

我正在使用以下代码来绘制纹理:

glTranslatef(scrollX, scrollY, 0.0f);

...

glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);

// Overlay map.
glTexCoordPointer(2, GL_FLOAT, 0, textureSTs);
glBindTexture(GL_TEXTURE_2D, texture.glTtextureKeyD);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

GLfloat vertices[] = {
 x1, y2,
 x1, y1,
 x2, y1,
 x2, y2,
};
glVertexPointer(2, GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

我错过了什么吗?

【问题讨论】:

  • scrollX 和 scrollY 的类型是什么?也许即使它们是浮点数,您也可以将它们处理为整数?

标签: iphone opengl-es textures


【解决方案1】:

您的图像上传代码很可能使用 GL_NEAREST 过滤,如果您想对中间像素值进行良好过滤,最好的选择是 GL_LINEAR 过滤。尝试把 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);绑定后。使用 FSAA 也可以降低效果。

另一种可能性是在您的纹理坐标中,尝试将它们调整 1/2 个像素。因此,如果您的纹理为 256*256,则将 .5/256 添加到每个坐标的浮点值。

【讨论】:

  • 这正是问题所在。感谢 Medran 和 PeanutPower。
【解决方案2】:

是你的 x1, y2, x1, y1, x2, y1, x2,y2,

浮动还是被截断?

在进行除法乘法等之前,设置 x1、y1 等的代码是否要转换为浮点数?

x1 = (float)somevar * 0.5f

对于您输入 gltranslate 的 scrollX 也是如此

【讨论】:

  • 所以所有操作数在你的数学语句中都是浮点数?
  • 也许可以尝试调用 glLoadIdentity 以确保您的翻译是干净的?
  • 如果它们捕捉到圆形像素位置,如果您故意截断为整数,例如使用天花板或地板,这样您至少可以在 1、2、3、4 之间获得一致的移动
猜你喜欢
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多