c-在GLSL中将4uint8(字节)转换为float32



我有一个顶点缓冲区对象,其中包含模型的顶点数据。但是布局有点奇怪。顶点使用4 x uint_8作为位置,使用4 x int_8作为法线数据。纹理位置数据附加在末尾,4 x uint_8表示浮点值,我可以使用偏移值访问该值。使用8个字节会给我2个浮点值,我可以在vec2中使用这些值来获得纹理坐标。

布局基本上是[[4 x uint_8(顶点位置(]|[4 x int_8(vertex_normal(]|。。。(交替pos和norm(|[4x uint_8](浮点值的字节数据(]。

在我的命中着色器中,我将缓冲区作为int_8的数组读取,并且我能够毫无问题地读取顶点数据。然而,我似乎找不到用4个字节来表示浮点值的方法

我当然可以更改数据的结构,但我有依赖于这种结构的遗留代码,更改它会破坏程序的其余部分。我也可以创建一个新的顶点缓冲区,但由于我已经有了数据,并且可以毫无问题地读取它,这只会占用更多的空间,在我看来是多余的。

可能有一种方法可以在之前定义结构,以便缓冲区信息在着色器中具有正确的格式。我知道您可以为管道中的顶点输入设置格式,但由于这是光线跟踪管道,我可能无法使用此功能。但也许我错了。

所以最后一个问题是:是否可以在glsl着色器中从4个uint_8值中构造一个浮点值,或者我应该考虑更改顶点缓冲区?或者有没有其他方法可以定义数据?

我找到了一个适合我的解决方案。

基本上,我使用两个具有相同集合和绑定的布局,除了纹理和法线之外,缓冲区被读取为int8值的数组。第二个布局中的缓冲区被读取为vec2s的数组。由于缓冲区读取原始字节数据,因此可以正确地将其打包到vec2中。

例如字节数据

[31133,27,63,84224,75,63]

会给我一vec2的

(0.6075,0.7964(

这正是我想要的。

当然,这个解决方案并不完美,但就目前而言已经足够了。如果你知道任何更漂亮的解决方案,请随时分享!

最新更新