
Vulkan
文章平均质量分 85
学习高性能图形API Vulkan,循序渐进封装一个渲染器。
xuwzen
全栈Web开发
https://github.com/wxzen
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Vulkan多管线渲染与绘制世界坐标轴Axis
可以在初始化过程中设置多套不同的管线缓存起来,然后在绘制帧的时候绑定需要的管线进行绘制,这比每次绘制的时候重新创建管线性能要好得多。绘制的时候应该根据不同类型的管线对模型实例进行分组绘制,每绑定一种图形管线,就把那种图形管线对应的模型实例都放到一个集合中进行批量绘制,这样总体下来性能影响可以忽略不计。我们现在就之前配置的线段管线绘制一个简单的世界坐标轴,从原点位置发射的三条射线组成,而且缩放场景时坐标轴适当自动缩放以保证在合适大小便于观察。属性用于存放线段类型的网格对象,原来的。存储三角形类型的网格对象。原创 2025-06-27 11:57:04 · 1020 阅读 · 0 评论 -
Vulkan模型查看器设计:相机类与三维变换
Camera.hpublic:// 相机位置// 相机前向向量// 相机上方向// 相机右向量// 世界坐标系上方向float yaw;// 偏航角// 俯仰角float fovy;// 垂直视场角float near;// 近面float far;// 远面// 移动速度// 鼠标敏感度// 相机移动方向// 操作模式// 初始化// 获取视图矩阵// 获取投影矩阵// 设置交互模式// 处理键盘操作// 处理了鼠标移动// 处理缩放。原创 2025-06-27 20:02:56 · 1092 阅读 · 0 评论 -
Vulkan 通过 CMake 集成 Dear ImGUI
Vulkan 基础准备:完成VkInstanceVkDeviceSwapChain等渲染器核心组件初始化,特别注意描述符池需预留足够空间给 ImGUI 与主渲染。ImGUI 初始化:通过创建上下文,配置 IO(如中文字体、交互支持),设置主题样式,再初始化 GLFW + Vulkan 后端。字体上传:需用独立命令缓冲,上传后通过保证同步,避免渲染异常。主循环集成:每帧调用NewFrame、构建 UI(如)、Render,最后在 Vulkan 命令缓冲中调用绘制 UI。原创 2025-06-23 11:46:30 · 676 阅读 · 0 评论 -
Vulkan 学习笔记15—Mipmap 与多重采样
定义:Mipmap 是图像预先计算的缩小版本,每个层级宽高为前一层的一半,用作细节级别(LOD)。作用远离相机的对象使用较小层级采样,提升渲染速度。避免莫尔条纹等伪影。存储方式:在 Vulkan 中存储于VkImage的不同 mip 级别,级别 0 为原始图像,后续层级构成 mip 链。作用:解决几何图形边缘锯齿状走样问题,通过每个像素使用多个采样点计算最终颜色。原理:普通渲染使用单个采样点,MSAA使用多个采样点(如2/4/8倍),采样数越多效果越好但性能开销越大。核心流程。原创 2025-06-22 19:38:17 · 801 阅读 · 0 评论 -
Vulkan 学习笔记14—模型加载(OBJ、glTF)
这段代码定义了一个名为的结构体,用于表示 3D 场景中的一个可渲染网格对象。几何数据存储:使用vertices和indices存储网格的几何形状纹理管理:通过textures向量管理与网格关联的纹理空间变换:使用控制网格在场景中的位置、旋转和缩放Vulkan 资源:包含用于渲染的 GPU 缓冲区和内存句柄构造函数:提供灵活的初始化方式,支持自定义或默认参数当前 vulkan 渲染器实现了obj、gltf、glb 模型的正常渲染,但并不包含光照相关信息,光照在后续笔记中记录。原创 2025-06-22 15:44:05 · 1060 阅读 · 0 评论 -
Vulkan学习笔记13—推送常量
Vulkan规范中,推送常量是可通过API写入并在着色器中访问的小块数据。其优势在于允许应用程序设置着色器参数,而无需创建缓冲区或频繁修改/绑定描述符集,提升数据更新效率。本节使用推送常量替换 UBO 传递 MVP 变换矩阵。原创 2025-06-20 12:17:25 · 1068 阅读 · 0 评论 -
Vulkan 学习笔记12—深度缓冲
当多个3D几何体未按深度排序时,后绘制的片段会覆盖先绘制的片段(如两个正方形因索引顺序导致显示错乱)。通过上述步骤,可在Vulkan中实现正确的深度缓冲机制,解决3D几何体的渲染顺序问题,确保场景深度关系准确。顶点着色器需接收3D坐标并通过模型-视图-投影矩阵转换为裁剪坐标。(模板分量用于 模板测试:与深度测试结合使用的附加测试。将2D几何体扩展为3D时,需在Vertex结构体中添加。当前代码分支:10_depth_buffer。在 vkInit 函数中调用。在重建交换链函数中调用。原创 2025-06-19 15:30:43 · 875 阅读 · 0 评论 -
Vulkan学习笔记11—纹理映射
概念与作用图像视图是对图像的一种“视图”抽象,定义了如何访问图像数据(如格式、维度、子资源范围)。所有图像(包括纹理和交换链图像)必须通过图像视图访问。创建流程关键参数image:关联的VkImage对象。viewType:视图类型(如format:数据格式(如:指定访问的Mip级别和数组层(通常为全范围)。代码示例// 设置Mip级别和数组层范围...代码优化抽象通用函数。原创 2025-06-19 12:03:09 · 988 阅读 · 0 评论 -
Vulkan学习笔记10—统一缓冲区
gl_Position 计算引入了模型 - 视图 - 投影变换链,其结果的 w 分量(通常由透视投影矩阵生成)可能不为 1,这会触发透视除法(NDC = 裁剪坐标 /w),是实现近大远小透视效果的关键。在 recordCommandBuffer 函数的 vkCmdDrawIndexed 调用前添加 vkCmdBindDescriptorSets 将每一帧的正确描述符集绑定到着色器中的描述符。指定将绑定到描述符的实际缓冲区或图像资源,就像帧缓冲指定要绑定到渲染通道附件的实际图像视图一样。原创 2025-06-18 15:36:59 · 934 阅读 · 0 评论 -
Vulkan学习笔记8—顶点输入描述与顶点缓冲
可见缓冲区并使用 memcpy 将顶点数据直接复制到其中的最简单方法开始,之后我们将了解如何使用暂存缓冲区将顶点数据复制到高性能内存中。创建一个VkTypes.h头文件,添加顶点数据结构体 Vertex,顶点/颜色都作为属性,这称为交错顶点属性。当前代码分支为 06_vertexInputdescription_vertexbuffer。一切正常,Validation Layer 也没有输出错误日志!用内存中的顶点缓冲区替换顶点着色器中硬编码的顶点数据。原创 2025-06-17 16:41:41 · 926 阅读 · 0 评论 -
Vulkan学习笔记9—暂存缓冲与索引缓冲
索引缓冲区是指向顶点缓冲区的指针数组,可重新排列顶点数据,实现数据重用。以矩形为例,若顶点缓冲区含 4 个唯一顶点,索引缓冲区前 3 个索引定义右上角三角形,后 3 个索引定义左下角三角形,避免顶点重复存储。即使是绘制一个简单的矩形,也会发生这种情况。当前顶点缓冲功能正常,但 CPU 可访问的内存类型可能并非显卡读取的最优选择。本节将创建多个缓冲区,提取缓冲区创建逻辑为辅助函数。编写一个函数,用于将内容从一个缓冲区复制到另一个缓冲区,称为。最后通过缓冲区复制命令,将数据从暂存缓冲区迁移至顶点缓冲区。原创 2025-06-18 09:36:58 · 563 阅读 · 0 评论 -
Vulkan学习笔记7—分层重构
这个渲染器接口的设计目的是将 Vulkan 的复杂初始化、渲染和清理过程封装成简单易用的函数,使上层应用程序可以方便地使用 Vulkan 进行渲染,而不必关心底层实现细节。VkContext 结构体的设计目的是将 Vulkan API 的核心对象集中管理,形成一个完整的渲染上下文。这个接口是构建 Vulkan 渲染系统的基础,可以在此基础上实现更复杂的渲染功能,如多线程渲染、动态资源管理等。这个封装是 Vulkan 应用程序的基础,后续可以在此基础上构建更复杂的渲染功能。原创 2025-06-16 21:24:03 · 705 阅读 · 0 评论 -
Vulkan学习笔记5—帧缓冲和命令缓冲
帧缓冲(Framebuffer)是图形渲染管线的最终输出目标,用于存储渲染后的图像数据。它本质上是一个由颜色附件、深度附件、模板附件等组成的集合,这些附件对应 GPU 内存中的特定区域,用于记录像素的颜色值、深度值等信息。在渲染过程中,GPU 将图元处理结果写入帧缓冲,最终通过显示设备输出图像。原创 2025-06-13 09:30:47 · 519 阅读 · 0 评论 -
Vulkan学习笔记6—渲染呈现
录制一个命令缓冲区将场景绘制到图像上(vkBeginCommandBuffer、vkEndCommandBuffer)它是用于对 CPU(也称为主机)上的执行进行排序的。将该图像呈现到屏幕上进行呈现,将其返回到交换链(vkQueuePresentKHR)从交换链获取图像(vkAcquireNextImageKHR)从交换链获取图像(vkAcquireNextImageKHR)呈现交换链图像(vkQueuePresentKHR)执行在获取的图像上绘制的命令。用于控制GPU上的同步操作。GPU执行需显式同步。原创 2025-06-13 21:38:58 · 615 阅读 · 0 评论 -
Vulkan学习笔记4—图形管线基础
输入汇编器(Input assembler)从您指定的缓冲区收集原始顶点数据,并且还可以使用索引缓冲区来重复某些元素,而无需复制顶点数据本身。顶点着色器(Vertex shader)为每个顶点运行,通常应用变换将顶点位置从模型空间转换为屏幕空间。它还将每个顶点的数据传递到管线中。细分着色器(Tessellation)允许您根据某些规则细分几何图形以提高网格质量。这通常用于使附近的砖墙和楼梯等表面看起来不那么平坦。几何着色器(Geometry shader)原创 2025-06-12 17:57:12 · 1111 阅读 · 0 评论 -
Vulkan学习笔记2—画三角形基本步骤和验证层
创建一个 VkInstance选择一个支持的显卡 (VkPhysicalDevice)创建用于绘制和呈现的 VkDevice 和 VkQueue创建一个窗口、窗口表面和交换链将交换链图像包装到 VkImageView 中创建一个指定渲染目标和用法的渲染通道为渲染通道创建帧缓冲区设置图形管线为每个可能的交换链图像分配并记录带有绘制命令的命令缓冲区通过获取图像、提交正确的绘制命令缓冲区并将图像返回到交换链来绘制帧// 标记是否为同一队列族public:void run();原创 2025-06-12 10:57:10 · 391 阅读 · 0 评论 -
Vulkan学习笔记3—物理设备-逻辑设备-窗口表面-交换链-图像视图
物理设备:代表 GPU 硬件,查询能力(队列、表面支持等)。逻辑设备:管理资源与队列(图形 / 呈现队列),提交命令。窗口表面:连接 Vulkan 与系统窗口,定义呈现目标。交换链:管理后台图像缓冲区,配置格式 / 呈现模式。图像视图:为图像定义使用方式(如颜色附件、纹理)。原创 2025-06-12 14:56:52 · 361 阅读 · 0 评论 -
Vulkan学习笔记1—环境搭建
如果嫌这样麻烦,你可以单独把glm库clone下来复制到extern目录下,但是不会自动加入当前项目的子模块管理中,提交代码时如果不在.gitignore中标记忽略会把整个子模块源码提交了。下载vulkan sdk安装,由于安装的是Windows exe,环境变量是自动设置的,如果是通过压缩包解压放到某个目录需要自行配置环境变量。可以下载到Windows预编译的文件,也可以自己下载源码编译,我这里是之前用CMake工具编译的文件,依赖包放到extern目录下统一管理。原创 2025-06-11 14:15:12 · 1115 阅读 · 0 评论