SFML 着色器制服:传递我自己的 class

SFML Shaders uniforms: passing my own class

我正在使用 sfml 在 C++ 上编写简单的光线追踪器来绘制输出图像。 CPU 上的问题是速度,所以我决定使用着色器稍微加快一切速度

我是 GLSL 的新手。在教程中,它写道,您可以使用 shader.setParameter("myvar", 5.f) 将一些变量传递给着色器。然后写着“setParameter的重载支持SFML提供的所有类型”

好的,所以我可以传递 float、vec2、vec3、vec4 等

问题是:我可以用着色器的制服传递我自己的class吗?

问题是现在,我必须在每个像素的着色过程中加载 Scene(class,表示对象的位置和用于光线追踪的事物),我想它可以严重减慢一切。

您应该使用 setUniform 而不是 setParameter,因为后者已被弃用。

虽然您不能通过 SFML 将自定义 class 直接传递给着色器,但如果您以特定方式 organise/prepare 可以一次传递所有内容。
您可以传递一组浮点数,这应该允许您一次性传递所有需要的信息。为此,您将使用 setUniformArray.

您还有其他选择,但它们可能需要更多准备工作。
如果你想传的都是sf::Vector2fs, you can pass an array of Glsl::Vec2s.
对于 sf::Vector3fs, you can pass an array of Glsl::Vec3s.

另一种传递稍微复杂一点的信息的方法是使用 sf::Texture. You can use a prepared one or use a sf::RenderTexture, draw onto to change its pixels and then use that. This allows you to encode information in the texture's pixels within its colours. You would then use setUniform to send the entire texture 到着色器。

总而言之,您希望发送到着色器的所有信息很可能都是由多个浮点数组成的,因此您可以直接将一个浮点数数组发送到着色器。