Descrições de ligações
Depois que os dados de vértice forem carregados na memória do dispositivo, o pipeline deve ser informado com a especificação desses dados. Isso será útil para recuperar e interpretar os dados. Por exemplo, os dados de vértice de geometria precedentes compreendem informações de posição e cor, armazenadas de maneira intercalada. Esta informação precisa ser comunicada ao pipeline subjacente com a ajuda da ligação de entrada de vértice (VkVertexInputBindingDescription
) e do descritor de atributo de entrada de vértice (VkVertexInputAttributeDescription
).
Primeiro, adicionaremos uma função membro à estrutura Vertex
para preencher a estrutura VkVertexInputBindingDescription
com os dados corretos.
#include <QVulkanFunctions>
...
struct Vertex {
QVector2D pos;
QVector3D color;
static VkVertexInputBindingDescription getBindingDescription() {
VkVertexInputBindingDescription bindingDescription = {};
return bindingDescription;
}
};
Essa estrutura descreve em qual taxa carregar dados da memória em todos os vértices. Ela especifica o número de bytes entre as entradas de dados e se deve mover para a próxima entrada de dados após cada vértice ou após cada instância.
VkVertexInputBindingDescription bindingDescription = {};
bindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
bindingDescription.stride = sizeof(Vertex);
bindingDescription.binding = 0;
Todos os nossos dados por vértice são reunidos em um array, então teremos apenas uma ligação. O parâmetro binding é um índice no array pBuffers
ligado por vkCmdBindVertexBuffers
que usaremos mais adiante7. O parâmetro stride
especifica o número de bytes de uma entrada para a próxima e o parâmetro inputRate
pode ter um dos seguintes valores:
VK_VERTEX_INPUT_RATE_VERTEX
especifica que o endereçamento de atributos de vértices é uma função do índice de vértices.VK_VERTEX_INPUT_RATE_INSTANCE
especifica que o endereçamento de atributos de vértices é uma função do índice da instância.
Como não vamos usar renderização instanciada, vamos nos ater aos dados por vértices.
7 Cada atributo de vértice tem uma ligação que indica de qual índice de ligação do buffer o atributo obtém seus dados. Mas o buffer em si não é especificado no momento da criação. Definimos dinamicamente com
vkCmdBindVertexBuffers
. Portanto, o valor de ligação de um atributo é equivalente ao valor de ligação fornecido aglVertexAttribBinding
no OpenGL.