,7. Установка uniform-переменных

Как сказано в предыдущем разделе, attribute-переменные используются для передачи данных, изменяющихся для каждой вершины, в вершинный шейдер. Другие данные, изменяющиеся не так часто, можно задавать через uniform-переменные,

API языка тендеров OpenGL

которые объявлены внутри шейдера и могут устанавливаться непосредственно приложением. Это дает приложению возможность передавать в шейдер данные любых типов. Приложения могут устанавливать эти переменные в разные значения для каждого примитива, чтобы влиять на работу шейдера (хотя при этом может немного пострадать производительность). Обычно uniform-переменные используют для хранения состояния, общего для нескольких или даже многих примитивов.

Язык шейдеров OpenGL также определяет несколько встроенных переменных состояния OpenGL. Приложения могут продолжать управлять состоянием OpenGL с помощью обычных функций, но могут использовать и встроенные uniform-переменные в шейдерах. Если нужно выполнить операцию, не предусмотренную OpenGL, определить собственную uniform-переменную и передать ее значение в шейдер очень просто.

Когда программный объект становится текущим, встроенные uniform-переменные инициализируются. Последующие изменения состояния OpenGL могут влиять на эти переменные и изменять их значения.

Основная схема работы с uniform-переменными отличается от схемы работы с attribute-переменными. Как сказано в предыдущем разделе, приложение может указывать расположение attribute-переменных перед компоновкой. Расположение же uniform-переменных определяется OpenGL во время компоновки, так что приложение вынуждено после компоновки запрашивать их расположение.

Чтобы установить значение определенной разработчиком uniform-переменной, приложение должно определить ее расположение и затем присвоить значение. Расположение uniform-переменных определяется на этапе компоновки и не изменяется до следующей компоновки. С каждой компоновкой расположение uni-form-переменных может меняться, так что приложение должно опять запрашивать эти данные. Запрос можно делать функцией


⇐ Предыдущая| |Следующая ⇒