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

问题描述 投票:1回答:1

我正在渲染一个巨大的3D立方体阵列,有时会将数千个立方体排列在一起。我正在为立方体渲染jpg纹理,这只是一个简单的颜色,框架周围有黑色边框。

问题是:数组是巨大的,并且数组的远端部分彼此混合,所以说。换句话说,远处立方体中的边界有时完全消失,有时它们与其他相邻边界一起形成任意波浪线。总而言之,场景看起来有点混乱,因为所有细节(相邻立方体之间的硬边界)都会丢失/融合在一起。在线搜索解决方案后,我明白问题可能在于我选择的纹理过滤选项。

这就是问题在OpenGL中的实际情况:Texture Aliasing between the cube borders 1

Texture Aliasing between the cube borders 2

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

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()函数中的参数之间进行更改,但现在都没有。

opengl textures glfw texture-mapping render-to-texture
1个回答
3
投票

如果你想启用Mip Mapping,那么你必须使用其中一个缩小函数,如GL_NEAREST_MIPMAP_NEARESTGL_LINEAR_MIPMAP_NEARESTGL_NEAREST_MIPMAP_LINEARGL_LINEAR_MIPMAP_LINEAR,请参阅glTexParameterTexture - Mip Maps

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

Anisotropic filtering可以获得进一步的改进,它由扩展ARB_texture_filter_anisotropic提供,并且是自OpenGL 4.6以来的核心功能。

EG

glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY, 16);

Sampler Object - Anisotropic filtering

© www.soinside.com 2019 - 2024. All rights reserved.