【Vulkan入门】18-Texture[2/4]

文章目录

  • Texture
    • Texture::LoadImage()

本篇不叨叨了,接着 上篇。 本篇介绍如何创建纹理图片。

Texture

这个类的作用是传入一个图片的路径,构建纹理图片和Sampler。

Texture::LoadImage()

这个方法是创建纹理Image
代码比较长,我先把代码的逻辑介绍一下。

  1. 使用stb库读取一个图片。
  2. 创建一个CPU可写的Buffer,并将图片的像素信息拷贝到Buffer中。这个操作与【Vulkan入门】16-IndexBuffer中的操作是一样的。
  3. 创建一个位于GPU(Device)内存上的Image
  4. 转换Image的Layout
  5. 将Buffer中的内容拷贝到Image中。
  6. 转换Image的Layout
  7. 创将ImageView。 在【Vulkan入门】09-CreateFrameBuffer中提到过,Vulkan不会直接操作Image,而是通过ImageView来操作Image。

STB库 https://github.com/nothings/stb.git
这是一个操作图片的库。这个库的特点是所有实现都在一个头文件里完成。因此只要将所需要的头文件拷贝的项目中就可以直接使用了。
这里使用了stb_image.h中来读取图像,在引用这个头文件的上面添加#define STB_IMAGE_IMPLEMENTATION,便可以直接使用了。

为什么要转变Image的Layout,之前介绍过Image和Buffer的最大区别是,Image是具有特殊用途的内存空间。因此Vulkan会根据不同的用途对图片在内存中的布局(Layout)进行调整,已优化对Image的使用效率。比如在拷贝前将Image的Layout设置为VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,Vulkan将Image视为拷贝的目标进行优化。在拷贝后将Image的Layout设置为VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,Vulkan会将Image视为采样器的纹理进行优化。

使用vkCmdPipelineBarrier接口可以转换Image的Layout。 这个接口名可能会导致一些误解,但Vulkan就是这么定义的只能接受。这个Command主要作用其实是保证对内存访问的一致性,其副作用是转换Image的Layout。

