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.