Как установить параметры текстуры в OpenGL / GLFW, чтобы избежать наложения текстур (волнообразное поведение на границах объектов) при просмотре объектов на расстоянии? - PullRequest
1 голос
/ 27 апреля 2019

Я рендеринг огромного трехмерного массива кубов, который иногда насчитывает тысячи кубов, расположенных рядом друг с другом.Я рендеринг текстуры 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 (), но пока ни один из них не работал.

1 Ответ

3 голосов
/ 27 апреля 2019

Если вы хотите включить Mip Mapping , то вам нужно использовать одну из минимизирующих функций, таких как GL_NEAREST_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR или GL_LINEAR_MIPMAP_LINEAR, см. glTexParameter и Текстура - Mip Maps :

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

Дальнейшее улучшение можно получить с помощью Анизотропная фильтрация , которая обеспечивается расширением ARB_texture_filter_anisotropic и является основной функцией начиная с OpenGL 4.6.

* * 1 022, например,
glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY, 16);

См. Объект Sampler - Анизотропная фильтрация

...