Да, есть:
Единые переменные
- Самый простой вариант, соответствует глобальной постоянной переменной для шейдера . Доступ должен быть самым быстрым, потому что они могут быть кэшированы в локальной памяти.
Единообразные блоки
- Группировка однородных переменные, поддерживаемые буфером. Может использоваться для хранения объектов среднего размера (~ КБ), например, матриц камер, настроек освещения, глобальных настроек. Преимущество состоит в том, что один буфер можно использовать для хранения значений для нескольких шейдеров. Их по-прежнему можно кэшировать в общей памяти.
Блоки хранения буфера
- Произвольные данные, поддерживаемые буфером, обычно неограничен по размеру. Самым большим преимуществом является то, что шейдеры могут писать в этот блок. Но запись немного сложнее из-за несогласованного доступа к памяти и, следовательно, необходимости в барьерах памяти и тому подобном. Медленнее всего для чтения.
Тем не менее, вы, похоже, неправильно используете фрагментные шейдеры. Их основное использование - обработка фрагментов, созданных растеризацией примитивов OpenGL. Поэтому их входные данные должны поступать, например, из вершинного шейдера. Метод OpenGL для рисования понга заключается в создании буферов, содержащих ракетки и мяч, их положения могут быть сохранены в унифицированных переменных. Затем вершинный шейдер преобразует вершины ракеток, мяч в соответствии с их местоположением, хранящимся в униформе. Затем фрагментный шейдер просто раскрашивает их соответствующим образом.