Link

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);


Anterior Próximo