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

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

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


person dagute    schedule 21.01.2018    source источник
comment
Вы уже просмотрели эту страницу?: khronos.org/opengl/wiki/Shader_Storage_Buffer_Object Кажется, есть хороший материал о том, как использовать SSBO.   -  person Nicholas Miller    schedule 22.01.2018


Ответы (1)


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

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

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

person derhass    schedule 21.01.2018
comment
Спасибо за объяснение. ничего не нашел по этому поводу - person dagute; 22.01.2018