1

我把我的 HLSL 代码片段放在这里:https ://shader-playground.timjones.io/d9011ef7826a68ed93394792c2edb732

我使用 DXC 将 HLSL 编译为 SPIR-V,然后使用 SPIRV-Cross 获取 GLSL 代码。GLSL 常量缓冲区用 std140 标记,它包含 vec3 和 float。据我所知,这是行不通的。这里不应该使用 GL_EXT_scalar_block_layout 吗?常量块应该用标量而不是 std140 标记。我在这里遗漏了一些明显的东西吗?谢谢。

4

1 回答 1

0

对于任意输入缓冲区,没有与 DX 常量缓冲区布局完全等效的通用 OpenGL 内存布局。

DX 常量缓冲区将添加停止跨越 16 字节边界的单个变量所需的填充,但变量本身仅 4 字节对齐。

GLstd140统一缓冲区将始终vec3在 16 字节边界上对齐。这在 DX 中没有等价物。

GLstd430统一缓冲区(如果通过 支持GL_EXT_scalar_block_layout)将始终vec3在 16 字节边界上对齐。这在 DX 中没有等价物。

GLscalar统一缓冲区(如果通过 支持GL_EXT_scalar_block_layout)只会填充到组件元素大小,而不关心 16 字节边界。这在 DX 中没有等价物。

如果您开始使用结构和数组类型,事情会变得更加有趣......

TLDR,如果您想要在 DX 和 GL/GLES 和 Vulkan 之间可移植的固定二进制内存布局,您需要为常量缓冲区设计可移植内存布局。你不能乱扔任意布局并期望它能够工作。

于 2021-12-15T19:43:12.727 回答