纹理变得像素化而不是模糊

时间:2017-05-18 18:29:44

标签: opengl textures mipmaps

我创建了一个简单的OpenGL应用程序。 当放大到纹理四边形时,纹理变得像素化而不是模糊。我猜这是因为缺少mipmap?

我像这样创建我的纹理:

  glGenTextures(1, &mTexture);
  glBindTexture(GL_TEXTURE_2D, mTexture);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

我从这样的PBO更新它:

 glBindTexture(GL_TEXTURE_2D, mTexture);
  glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, mPboIds[mPboIndex]);

  glTexSubImage2D(
    GL_TEXTURE_2D,
    0, 0, 0,
    frame->GetWidth(),
    frame->GetHeight(),
    GL_RGB,
    GL_UNSIGNED_BYTE,
    0);

我认为GL_TEXTURE_MAG_FILTER和GL_TEXTURE_MIN_FILTER会告诉OpenGL生成mipmap。不是这样的吗? 如何为纹理启用mipmap生成?

1 个答案:

答案 0 :(得分:1)

在增加纹理缩放时使用放大滤镜,可以有两个值:

  • GL_NEAREST - 返回与指定纹理坐标最接近(在曼哈顿距离内)的纹理元素的值。

  • GL_LINEAR - 返回最接近指定纹理坐标的纹理元素的加权平均值。这些可以包括从纹理的其他部分包裹或重复的项目,具体取决于GL_TEXTURE_WRAP_S和GL_TEXTURE_WRAP_T的值,以及确切的映射。

在您的情况下,您使用了错误的放大滤镜。它必须是GL_LINEAR才能最小化像素化效果。

另一方面,当你想要减小变焦并且想要在纹理开始变得离观众太远时想要平滑过渡时,使用

MipMaps。要获得有关MipMaps的更多信息,您可以在GL_TEXTURE_MIN_FILTER部分查看glTexParameter手册页,以及如何在glGenerateMipmap手册页中生成。