载入图像

包含图像库头文件:

#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>

默认情况下stb_image.h文件只定义了函数原型,我们需要在包含stb_image.h文件前定义STB_IMAGE_IMPLEMENTATION宏,来让它将函数实现包含进来。

void initVulkan() {
        ...
    createCommandPool();
    createTextureImage();
    createVertexBuffer();
        ...
}

        ...

void createTextureImage() {

}

添加一个叫做createTextureImage的函数用于加载图像数据到一个Vulkan图像对象。我们需要使用指令缓冲来完成加载,所以createTextureImage函数会在createCommandPool函数调用之后被调用。

创建一个叫做textures的和shaders目录同级的目录用于存放图像文件。我们会从textures目录载入一个叫做texture.jpg的图像文件。我们使用的图像大小为512x512像素。这里使用的图像库可以载入常见格式的图像文件,比如JPEG,PNG,BMP和GIF图像文件。

image

使用图像库载入文件非常简单:

void createTextureImage() {
    int texWidth, texHeight, texChannels;
    stbi_uc* pixels = stbi_load("textures/texture.jpg", &texWidth, &texHeight, &texChannels, STBI_rgb_alpha);
    VkDeviceSize imageSize = texWidth * texHeight * 4;

    if (!pixels) {
        throw std::runtime_error("failed to load texture image!");
    }
}

上面代码中的stbi_load函数以图像文件路径和需要加载的颜色通道作为参数来加载图像文件。使用STBI_rgb_alpha通道参数可以强制载入alpha通道,即使图像数据不包含这一通道,也会被添加上一个默认的alpha值作为alpha通道的图像数据,这为我们的处理带来了方便。stbi_load函数还可以返回图像的宽度,高度和图像数据实际存在的颜色通道。stbi_load函数的返回值是一个指向解析后的图像像素数据的指针。使用STBI_rgba_alpha作为通道参数,每个像素需要4个字节存储,所有像素按照行的方式依次存储,总共整个图像需要texWidth * texHeight * 4字节来存储。