Как OpenGL выбирает между использованием MAG_FILTER и MIN_Filter при доступе в шейдере?

При настройке OpenGL с glTexParamteri(GL_Texture_2D, GL_TEXTURE_MAG_FILTER, ...) и glTexParamteri(GL_Texture_2D, GL_TEXTURE_MIN_FILTER, ...) как OpenGL решает, какой фильтр использовать при доступе к текстуре в шейдере с текстурой (...)

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

2 ответа

Решение

Мое единственное предположение, это то, что он рассчитывает след пикселя

Да, это то, что он делает. Он будет аппроксимировать отпечаток пикселя в текстурном пространстве, вычисляя производные текстовых координат по отношению к пространству окна. x а также y направление, и оно будет аппроксимировать эти производные путем конечной разности в квадрате 2x2 пикселей, точно так dFdx а также dFdy Функции GLSL работают. В качестве размера будет использоваться более длинный из двух векторов частной производной, и на основании этого будет вычисляться значение уровня детализации.

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

Правильно, поэтому спецификация GLSL (версия 4.60) гласит следующее в начале раздела 8.9 Функции текстуры:

Функции поиска текстур доступны на всех этапах затенения. Однако автоматический уровень детализации рассчитывается только для фрагментных шейдеров. Другие шейдеры работают так, как если бы базовый уровень детализации был вычислен как ноль

Некоторые (т.е. большинство) функций доступа к текстуре GLSL говорят, что им требуются "неявные производные". Все такие функции работают только целиком:

  1. Во фрагменте шейдера.

  2. В рамках единого контроля потока ФС.

Если вы вызываете функцию доступа к текстуре, для которой требуются неявные производные в не фрагментном шейдере, то она будет доступна только с базового уровня mipmap. Однако, если вы находитесь в фрагментном шейдере, но вне единого потока управления, то все такие функции имеют неопределенное поведение.

Так что, если вы не в фрагментном шейдере, вы либо хотите получить доступ с базового уровня mipmap (в этом случае, MAG_FILTER применяется), или вы хотите использовать функции, которые явно предоставляют значения, используемые для интерполяции: Lod (где вы явно говорите, с каких уровней mipmap вы выбираете), Grad (где вы явно указываете производные, используемые для определения места расположения пикселя), или любой из texelFetch или же textureGather функции (которые вообще не выполняют интерполяцию).

Другие вопросы по тегам