【问题标题】:32 pixel gap at top of opengl es textureopengl es 纹理顶部的 32 像素间隙
【发布时间】:2009-10-20 05:56:36
【问题描述】:

我正在尝试使用 openGL ES(适用于 iPhone)渲染到纹理,然后在屏幕上显示纹理。一切正常,除了纹理顶部有 32 行间隙,底部 32 行被切断。就像我所有的绘图都向下偏移了 32 个像素,这导致底部 32 行没有被绘制,因为它们在纹理之外。

这是一个非常简单的例子:

void RenderToTexture( int texture )
{
    unsigned char buffer[4 * 320 * 480];
    unsigned char colour[4];
    colour[0] = 255;
    colour[1] = 0;
    colour[2] = 0;
    colour[3] = 128;
    for ( int i = 0; i < 4 * 320 * 480; i += 4 )
    {
        buffer[i] = colour[0];
        buffer[i+1] = colour[1];
        buffer[i+2] = colour[2];
        buffer[i+3] = colour[3];
    }
    glBindTexture( GL_TEXTURE_2D, texture );
    glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 320, 480, GL_RGBA, GL_UNSIGNED_BYTE, buffer );
}

结果如下:

使用 glColor4f() 设置颜色而不是调用 RenderToTexture() 会导致预期的红屏。

【问题讨论】:

  • 在cocoa中,引入空间来放置状态栏。使用此行将其删除: self.frame = [[UIScreen mainScreen] bounds];
  • 状态栏只有 20px 高,不过....

标签: iphone opengl-es textures render


【解决方案1】:

这 32 个像素是 512 的缺失像素:512 - 480 = 32。 原因是您只能使用 GL_TEXTURE_2D 的 2 次幂的纹理大小。 所以你必须将你的宽度和高度四舍五入到 512。你仍然可以通过使用纹理坐标或设置纹理矩阵只显示你想要的纹理部分。

【讨论】:

    【解决方案2】:

    iPhone 3GS 在某些条件下支持非二次方纹理。以下所有内容必须为真:

    • GL_TEXTURE_WRAP_S 应设置为 GL_CLAMP_TO_EDGE
    • GL_TEXTURE_WRAP_T 应设置为 GL_CLAMP_TO_EDGE
    • 必须关闭 Mipmapping;使用 GL_LINEAR 而不是 GL_LINEAR_MIPMAP_LINEAR 进行缩小

    【讨论】:

      猜你喜欢
      • 2012-02-04
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 2011-05-19
      相关资源
      最近更新 更多