Как сэмплер GLSL определяет минификацию и, следовательно, уровень mipmap текстуры? - PullRequest
7 голосов
/ 10 сентября 2011

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

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

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

Ответы [ 2 ]

8 голосов
/ 12 сентября 2011

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

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

2 голосов
/ 10 сентября 2011

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

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

...