如何避免模糊效果?
How to avoid blurry effect?
我目前正在使用 Opengl 进行 3d 项目,但我遇到了远方块的模糊效果问题。
如您所见,附近的块很好,但随着距离的增加,块很快变得模糊。 (ps:忽略红色方块)
我尝试了不同分辨率的图像(1024x1024 和 2048x2048),但结果相同。
我尝试修改 GL_TEXTURE_2D 选项但没有解决我的问题。
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_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
如果有人知道如何处理这个问题,那就太好了。提前谢谢
作为评论发布,现在作为正确答案发布,以便标记为已回答。
在观察纹理表面时,尤其是远处的表面,纹理特征的频率可能会超过必要的采样频率(framebuffer/screen 的像素;参见奈奎斯特极限)。为了解决这个问题,采用了 MIP 映射,它降低了特征频率(缩小)。但是,这并没有考虑透视失真。各向异性过滤将样本放置在梯形纹理上以校正倾斜的纹理。
在 OpenGL 中,您需要版本 4.6 或 EXT_texture_filter_anisotropic。然后,您可以使用 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, num_samples)
为每个纹理启用各向异性过滤 - 这会设置硬件可能使用的 最大 样本数,任何给定的纹理获取可能会使用更少,但如果它认为更多过度。请注意,您可以设置的上限是实现定义的,必须使用 glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max_samples)
查询。更多的样本意味着更高的质量(合理地直到 16 左右),但也意味着更高的性能成本(通常不会破坏交易)。
我目前正在使用 Opengl 进行 3d 项目,但我遇到了远方块的模糊效果问题。
如您所见,附近的块很好,但随着距离的增加,块很快变得模糊。 (ps:忽略红色方块)
我尝试了不同分辨率的图像(1024x1024 和 2048x2048),但结果相同。
我尝试修改 GL_TEXTURE_2D 选项但没有解决我的问题。
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_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
如果有人知道如何处理这个问题,那就太好了。提前谢谢
作为评论发布,现在作为正确答案发布,以便标记为已回答。
在观察纹理表面时,尤其是远处的表面,纹理特征的频率可能会超过必要的采样频率(framebuffer/screen 的像素;参见奈奎斯特极限)。为了解决这个问题,采用了 MIP 映射,它降低了特征频率(缩小)。但是,这并没有考虑透视失真。各向异性过滤将样本放置在梯形纹理上以校正倾斜的纹理。
在 OpenGL 中,您需要版本 4.6 或 EXT_texture_filter_anisotropic。然后,您可以使用 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, num_samples)
为每个纹理启用各向异性过滤 - 这会设置硬件可能使用的 最大 样本数,任何给定的纹理获取可能会使用更少,但如果它认为更多过度。请注意,您可以设置的上限是实现定义的,必须使用 glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max_samples)
查询。更多的样本意味着更高的质量(合理地直到 16 左右),但也意味着更高的性能成本(通常不会破坏交易)。