void Texture::LoadImage()
{stbi_uc* pixels = stbi_load(m_imagePath.c_str(),&m_texWidth,&m_texHeight, &m_texChannels,STBI_rgb_alpha);m_texSize = m_texWidth * m_texHeight * 4;if (!pixels) {throw std::runtime_error("failed to load texture image!");}VkBuffer stagingBuffer;VkDeviceMemory stagingBufferMemory;MemoryTool::CreateBuffer(m_physicalDevice,m_device,m_texSize,VK_BUFFER_USAGE_TRANSFER_SRC_BIT,VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,stagingBuffer,stagingBufferMemory);void* data;vkMapMemory(m_device, stagingBufferMemory, 0, m_texSize, 0, &data);memcpy(data, pixels, static_cast<size_t>(m_texSize));vkUnmapMemory(m_device, stagingBufferMemory);stbi_image_free(pixels);MemoryTool::CreateImage(m_physicalDevice,m_device,m_texWidth,m_texHeight,VK_FORMAT_R8G8B8A8_SRGB,VK_IMAGE_TILING_OPTIMAL,VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, m_textureImage,m_textureImageMemory);TransitionImageLayout(m_textureImage,VK_FORMAT_R8G8B8A8_SRGB,VK_IMAGE_LAYOUT_UNDEFINED,VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);CopyBufferToImage(stagingBuffer,m_textureImage,static_cast<uint32_t>(m_texWidth),static_cast<uint32_t>(m_texHeight));TransitionImageLayout(m_textureImage,VK_FORMAT_R8G8B8A8_SRGB,VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);CreateTextureSampler();vkDestroyBuffer(m_device, stagingBuffer, nullptr);vkFreeMemory(m_device, stagingBufferMemory, nullptr);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/890218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MFC 应用程序语言切换

在开发多语言支持的 MFC 应用程序时&#xff0c;如何实现动态语言切换是一个常见的问题。在本文中&#xff0c;我们将介绍两种实现语言切换的方式&#xff0c;并讨论其优缺点。同时&#xff0c;我们还会介绍如何通过保存配置文件来记住用户的语言选择&#xff0c;以及如何在程序…

torch.multiprocessing 向Process传递对象参数报错 Can‘t pickle local object

如下代码所示&#xff0c;使用torch.multiprocessing启动多进程&#xff0c;并传递了model和image_processor两个对象作为参数。 from torch.multiprocessing import Process, Queue, Manager...p3 Process(targetframe_memory_manager,args(model, image_processor, frame_q…

基于海思soc的智能产品开发(巧用mcu芯片)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于开发车规级嵌入式软件的同学来说&#xff0c;socmcu这样的组合&#xff0c;他们并不陌生。但是传统的工业领域&#xff0c;比如发动机、医疗或…

带有 Elasticsearch 和 Langchain 的 Agentic RAG

作者&#xff1a;来自 Elastic Han Xiang Choong 讨论并实现 Elastic RAG 的代理流程&#xff0c;其中 LLM 选择调用 Elastic KB。 更多阅读&#xff1a;Elasticsearch&#xff1a;基于 Langchain 的 Elasticsearch Agent 对文档的搜索。 简介 代理是将 LLM 应用于实际用例的…

SmartX分享:NVMe-oF 介绍、SMTX ZBS 如何选择高性能场景解决方案与如何实现

目录 背景什么是 NVMe-oFZBS AccessiSCSI 与 iSERNMVe-oF 介绍NVMeNVMe-oFNVMe-oF 承载网络&#xff08;数据平面&#xff09; ZBS NVMe-oF 实现ZBS 接入策略ZBS 接入点分配策略性能测试 为什么要支持 RoCE引用 背景 前几篇文章&#xff0c;我们认识到了 SmartX 公司产品 SMTX…

单片机flash rom ram 理解

您说得对&#xff0c;传统意义上的 ROM&#xff08;Read-Only Memory&#xff0c; 只读存储器&#xff09; 是一种非易失性存储器&#xff0c;掉电后不会丢失数据。但在很多单片机&#xff08;例如STM8&#xff09;中&#xff0c;所谓的 EEPROM 或 Flash 也常被称作“ROM”来存…

全面解析 Golang Gin 框架

1. 引言 在现代 Web 开发中&#xff0c;随着需求日益增加&#xff0c;开发者需要选择合适的工具来高效地构建应用程序。对于 Go 语言&#xff08;Golang&#xff09;开发者来说&#xff0c;Gin 是一个备受青睐的 Web 框架。它轻量、性能高、易于使用&#xff0c;并且具备丰富的…

【机器学习】机器学习的基本分类-强化学习(Reinforcement Learning, RL)

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是一种基于试错的方法&#xff0c;旨在通过智能体与环境的交互&#xff0c;学习能够最大化累积奖励的策略。以下是强化学习的详细介绍。 强化学习的核心概念 智能体&#xff08;Agent&#xff09; 执行动作并与环境…

MyBatis-Plus中isNull与SQL语法详解:处理空值的正确姿势

目录 前言1. 探讨2. 基本知识3. 总结 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#x…

Spring Boot 项目创建

创建一个新项目&#xff1a; 打开 Spring Initializr 网址&#xff1a;https://start.spring.io/ &#xff0c;然后创建一个新项目&#xff1a; springboot3.3.5_jdk17&#xff1a; Project&#xff08;Maven&#xff09;编程语言&#xff08;Java 17&#xff09;Spring Boo…

基于蓝牙通信的手机遥控智能灯(论文+源码)

1.系统设计 灯具作为人们日常生活的照明工具为人们生活提供光亮&#xff0c;本次基于蓝牙通信的手机遥控智能灯设计功能如下&#xff1a; &#xff08;1&#xff09;用户可以通过蓝牙通信模块的作用下&#xff0c;在手机端遥控切换智能灯不同的工作模式&#xff1b; &#x…

【VUE】13、安装nrm管理多个npm源

nrm&#xff08;npm registry manager&#xff09;是一个 npm 源管理器&#xff0c;它允许用户快速地在不同的 npm 源之间进行切换&#xff0c;以提高包管理的速度和效率。以下是对 nrm 使用的详细介绍&#xff1a; 1、安装nrm 在使用 nrm 之前&#xff0c;需要先确保已经安装…

ASR-LLM-TTS 实时语音对话助手:语音识别、大模型对话、声音生成

参考:https://blog.csdn.net/weixin_42357472/article/details/137020794 asr:funasr-SenseVoiceSmall 离线 llm:deepseek 在线api tts:edge-tts 在线api import pyaudio import wave import threading import numpy as np import time from queue import Queue import web…

为什么光耦固态继电器(SSR)值得关注?

光耦固态继电器&#xff08;SSR&#xff09;作为现代电子控制系统中不可或缺的关键组件&#xff0c;正逐步取代传统机械继电器。通过利用光耦合技术&#xff0c;SSR不仅能够提供更高的可靠性&#xff0c;还能适应更加复杂和严苛的应用环境。在本文中&#xff0c;我们将深入探讨…

AI @国际象棋世界冠军赛: 从棋盘到科研创新之路

点击屏末 | 阅读原文 | 在小红书和 Google 谷歌回顾 WCC

矩阵运算的复杂度分析(Complexity Analysis of Matrix Operations):中英双语

矩阵运算的复杂度分析 矩阵运算在科学计算、机器学习、图像处理等领域中起着至关重要的作用。了解各种常见矩阵运算的复杂度&#xff0c;对于优化算法、提高计算效率具有重要意义。在这篇博客中&#xff0c;我们将详细探讨矩阵加法、标量乘法、矩阵转置、矩阵-向量乘法等基本矩…

leetcode二叉搜索树部分笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 二叉搜索树 1. 二叉搜索树的最小绝对差2. 二叉搜索树中第 K 小的元素3. 验证二叉搜索树 1. 二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中…

如何创建属于自己的大语言模型:从零开始的指南

如何创建属于自己的大语言模型&#xff1a;从零开始的指南 为什么要创建自己的大语言模型&#xff1f; 随着人工智能的快速发展&#xff0c;大语言模型&#xff08;LLM&#xff09;在各种场景中表现出了卓越的能力&#xff0c;例如文本生成、对话交互和内容总结等。虽然市场上…

计算机工作流程

分析下面的计算机工作流程&#xff1a; 1.取数a至ACC&#xff1a;PC程序寄存器自增1&#xff0c;变成0&#xff08;可以理解为PC初始从-1开始自增&#xff09;&#xff1b;接着PC把当前指令的地址给到MAR&#xff08;地址寄存器&#xff09;&#xff1b;MAR拿到当前地址后&…

ffmpeg翻页转场动效的安装及使用

文章目录 前言一、背景二、选型分析2.1 ffmpeg自带的xfade滤镜2.2 ffmpeg使用GL Transition库2.3 xfade-easing项目 三、安装3.1、安装依赖&#xff08;[参考](https://trac.ffmpeg.org/wiki/CompilationGuide/macOS#InstallingdependencieswithHomebrew)&#xff09;3.2、获取…