2015-06-08 3 views
3

У меня есть два 2D-текстуры. Первая, текстура MSAA, использует цель GL_TEXTURE_2D_MULTISAMPLE. Вторая текстура без MSAA использует цель GL_TEXTURE_2D.Может ли линейная фильтрация использоваться для размножения FBO текстуры MSAA для текстуры без MSAA?

В соответствии с OpenGL spec on ARB_texture_multisample только GL_NEAREST является допустимым параметром фильтрации при наложении текстуры MSAA.

В этом случае обе эти текстуры прикреплены к GL_COLOR_ATTACHMENT0 через их отдельные объекты Framebuffer. Их разрешения также имеют тот же размер (насколько мне известно, это необходимо, когда blitting MSAA для не-MSAA).

Таким образом, учитывая существующие ограничения, если я блитирование MSAA проведения FBO с невыполнением MSAA проведения FBO, мне все еще нужно использовать GL_NEAREST в качестве опции фильтрации, или GL_LINEAR действует, так как текстуры уже оказаны к?

ответ

5

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

При выборке из многопроцессорных текстур GL_NEAREST действительно является единственным поддерживаемым фильтром. Вам также необходимо использовать специальный тип сэмплера (sampler2DMS) в коде GLSL с соответствующими инструкциями по выборке.

На самом деле я не могу найти что-либо в спецификации, заявив, что установка фильтра на 0xдля мультисэмплов-текстур является ошибкой. Но фильтр вообще не используется. Из OpenGL 4.5 спецификации (курсив):

Когда Мультисэмпли текстуры доступны в шейдер, доступ принимает один вектор целых чисел, описывающих, которые тексель для извлечения и целое число, соответствующие номера образцов, описанных в разделе 14.3 .1 определение того, какой образец в теккселе нужно извлечь. Стандартных инструкций по выборке не разрешено на объектах с мультисэмплой текстуры, а не выполняется фильтрация с помощью выборки.

Для блиттинг между мультисэмплем и не-Multisample текстурами с glBlitFramebuffer(), то фильтра аргумент может быть либо GL_LINEAR или GL_NEAREST, но оно игнорируется в этом случае. Из 4.5 спецификации:

Если чтение фреймбуфера является мультитекстурированного (его эффективное значение SAMPLE_BUFFERS один) и дро фреймбуфера не является (его значение SAMPLE_BUFFERS равно нулю), образцы, соответствующие каждой точке пикселя в источник преобразуется в один образец перед записью в пункт назначения. фильтр игнорируется.

Это имеет смысл, потому что есть ограничение в этом случае нужно иметь тот же размер источника и прямоугольник назначения:

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

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

+0

Я думаю, так как единственный способ, которым вы можете попробовать мультисэмплированную текстуру, - использовать «texelFetch (...)», более или менее подразумевается, что большинство состояний сэмплера бессмысленны (например, режим обертывания, фильтр, смещение LOD). Как вы сказали, это не ошибка по спецификации. чтобы установить эти состояния, но если вам нужно было описать поведение с помощью фильтра, то единственным или единственным кандидатом будет точка/ближайший. –

+1

@ AndonM.Coleman Да, я думаю, это именно то, что описывает первая спецификация цитаты, где я выделил «никакой фильтрации не выполняется». –

+0

Да, я просто хотел указать, что вы можете установить эти состояния сэмплера, они просто ничего не делают: объекты pplpler отделяют эти состояния от состояния объекта текстуры и, вероятно, сделали бы этот вопрос не относящимся к проблеме. Но из-за устаревшего дизайна GL многослойные объекты текстуры имеют связанные с ними состояния сэмплеров, которые ничего не делают (поскольку они не отбираются). –

Смежные вопросы