2017-06-19 53 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個順序結構。

相關問題