2017-06-19 78 views
0

shader代码:如何将统一缓冲区对象的数组加载到着色器中?

// UBO for MVP matrices 
layout (binding = 0) uniform UniformBufferObject { 
     mat4 model; 
     mat4 view; 
     mat4 proj; 
} ubo; 

这工作得很好,因为它只是一个结构,我可以设置VkWriteDescriptorSet.descriptorCount为1。但我怎么能创造这些结构的数组?

// Want to do something like this 
// for lighting calculations 
layout (binding = 2) uniform Light { 
    vec3 position; 
    vec3 color; 
} lights[4]; 

我有存储在一个缓冲区中的所有四个灯的数据。当我将VkWriteDescriptorSet.descriptorCount设置为4时, 我是否必须创建四个VkDescriptorBufferInfo?如果是这样,我不知道应该把什么投入抵消和范围。

回答

2

统一缓冲区阵列中的所有块都存在相同的描述符中。但是,它们仍然是不同的块;他们得到一个不同的VkDescriptorBufferInfo信息对象。所以这些块不一定来自连续的存储区域。

注意:KHR_vulkan_glsl扩展名为gets this wrong,如果你看的话密切关注。它指出不透明类型的数组应该进入单个描述符,但接口块数组不能。正如我所描述的那样,实际的glslangValidator编译器(以及SPIR-V和Vulkan)可以处理它。

但是,您不能使用动态统一表达式以外的任何其他方式访问接口块数组的元素。即使要求有一定的可用功能;没有该功能,只能使用常量表达式访问数组。

你可能想要的是内阵列块,不是数组块:

struct Light 
{ 
    vec4 position; //(NEVER use `vec3` in blocks) 
    vec4 color; 
}; 

layout (set = 0, binding = 2, std140) uniform Lights { 
    Light lights[4]; 
}; 

这意味着你有结合槽2的单个描述符(descriptorCount为1)。缓冲区的数据应该是4个顺序结构。

相关问题