Descrições de atributos
Agora, vamos adicionar outra função auxiliar à Vertex
para preencher a estrutura VkVertexInputAttributeDescription
.
#include <array>
...
static std::array<VkVertexInputAttributeDescription, 2> getAttributeDescriptions() {
std::array<VkVertexInputAttributeDescription, 2> attributeDescriptions = {};
return attributeDescriptions;
}
Como o protótipo da função indica, haverá duas dessas estruturas. Uma estrutura de descrição de atributo descreve como extrair um atributo de vértice de um fragmento de dados de vértices originados de uma descrição de ligação. Nós temos dois atributos, posição e cor, então precisamos de duas estruturas de descrição de atributo.
attributeDescriptions[0].binding = 0;
attributeDescriptions[0].location = 0;
attributeDescriptions[0].format = VK_FORMAT_R32G32_SFLOAT;
attributeDescriptions[0].offset = offsetof(Vertex, pos);
O parâmetro binding
informa ao Vulkan de onde vem a ligação dos dados por vértice. O parâmetro location
faz referência à diretiva location
da entrada no vertex shader. A entrada no vertex shader com localização 0 é a posição, que possui dois componentes do tipo float
de 32 bits
.
O parâmetro format
descreve o tipo de dados para o atributo e define implicitamente o tamanho em byte dos dados do atributo. Como podemos notar, os formatos são especificados usando a mesma enumeração que os formatos de cores. Por isso, devemos usar o formato em que a quantidade de canais de cores corresponde ao número de componentes no tipo de dados do shader. O parâmetro offset
especifica o número de bytes desde o início dos dados por vértice para serem lidos. A ligação está carregando um Vertex
por vez e o atributo de posição (pos
) está em um deslocamento de 0 bytes
desde o início dessa estrutura. Isso é calculado automaticamente usando a macro offsetof
.
O atributo de cor é descrito de maneira semelhante:
attributeDescriptions[1].binding = 0;
attributeDescriptions[1].location = 1;
attributeDescriptions[1].format = VK_FORMAT_R32G32B32_SFLOAT;
attributeDescriptions[1].offset = offsetof(Vertex, color);