2015-12-12 1 views
1

Я read, чтоОбъявление одну глобальную переменную в качестве SSBO в геометрии шейдеров приводит к ошибке компиляции

одна глобальная переменная может быть объявлена ​​как SSBO

и я попытался объявить buffer vec2 name[]; в геометрическом шейдере (#version 440). Компиляция завершается с ошибкой, заявив следующее:

OpenGL не позволяет объявлять переменную буфера 'name' в глобальной области видимости. Вместо этого используйте буферные блоки.

Итак, что мне не хватает?

ответ

2

Это похоже на ошибку в Wiki из-за изменения спецификации в обновлении до GLSL 4.40. То есть, оригинальная версия GLSL 4,40 сказал:

Буфер классификатор может быть использован с любым из основных типов данных, или при объявлении переменной, тип которого представляет собой структуру, или массив любого из них.

Буферные переменные могут быть объявлены только внутри интерфейсных блоков (раздел 4.3.9 «Интерфейсные блоки»), которые затем называются блоками хранения шейдеров. Ошибка компиляции для объявления переменных буфера в глобальной области (вне блока). Переменные буфера не могут иметь инициализаторы.

Очевидно, что это противоречиво. В первом абзаце говорится, что объявление голых переменных буфера в порядке. Во втором абзаце говорится, что буферные переменные могут быть только частью buffer -qualified блоков интерфейса.

Одно из изменений к 4.40 изменили его на:

Буфер классификатор может быть использован для объявления интерфейсных блоков (раздел 4.3.9 «Интерфейс блоки»), которые затем, упомянутые в качестве хранилища шейдера блоки. Ошибка компиляции в объявлении переменных в глобальной области (вне блока).

Так ясно, когда-то это было правдой. Спецификация ARB_shader_storage_buffer_object по-прежнему имеет старую формулировку. Вики просто необходимо обновить с текущим поведением.

0

Согласно GLSL 4.5 Specification (Section 4.3.7 Buffer Variables):

Буфер классификатор может быть использован для объявления интерфейсных блоков (раздел 4.3.9 «блоки интерфейса»), которые затем , упомянутые в виде блоков хранения шейдер. Ошибка компиляции для объявления переменных буфера при глобальной области (вне блока).

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