【发布时间】: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