如何在 OpenGL/GLFW 中设置纹理参数以避免从远处查看对象时纹理混叠(对象边界上的波浪行为)?

How to set texture parameters in OpenGL/GLFW to avoid texture aliasing (wavey behavior on object borders) when viewing objects from a distance?

我正在渲染一个巨大的 3D 立方体阵列,有时会计算出数千个紧挨着彼此对齐的立方体。我正在为立方体渲染 jpg 纹理,它只是一种简单的颜色,框架周围有黑色边框。

问题: 阵列很大,可以说,阵列的远方部分相互混合在一起。换句话说,远处立方体中的边界有时完全消失,有时它们与其他相邻边界一起形成任意波浪线。总而言之,场景看起来有点乱,因为所有细节(相邻立方体之间的硬边界)都 lost/melted 在一起。在网上搜索了解决方案后,我了解到问题可能出在我选择的纹理过滤选项上。

问题在 OpenGL 中实际上是这样的:

当前加载纹理和设置纹理参数的代码如下所示:

glGenTextures(1, &texture3);
glBindTexture(GL_TEXTURE_2D, texture3);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
// set texture filtering parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

//load image:
data = stbi_load("resources/textures/gray_border.jpg", &width, &height, &nrChannels, 0);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);

到目前为止,我已经尝试过更改函数 glGenerateMipmap() 的不同参数并在 glTexParameteri() 函数的参数之间进行更改,但是 none 现在确实有效。

如果要启用Mip Mapping, then you have to use one of the minifying functions like GL_NEAREST_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR or GL_LINEAR_MIPMAP_LINEAR, see glTexParameter and Texture - Mip Maps:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

Anisotropic filtering, which is provides by the extension ARB_texture_filter_anisotropic 可以获得进一步的改进,这是自 OpenGL 4.6 以来的核心功能。

例如

glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY, 16);

参见 Sampler Object - Anisotropic filtering