纹理变得像素化而不是模糊
Texture getting pixelated instead of blurry
我创建了一个简单的 OpenGL 应用程序。
放大带纹理的四边形时,纹理变得像素化而不是模糊。我猜这是因为缺少 mipmaps?
我这样创建纹理:
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 生成?
放大纹理时使用放大过滤器,可以有两个值:
GL_NEAREST - Returns 最接近(曼哈顿距离)指定纹理坐标的纹理元素的值。
GL_LINEAR - Returns 最接近指定纹理坐标的纹理元素的加权平均值。这些可以包括从纹理的其他部分包裹或重复的项目,具体取决于 GL_TEXTURE_WRAP_S 和 GL_TEXTURE_WRAP_T 的值以及确切的映射。
在你的情况下,你使用了错误的放大过滤器。必须 GL_LINEAR 以最小化像素化效果。
MipMaps,另一方面,当您想要减小缩放比例并希望在纹理开始变得离观察者太远时获得平滑过渡时使用。要获得有关 MipMaps 的更多信息,您可以查看 glTexParameter manual pages, at section GL_TEXTURE_MIN_FILTER, and how to generate in glGenerateMipmap 手册页。
我创建了一个简单的 OpenGL 应用程序。 放大带纹理的四边形时,纹理变得像素化而不是模糊。我猜这是因为缺少 mipmaps?
我这样创建纹理:
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 生成?
放大纹理时使用放大过滤器,可以有两个值:
GL_NEAREST - Returns 最接近(曼哈顿距离)指定纹理坐标的纹理元素的值。
GL_LINEAR - Returns 最接近指定纹理坐标的纹理元素的加权平均值。这些可以包括从纹理的其他部分包裹或重复的项目,具体取决于 GL_TEXTURE_WRAP_S 和 GL_TEXTURE_WRAP_T 的值以及确切的映射。
在你的情况下,你使用了错误的放大过滤器。必须 GL_LINEAR 以最小化像素化效果。
MipMaps,另一方面,当您想要减小缩放比例并希望在纹理开始变得离观察者太远时获得平滑过渡时使用。要获得有关 MipMaps 的更多信息,您可以查看 glTexParameter manual pages, at section GL_TEXTURE_MIN_FILTER, and how to generate in glGenerateMipmap 手册页。