Coordenadas de textura
Vamos renderizar um quadrado com uma textura aplicada em sua superfície. Para isso, modificamos o contêiner de vértices em Model
para representar uma imagem de um quadrado:
QVector<Vertex> vertices = {
{ {-0.5f, -0.5f}, {1.0f, 0.0f, 0.0f} },
{ { 0.5f, -0.5f}, {0.0f, 1.0f, 0.0f} },
{ { 0.5f, 0.5f}, {0.0f, 0.0f, 1.0f} },
{ { 0.5f, 0.5f}, {0.0f, 0.0f, 1.0f} },
{ {-0.5f, 0.5f}, {1.0f, 1.0f, 1.0f} },
{ {-0.5f, -0.5f}, {1.0f, 0.0f, 0.0f} }
};
Utilizamos seis vértices para representar um quadrado. Isso porque nosso quadrado é formado a partir de dois triângulos.
Antes que possamos realizar o mapeamento de texturas, precisamos definir as coordenadas de textura associadas a cada vértice da geometria. Essas coordenadas irão determinar como a imagem é realmente mapeada para a geometria. Para isso, alteramos a estrutura Vertex
para incluir um QVector2D
para coordenadas de textura:
struct Vertex {
QVector2D pos;
QVector3D color;
QVector2D texCoord;
static VkVertexInputBindingDescription getBindingDescription() {
VkVertexInputBindingDescription bindingDescription = {};
bindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
bindingDescription.stride = sizeof(Vertex);
bindingDescription.binding = 0;
return bindingDescription;
}
static std::array<VkVertexInputAttributeDescription, 3> getAttributeDescriptions() {
std::array<VkVertexInputAttributeDescription, 3> attributeDescriptions = {};
attributeDescriptions[0].binding = 0;
attributeDescriptions[0].location = 0;
attributeDescriptions[0].format = VK_FORMAT_R32G32_SFLOAT;
attributeDescriptions[0].offset = offsetof(Vertex, pos);
attributeDescriptions[1].binding = 0;
attributeDescriptions[1].location = 1;
attributeDescriptions[1].format =
VK_FORMAT_R32G32B32_SFLOAT;
attributeDescriptions[1].offset = offsetof(Vertex, color);
attributeDescriptions[2].binding = 0;
attributeDescriptions[2].location = 2;
attributeDescriptions[2].format = VK_FORMAT_R32G32_SFLOAT;
attributeDescriptions[2].offset =
offsetof(Vertex, texCoord);
return attributeDescriptions;
}
};
Certificamos-nos também de adicionar um VkVertexInputAttributeDescription
para que possamos usar coordenadas de textura de acesso como entrada no vertex shader. Isso é necessário para poder passá-las ao fragment shader para interpolação na superfície do quadrado.
Modificamos novamente o contêiner de vértices, agora para incluir em cada vértice uma coordenada de textura:
QVector<Vertex> vertices = {
{ {-0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f} },
{ { 0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f} },
{ { 0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}, {0.0f, 1.0f} },
{ { 0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}, {0.0f, 1.0f} },
{ {-0.5f, 0.5f}, {1.0f, 1.0f, 1.0f}, {1.0f, 1.0f} },
{ {-0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f} }
};
Simplesmente preencheremos o quadrado com a textura usando coordenadas de {0.0f, 0.0f}
no canto superior esquerdo para {1.0f, 1.0f}
no canto inferior direito.