【Vulkan学习记录-基础篇-3】纹理和模型导入、生成Mipmap

前两篇的代码是在太过于冗杂,于是我做了一下简单的封装,现在的代码结构为:
在这里插入图片描述
VKApp 负责初始化窗口以及VkInstance、VkDevice
VKResourceCreator 负责创建各种资源(Image、ImageView、Buffer等)
VKScene 负责初始化Pipeline RenderPass等,在每一帧中执行渲染
VKCommand 负责创建所有可复用的命令(CopyBuffer等)

源码已经传到git上了:proj

导入纹理和模型会涉及到纹理图片的加载以及模型文件的加载,这两个都使用第三方库来完成,
stb:纹理加载库stb
tinyobjloader:模型加载库tinyobjloader
这两个库都非常地轻量,只需要把它们的头文件添加到工程中就可以了。

部署源码时请手动添加Vulkan、GLFW的头文件和静态链接库,GLM以及以上两个库的头文件。(CMakeList还没有完备地去写)

本节最终的效果为:
在这里插入图片描述

纹理的加载

加载纹理需要以下几步:
1.从纹理文件中读取数据到内存
2.创建一个staging buffer和一个VkImage
3.将读取后的数据转移到staging buffer中
4.对VkImage做Layout转移,将它转移到VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL中
以供数据拷贝
5.将staging buffer中的数据拷贝的VkImage中
6.对VkImage做Layout转移,将它转移到VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL供Shader读取使用(如果要生成Mipmap,则需要把这一步去掉,原因在后面会讲)

void VKResourceCreator::CreateTexture(const char * file , VkImage & textureImage , VkDeviceMemory & textureImageMemory , VKCommandManager * commandManager , VkQueue queue , VkCommandPool commandPool, int& width, int& height , uint32_t &mipLevels)
{
	// 1. load data from file 
	int texWidth, texHeight, texChannels;
	stbi_uc* pixels = stbi_load(file, &texWidth, &texHeight, &texChannels, STBI_rgb_alpha);
	VkDeviceSize imageSize = texWidth * texHeight * 4;
	mipLevels = std::floor(std::log2(std::max(texWidth, texHeight))) + 1;
	width = texWidth;
	height = texHeight;
	if (!pixels)
	{
		throw std::runtime_error("failed to load texture image . ");
	}

	// 2. create staging buffer and image 
	VkBuffer stagingBuffer;
	VkDeviceMemory stagingBufferMemory;
	CreateBuffer(imageSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, stagingBuffer, stagingBufferMemory);

	CreateImage(texWidth,
		texHeight,
		mipLevels,
		VK_FORMAT_R8G8B8A8_UNORM,
		VK_IMAGE_TILING_OPTIMAL,
		VK_SAMPLE_COUNT_1_BIT,
		VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,
		VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
		textureImage,
		textureImageMemory);

	// 3. transition data into staging buffer
	void* data;
	vkMapMemory(logical_device_, stagingBufferMemory, 0, imageSize, 0, &data);
	memcpy(data, pixels, static_cast<size_t>(imageSize));
	vkUnmapMemory(logical_device_, stagingBufferMemory);
	stbi_image_free(pixels);

	// 4. transition layout 1
	commandManager->TransitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, mipLevels, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, queue, commandPool);

	// 5. copy data into image
	commandManager->CopyBufferToImage(stagingBuffer, textureImage, texWidth, texHeight, queue, commandPool );

	// 6. transition layout 2
	commandManager->TransitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, mipLevels, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, queue, commandPool );

	vkDestroyBuffer(logical_device_, stagingBuffer, NULL);
	vkFreeMemory(logical_device_, stagingBufferMemory, NULL);
}

注意在创建Texture的时候给Usage添加了一个VK_IMAGE_USAGE_TRANSFER_SRC_BIT,因为它将在之后进行Mipmap,Mipmap也是通过内存转移来实现的,在这个时候Texture将成为它的子Mipmap的转移来源。
ImageLayout的转移要通过命令来实现
这里对ImageLayout转移的实现放在了commandManager中,因为这是一个可以被反复使用的一个命令。
它的具体实现为:

void VKCommandManager::TransitionImageLayout(VkImage image, VkFormat format, uint32_t mipLevels , VkImageLayout oldLayout, VkImageLayout newLayout , VkQueue graphicsQueue, VkCommandPool commandPool)
{
	
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
realesrgan-ncnn-vulkan-20211212-windows是一个基于ncnn框架和Vulkan图形API开发的图像超分辨率增强模型。它是由GitHub用户realsrgan开发的最新版本,最新发布日期为2021年12月12日,专为Windows操作系统而设计。 该模型的主要应用是图像超分辨率增强,通过提高图像的分辨率和细节,使图像看起来更加清晰和真实。它采用深度学习和卷积神经网络等先进的技术,能够将低分辨率的图像转换成高分辨率的图像,从而提升图像的质量和视觉效果。 realesrgan-ncnn-vulkan-20211212-windows的开发使用了ncnn框架和Vulkan图形API,这使得它能够在Windows系统上实现快速且高效的图像处理。ncnn是一个轻量级的深度学习框架,专注于在移动平台和嵌入式设备上实现高性能和低延迟的推理。而Vulkan图形API是一种跨平台的图形渲染和计算API,可以充分利用计算设备的性能,提供高效的图像处理和渲染能力。 realesrgan-ncnn-vulkan-20211212-windows的使用可以通过命令行或者图形界面进行,用户可以根据自己的需求和偏好选择适合的方式。该模型提供了训练好的权重参数,用户可以直接加载这些参数并进行图像超分辨率增强。此外,该模型还支持批量处理和视频处理,方便用户对多个图像进行处理。 总之,realesrgan-ncnn-vulkan-20211212-windows是一个高效、快速且易于使用的图像超分辨率增强模型,适用于Windows系统,并利用了ncnn框架和Vulkan图形API的优势,为用户提供了出色的图像处理效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值