【问题标题】:Convert 4 uint8 (byte) to float32 in GLSL在 GLSL 中将 4 uint8(字节)转换为 float32
【发布时间】:2022-01-15 08:07:10
【问题描述】:

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

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

在我的命中着色器中,我将缓冲区读取为 int_8 数组,并且我能够毫无问题地读取顶点数据。但是我似乎无法找到一种方法来从用于表示它的 4 个字节中构造一个浮点值。

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

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

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

【问题讨论】:

  • 如果字节的位是变相的浮点表示,是的,你可以。为了使其符合标准,您应该使用联合来进行类型双关。
  • "用 4 x uint_8 表示一个浮点值,我可以使用偏移值访问它。" 你是什么意思?它是浮点数还是要转换为浮点数的 4 个字节?这个“偏移量”是什么意思?
  • @NicolBolas 我有 4 个字节要转换为浮点数。偏移量是我必须“跳过”以获取表示坐标的值的字节大小。之前的数据是针对位置和法线的,通常我希望坐标数据的布局方式相同,但无论出于何种原因,坐标基本上都是“拍在上面”。
  • @Ruslan:你有“我想转换成浮点数的 4 个字节”,还是有“一个占用 4 个字节的浮点数”?有区别,因为“转换”的过程取决于您将浮点数转换为 4 个字节的操作。另外,您如何尝试访问此内存?您是作为 SSBO 还是其他方式访问它?
  • @NicolBolas 是的,我以 ssbos 的身份访问它们。将缓冲区数据读取为纯字节允许我检索位置和法线的正确值,但这给我留下了 st 坐标的纯字节,必须以某种方式将其读取为浮点值。

标签: c glsl shader vulkan raytracing


【解决方案1】:

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

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

比如字节数据

[31、133、27、63、84、224、75、63]

会给我一个 vec2 的

(0.6075, 0.7964)

这正是我想要的。

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

【讨论】:

    猜你喜欢
    • 2020-05-16
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 2022-01-11
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    相关资源
    最近更新 更多