【问题标题】:OpenGL rendering with texture unclear纹理不清楚的OpenGL渲染
【发布时间】:2015-01-07 00:44:00
【问题描述】:

我使用的是最新版本的 OpenGL。但是当我使用 C++ 编写的以下函数创建纹理时:

GLuint Texture::Generate2dTexture(int width, int height, char* data, int length)
{
   GLuint textureIndex;

   glGenTextures(1, &textureIndex);
   glBindTexture(GL_TEXTURE_2D, textureIndex);
   gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, GL_BGR_EXT, GL_UNSIGNED_BYTE, data);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   return textureIndex;
}

并使用渲染:

void Renderer::DrawRectangle(GLuint textureID, RECTD rect)
{
    glBindTexture(GL_TEXTURE_2D, textureID);
    glBegin(GL_QUADS);
    {
        glTexCoord2f(0.0f, 1.0f);
        glVertex2d(rect.left, rect.top);
        glTexCoord2f(0.0f, 0.0f);
        glVertex2d(rect.left, rect.bottom);
        glTexCoord2f(1.0f, 0.0f);
        glVertex2d(rect.right, rect.bottom);
        glTexCoord2f(1.0f, 1.0f);
        glVertex2d(rect.right, rect.top);
    }
    glEnd();
}

渲染后它们看起来不清楚。看起来和M$制作的图片查看器中的外观有很大的不同。

发生这种情况的原因以及如何避免风险?

【问题讨论】:

  • 最新版本还在使用直接渲染?
  • 我想你所说的“不清楚”是指“模糊”。如果是这样,那是因为OpenGL做了双线性插值。如果您不希望发生插值,请使用 GL_NEAREST 而不是 GL_LINEAR。但是,除非您将纹素与像素对齐,否则您的纹理很可能看起来很丑。
  • @ratchetfreak idk,我以前就是这样编码的
  • @Tibo 这是唯一的解决方案吗?
  • 您还必须发布一些图像:上传到 GPU 之前的外观和渲染后的外观,因为许多用户只需要这 2 个图像来识别您的问题;)

标签: c++ opengl


【解决方案1】:

检查图片的尺寸。大多数图像加载器都希望图像以 2 的幂次方显示。因此,8x8 像素的图像应该看起来清晰(而不是拉伸或乱码)。尝试将图像裁剪为 32x32 或 128x128 等,看看是否有帮助。如果您想要的图像无法在 height=width 的位置表示,您仍然可以调整画布,使其类似于 128x128,然后只需使用 UV 坐标获取您想要用于纹理的图像部分。

另外,我认为如果您禁用双线性过滤,则应注意任何模糊: glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

请注意,这不是一个明确的答案 - 我没有足够的代表发表评论...

【讨论】:

  • 是的,许多 GL 3.x 和 GL 4.x 卡在 NPOT2 图像方面仍然存在许多问题,尤其是在使用已弃用的管道时,因为它们可能永远不会修复已弃用 API 驱动程序的错误
猜你喜欢
  • 2014-08-09
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多