SFML Shaders制服:通过我自己的课堂

问题描述 投票:0回答:1

我正在使用sfml在c ++上编写简单的raytracer来绘制输出图像。 CPU上的问题是速度,因此我决定使用着色器来加快所有速度]

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

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

问题是:我能以某种方式通过我自己的着色器制服班吗?

问题是,现在,我必须在每个像素的着色过程中加载Scene(类,表示对象的位置以及用于射线跟踪的对象,并且我认为它会严重降低一切。

shader sfml fragment-shader
1个回答
0
投票

您不应该使用setUniform而不是setParameter,因为后者已经过时。

尽管您无法使用SFML将自定义类直接传递给着色器,但是如果以特定方式组织/准备它,则可以一次传递所有内容。您可以传递一个浮点数数组,该数组应允许您一次性传递所有需要的信息。为此,您可以使用setUniformArray

您也有其他选择,但可能需要更多准备。如果您想传递的所有内容都是sf::Vector2f,则可以传递array of Glsl::Vec2s。对于sf::Vector3f,您可以传递array of Glsl::Vec3s

传递信息稍微复杂一点的另一种方法是使用sf::Texture。您可以使用准备好的像素,也可以使用sf::RenderTexture,绘制以更改其像素,然后使用该像素。这使您可以在纹理的颜色范围内对纹理像素中的信息进行编码。然后,将setUniform to send the entire texture用于着色器。

最后,您希望发送到着色器的所有信息很可能是由多个浮动对象组成的,因此您只需将浮动对象数组直接发送到着色器即可。

© www.soinside.com 2019 - 2024. All rights reserved.