Carregando uma imagem
Neste capítulo vamos renderizar um quadrado com uma textura aplicada em sua superfície. Mas antes de adicionarmos uma imagem a nossa geometria, temos que ter um arquivo contendo a imagem em si. Para isso, criamos um novo diretório chamado textures ao lado do diretório shaders para armazenar nossa imagem de textura. Vamos carregar uma imagem chamada texture.png desse diretório. A imagem escolhida para este exemplo está disponível em https://en.wikipedia.org/wiki/Lenna, mas qualquer outra imagem também vai funcionar.
Por enquanto iremos adicionar essa imagem aos recursos do Qt. Para isso, clicamos com o botão direito no aquivo resources.qrc no Qt Creator, depois, clicamos em Add Existing Files… e selecionamos o arquivo texture.png.
Em seguida, criamos uma nova função chamada addTextureImage onde carregaremos uma imagem e a enviaremos para um objeto VkImage. Essa função recebe como parâmetro um objeto do tipo QString contendo um caminho para o arquivo de imagem:
public:
...
void addTextureImage(QString texturePath);
...
void Renderer::addTextureImage(QString texturePath) {
}
Inicialmente, iremos chamar essa função com o caminho para nossa imagem de teste no final de initObject:
void Renderer::initObject() {
QSharedPointer<Model> model =
QSharedPointer<Model>::create(Model());
m_object = new Object3D(model);
createObjectVertexBuffer();
addTextureImage(":/textures/texture.png");
}
Para carregar a imagem em nosso programa iremos utilizar a classe QImage do Qt. Essa classe suporta os formatos de arquivo de imagem mais comuns, como BMP, GIF, JPEG e PNG. Carregar uma imagem com QImage é muito simples, basta chamar o construtor de QImage com o caminho para a imagem escolhida:
void Renderer::addTextureImage(QString texturePath) {
QImage image(texturePath);
if (image.isNull()) {
qFatal("Failed to load texture image!");
}
image = image.convertToFormat(QImage::Format_RGBA8888);
VkDeviceSize imageSize = image.sizeInBytes();
}
Depois de carregarmos a imagem nesse objeto, convertemos seu formato para o formato desejado utilizando a função convertToFormat. Neste caso o formato desejado é Format_RGBA8888. Por fim, obtemos o tamanho em bytes da imagem através da função sizeInBytes, pois precisaremos dessa informação em breve.