Каждый созданный объект текстуры 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).
Благодарим вас за подробный ответ. Вы случайно не знаете, является ли равномерное ветвление в шейдере фрагмента столь же эффективным, как компиляция двух разных шейдеров? (учитывая, что во время выполнения программы будет использоваться только одна версия, поэтому никакая дополнительная программа не связывается) – user1282931