Как получить тип sampler2D из объекта буфера хранилища шейдеров внутри шейдера?

Я пытаюсь получить переменную типа sampler2D в мои шейдеры без использования единой переменной.

Вместо этого я хочу передать его, используя объект буфера хранилища шейдеров (SSBO). Какой тип переменной должен быть объявлен в структуре для передачи? Как я могу затем привести этот тип к sampler2D в шейдерах?

1 ответ

Решение

Тебе этого не сделать, samplerЭто просто непрозрачные типы, а не реальные переменные, значение которых доступно в шейдере. Реализация OpenGL будет использовать значение, установленное для сэмплера через glUniform1i фактически настроить выборку текстуры для того, как это должно быть сделано на конкретном оборудовании - в некоторых реализациях изменение значения сэмплера фактически запускает перекомпиляцию или исправление кода шейдера.

В следствии, sampler типы могут быть объявлены только в унифицированном блоке по умолчанию шейдера GLSL, значения для сэмплеров не могут быть получены из SSBO, UBO, TBO или чего-либо еще, и вы не можете использовать sampler типы als l-значения в GLSL.

Единственный способ обойти эти ограничения - это бесконечные текстуры, которые позволяют делать именно то, что вы хотите. Но имейте в виду, что они не являются основной особенностью какой-либо версии OpenGL на сегодняшний день (GL 4.6 на момент написания), поэтому в настоящее время существуют только как расширения GL. Кроме того, поддержка HW и драйверов для этой функции далеко не универсальна на данный момент.

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