2 votes

SFML Shaders uniformes : passage de ma propre classe

Je code un simple raytracer en C++ en utilisant SFML pour dessiner des images de sortie. Le problème sur le processeur était la vitesse, donc j'ai décidé d'utiliser des shaders pour accélérer un peu tout

Je débute avec GLSL. Dans le tutoriel, il est écrit que vous pouvez passer certaines variables à votre shader en utilisant shader.setParameter("myvar", 5.f). Ensuite, il est indiqué que "les surcharges de setParameter prennent en charge tous les types fournis par SFML"

D'accord, je peux donc passer des float, vec2, vec3, vec4, etc.

La question est: puis-je passer ma propre classe dans les uniforms du shader?

Le problème est que pour le moment, je dois charger la classe Scene (qui représente les positions des objets et autres choses pour le traçage de rayons) dans chaque processus de shader de pixel, et je suppose que cela peut ralentir considérablement tout.

2voto

Hapaxia Points 56

Vous devriez utiliser setUniform à la place de setParameter car ce dernier a été désapprouvé.

Vous ne pouvez pas passer une classe personnalisée directement au shader avec SFML, mais vous pouvez tout passer en une fois si vous l'organisez/préparez de manière spécifique.
Vous pouvez passer un tableau de floats, ce qui devrait vous permettre de transmettre toutes les informations nécessaires en une seule fois. Pour cela, vous utiliseriez setUniformArray.

Vous avez d'autres options mais elles peuvent nécessiter plus de préparations.
Si tout ce que vous souhaitez transmettre sont des sf::Vector2fs, vous pouvez passer un tableau de Glsl::Vec2s.
Pour les sf::Vector3fs, vous pouvez passer un tableau de Glsl::Vec3s.

Une autre façon de transmettre des informations un peu plus compliquée est d'utiliser une sf::Texture. Vous pouvez utiliser une préparée ou utiliser une sf::RenderTexture, dessiner dessus pour changer ses pixels, puis l'utiliser. Cela vous permet d'encoder des informations dans les pixels de la texture avec ses couleurs. Vous utiliseriez ensuite setUniform pour envoyer la texture entière au shader.

En conclusion, il est probable que toutes les informations que vous souhaitez envoyer au shader sont composées de plusieurs floats, vous pouvez donc simplement envoyer un tableau de floats directement au shader.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X