Передача данных из C# в OpenTK FS - PullRequest
2 голосов
/ 09 июля 2020

Я кодирую игру в понг полностью во фрагментном шейдере OpenTK. C# выполняет всю работу, а затем передает информацию фрагментному шейдеру, чтобы он раскрашивал правильные пиксели. Проблема в том, что я не знаю, как передать информацию самому фрагментному шейдеру.

1 Ответ

0 голосов
/ 10 июля 2020

Да, есть:

  1. Единые переменные

    • Самый простой вариант, соответствует глобальной постоянной переменной для шейдера . Доступ должен быть самым быстрым, потому что они могут быть кэшированы в локальной памяти.
  2. Единообразные блоки

    • Группировка однородных переменные, поддерживаемые буфером. Может использоваться для хранения объектов среднего размера (~ КБ), например, матриц камер, настроек освещения, глобальных настроек. Преимущество состоит в том, что один буфер можно использовать для хранения значений для нескольких шейдеров. Их по-прежнему можно кэшировать в общей памяти.
  3. Блоки хранения буфера

    • Произвольные данные, поддерживаемые буфером, обычно неограничен по размеру. Самым большим преимуществом является то, что шейдеры могут писать в этот блок. Но запись немного сложнее из-за несогласованного доступа к памяти и, следовательно, необходимости в барьерах памяти и тому подобном. Медленнее всего для чтения.

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

...