Униформа SFML Shaders: прохождение моего собственного класса - PullRequest
0 голосов
/ 09 мая 2020

Я кодирую простой трассировщик лучей на C ++, используя sfml для рисования выходных изображений. Проблема с процессором заключалась в скорости, поэтому я решил использовать шейдеры, чтобы немного ускорить все.

Я новичок в GLSL. В учебнике написано, что вы можете передать некоторые переменные своему шейдеру, используя shader.setParameter("myvar", 5.f). Затем написано, что « перегрузки setParameter поддерживают все типы, предоставляемые SFML »

Хорошо, поэтому я могу передать float, vec2, vec3, vec4, et c.

Вопрос: могу ли я каким-то образом передать свой собственный класс в форме шейдера?

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

1 Ответ

1 голос
/ 10 мая 2020

Вы должны использовать setUniform вместо setParameter, поскольку последний устарел.

Хотя вы не можете передать настраиваемый класс напрямую в шейдер с помощью SFML, вы можете передать все сразу, если вы организуете / подготовите его определенным c способом.
Вы можете передать массив чисел с плавающей запятой, что должно позволить вам передать всю необходимую информацию в одном go. Для этого вы должны использовать setUniformArray .

У вас есть и другие варианты, но они могут потребовать дополнительных приготовлений.
Если все, что вы хотите передать, это sf :: Vector2f s, вы можете передать массив Glsl :: Vec2s .
Для sf :: Vector3f s вы можете передать массив Glsl :: Vec3s .

Другой способ передачи информации, который немного сложнее, - использовать sf :: Texture . Вы можете использовать подготовленный или использовать sf :: RenderTexture , рисовать, чтобы изменить его пиксели, а затем использовать его. Это позволяет кодировать информацию в пикселях текстуры в ее цветах. Затем вы должны использовать setUniform для отправки всей текстуры в шейдер.

В заключение, вполне вероятно, что вся информация, которую вы sh отправляете в шейдер, состоит из нескольких чисел с плавающей запятой. так что вы можете просто отправить массив чисел с плавающей запятой прямо в шейдер.

...