Как заставить работать расширения анизотропной фильтрации? - PullRequest
0 голосов
/ 02 мая 2019

В моей программе (C ++ / OpenGL) я загружаю набор текстур и устанавливаю параметры текстуры следующим образом:

//TEXTURES
glGenTextures(1, &texture1);
glBindTexture(GL_TEXTURE_2D, texture1);
// set the texture wrapping parameters
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);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

Я обнаружил, что анизотропная фильтрация поможет мне улучшить внешний вид сцены. Поэтому я использовал эту строку для достижения этой цели:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY, 16);

Хотя у меня не было проблем с компиляцией этой строки кода на моем ноутбуке (у которого был производитель AMD GPU), я не могу добиться того, чтобы скомпилировать этот фрагмент кода на моем другом компьютере, используя Intel® R Graphics HD 530 (Skylake GT2) , В частности, попытка скомпилировать этот кусок кода с использованием g ++ выдает следующую ошибку:

error: ‘GL_TEXTURE_MAX_ANISOTROPY’ was not declared in this scope
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY, 16);

В частности, запустив в моем терминале Linux следующую команду:

glxinfo | grep -i opengl

раскрывает следующую информацию о моем поставщике графических процессоров и поддержке OpenGL: enter image description here

Я понимаю, что ANISOTROPIC FILTERING был включен в ARB_texture_filter_anisotropic , но я, честно говоря, не знаю, как проверить, поддерживает ли мой поставщик GPU расширение, и, если он это делает, как мне его сделать Можно ли использовать Анизотропную фильтрацию?

Кстати: я использую glfw3 и загрузчик GLAD.

Ответы [ 2 ]

2 голосов
/ 02 мая 2019
error: ‘GL_TEXTURE_MAX_ANISOTROPY’ was not declared in this scope

Это значение GLenum было определено в GL_ARB_texture_filter_anisotropic, что также является основной функцией OpenGL 4.6. Не ясно, какие механизмы для обработки расширения OpenGL вы используете, и если вы используете определенную библиотеку загрузчика GL .

Однако есть вероятность, что в вашей другой системе установленный в системе glext.h или какой-либо заголовок вашего загрузчика, такой как glew.h или glad.h или любой другой, который вы используете, не так нов, как те, которые вы использовали на другая система. В результате это значение не будет определено.

В случае анизотропной фильтрации это не является большой проблемой, поскольку GL_EXT_texture_filter_anisotropic предлагает точно такую ​​же функциональность и существует примерно с 2000 года, так что вы можете просто переключиться на постоянную GL_TEXTURE_MAX_ANISOTROPY_EXT. Причиной того, что это расширение было так поздно, чтобы получить статус ARB и основные функциональные возможности GL, были некоторые патенты, срок действия которых истек только недавно.

0 голосов
/ 02 мая 2019

Анизотропное значение - это значение с плавающей запятой, использующее префикс f: например,

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, value);

Где value - это значение с плавающей запятой.Стоит отметить, что несмотря на то, что анизотропная фильтрация не является технически частью стандарта GL, ее можно считать вездесущим расширением .То есть вы можете положиться на его существование на всех важных для него платформах.

Если вы хотите использовать максимально возможную анизотропию, попробуйте что-то вроде:

GLfloat value, max_anisotropy = 8.0f; /* don't exceed this value...*/
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, & value);

value = (value > max_anisotropy) ? max_anisotropy : value;
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...