2017-06-19 2 views
0

Shader-Code:Wie kann ich ein Array von einheitlichen Pufferobjekte in den Shader laden?

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

das funktioniert gut, weil seine nur eine Struktur und ich die VkWriteDescriptorSet.descriptorCount auf 1 gesetzt, aber wie kann ich ein Array dieser Strukturen schaffen?

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

Ich habe die Daten für alle vier Lichter in einem Puffer gespeichert. Wenn ich die VkWriteDescriptorSet.descriptorCount auf vier, setze Muss ich vier VkDescriptorBufferInfo erstellen? Wenn ja, weiß ich nicht, was ich in Offset und Reichweite setzen soll.

Antwort

2

Alle Blöcke in einem einheitlichen Pufferarray leben im selben Deskriptor. Sie sind jedoch immer noch unterschiedliche Blöcke; Sie erhalten ein anderes VkDescriptorBufferInfo Info-Objekt. Diese Blöcke müssen also nicht aus sequentiellen Speicherbereichen kommen.

Hinweis: Die KHR_vulkan_glsl Erweiterung gets this wrong, wenn Sie genau darauf achten. Es merkt an, dass Arrays von undurchsichtigen Typen in einen einzelnen Deskriptor gehen sollten, Arrays von Schnittstellenblöcken jedoch nicht. Der eigentliche glslangValidator-Compiler (und SPIR-V und Vulkan) handhaben es wie ich beschrieben habe.

Sie können jedoch nicht auf die Elemente eines Schnittstellenblockarrays mit anderen als dynamisch einheitlichen Ausdrücken zugreifen. Und selbst , dass erfordert eine bestimmte Funktion verfügbar; Ohne diese Funktion können Sie nur mit Konstanten Ausdrücke auf das Array zugreifen.

Was möchten Sie wahrscheinlich ein Array innerhalb der Block, kein Array von Blöcke:

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

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

Dies bedeutet, dass Sie einen einzigen Deskriptor haben in Bindungs ​​Steckplatz 2 (descriptorCount ist 1). Und die Daten des Puffers sollten 4 sequentielle Strukturen sein.

Verwandte Themen