Как сэмплер GLSL определяет минификацию и, следовательно, уровень mipmap текстуры?

Я работаю с OpenGL ES (через WebGL), но я думаю, что этот вопрос применим и к полному профилю OpenGL.

Предположим, я создал текстуру OpenGL с полными уровнями mipmap и установил для TEXTURE_MIN_FILTER значение NEAREST_MIPMAP_NEAREST. Также предположим, что у меня есть фрагментный шейдер, который пробует эту текстуру. Уровень mipmap выбирается в зависимости от степени минимизации текстуры, но как выбирается степень минимизации?

В моем случае я синтезирую (внутри шейдера) координаты текстуры, которые я использую для выборки моей текстуры. Фактически, мои координаты текстуры не основаны на каких-либо входящих изменениях. Несмотря на то, что я включил mipmapping для этой текстуры, похоже, это не имеет никакого эффекта. Это ожидается? Нужно ли самому вычислять LOD и использовать параметр смещения для texture2D? (нету texture2DLOD, так как я использую ES)

2 ответа

Решение

Блоки соседних пикселей вычисляются параллельно. (IIRC микросхемы PowerVR, например, выполняют блок 4x4 за раз.) Когда вы вызываете texture2D в своем фрагментном шейдере, сэмплер извлекает все 16 выборок для всех 16 пикселей одновременно, и поэтому имеет информацию о смежности, необходимую для вычисления минификации. уровень. Это одна из причин, почему для соседних пикселей так важно производить выборку из близлежащих областей текстуры.

Обратите внимание, что это относится только к фрагментным шейдерам. В вершинных шейдерах всегда используется первый уровень mipmap (если не используется Lod-версия texture2D.)

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

И поскольку вы находитесь на земле OpenGL ES, у вас нет действительно инструментов, чтобы избавиться от этой проблемы. Desktop GL 3.0 дает вам textureGrad набор функций, который позволяет вычислять градиенты до достижения условной логики. Но без этого вы ничего не сможете сделать.

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