Link

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.


Anterior Próximo