SPIR-V 允许非常冗长的数据格式。
GLSL 只有基本数据类型(第 4 章),没有指定位长。
据我所知,为 Vulkan 编写着色器最方便的方法是在 GLSL 中对其进行编程,然后使用 Vulkan SDK 提供的编译器 (glslc.exe) 将文件转换为 SPIR-V 二进制文件。
VK_FORMAT_R4G4_UNORM_PACK8
我的问题是如何在使用 glslc.exe 编译我们的着色器代码时在 GLSL 中使用这些详细的数据格式,例如(在上面的 SPIR-V 链接中找到)。有编译器允许的特殊数据类型吗?如果没有,是否可以使用另一种更高级别的语言,然后编译成二进制文件?
例如,如果这是图形管道中使用的属性描述:
struct Attributes {
vec2 pos;
char flags;
};
static inline std::array<VkVertexInputAttributeDescription, 3> getAttributeDescriptions() {
std::array<VkVertexInputAttributeDescription, 3> attributeDescriptions{};
attributeDescriptions[0].binding = 0;
attributeDescriptions[0].location = 0;
attributeDescriptions[0].format = VK_FORMAT_R32G32_SFLOAT;
attributeDescriptions[0].offset = offsetof(Attributes, pos);
attributeDescriptions[1].binding = 0;
attributeDescriptions[1].location = 1;
attributeDescriptions[1].format = VK_FORMAT_R4G4_UNORM_PACK8;
attributeDescriptions[1].offset = offsetof(Attributes, flags);
return attributeDescriptions;
正在进行的 GLSL 着色器代码如下所示:
#version 450
#extension GL_ARB_separate_shader_objects : enable
//Instance Attributes
layout(location = 0) in vec2 pos;
layout(location = 1) in 4BitVec2DataType flags;
//4BitVec2DataType is a placeholder for whatever GLSL's equivalent of SPIR-V's VK_FORMAT_R4G4_UNORM_PACK8 would be
void main() {
...
}