2016-06-04 6 views
0

У меня есть приложение, которое может работать как с мультисэмплингом, так и без него. Я извлекаю образцы из ранее обработанных мультисэмплов в шейдере. Нужно ли компилировать разные версии шейдера либо с помощью sampler2D, либо с помощью sampler2DMS для доступа к текстуре, в зависимости от того, является ли это многопроцессорной текстурой или нет?GLSL: это ошибка использования не мультисэмплированной текстуры с sampler2DMS

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

Кто-нибудь знает, является ли это предсказуемым поведением?

ответ

0

Каждый созданный объект текстуры has target associated with it. Когда вы впервые привязали этот объект к контексту, вы передали конкретное целевое перечисление glBindTexture. GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP и т. Д. Цель, которую вы используете в первом вызове вызова, неразрывно связана с объектом текстуры; если вы попытаетесь связать его с другой целью, glBindTexture будет сбой.

GL_TEXTURE_2D и GL_TEXTURE_2D_MULTISAMPLEразличные целей. Если вы связываете только что созданный объект текстуры с glBindTexture(GL_TEXTURE_2D, obj), вы можете не позднее связывать его с GL_TEXTURE_2D_MULTISAMPLE. И наоборот.

GLSL samplers types, как вы, возможно, заметили, имеют суффиксы на них. Ну, эти суффиксы обозначают тип текстуры, с которой работает конкретный тип сэмплера. sampler2D - это сэмплер с плавающей точкой, который работает с текстурами GL_TEXTURE_2D. Поэтому он найдет только текстуру с соответствующей мишенью.

Если вы установили sampler2D форму, чтобы использовать блок текстуры 0, и связать somethign с GL_TEXTURE_2D_MULTISAMPLE, что пробник не увидит. Он будет искать только GL_TEXTURE_2D, привязанный к этому пробоотборнику.

Возможно, вы слышали о view textures. Это текстуры, которые совместно хранят другие текстуры. Но представление может иметь разные размеры и даже объекты текстуры. Вы можете просмотреть один слой из текстуры 2D-массива в виде 2D-текстуры. И так далее.

Среди преобразований, которые вы не может do, представляет собой мультисэмпл-текстуру как текстуру без мультисэмпла. Или наоборот.

Итак, если вы описали работу, это было неопределенное поведение. И вы не можете полагаться на это.

Это, как говорится:

Нужно собрать различные версии шейдера

Нет; вы просто не можете использовать одну переменную. Совершенно верно иметь две переменные выборщика разных типов и условно решать выборку один против другого. Если условие динамически равномерная (для GL 4.x), вы won't even lose your implicit derivatives

Единственное, что вам нужно сделать, это заставить их использовать различные текстурных блоков.Не пытайтесь играть в игры, где вы назначаете им одну и ту же единицу текстуры, и решаете, какой из них использовать на основе того, что вы связали. Он не работает (или если это так, это UB).

+0

Благодарим вас за подробный ответ. Вы случайно не знаете, является ли равномерное ветвление в шейдере фрагмента столь же эффективным, как компиляция двух разных шейдеров? (учитывая, что во время выполнения программы будет использоваться только одна версия, поэтому никакая дополнительная программа не связывается) – user1282931

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

  • Нет связанных вопросов^_^