- 博客(67)
- 收藏
- 关注
原创 给静态角色加上动画: CPU 骨骼动画的思路与关键代码
本文梳理VulkanLab中CPU骨骼动画的完整接入链路:从加载阶段补齐节点层级、关键帧与蒙皮数据,到每帧时间采样、全局矩阵传播、统一参考空间下的蒙皮矩阵计算,最终实现顶点与法线变形、分批上传并绘制。以“缺什么数据、每帧算什么、结果送到哪里”为主线,结合实际踩坑经验,强调数据生命周期管理、空间一致性及异常排查要点,适用于理解与复现角色动画流程。
2026-11-05 21:17:30
248
原创 从关键帧到 GPU 顶点变形:动画系统学习总结
本文以“给定播放时间,如何生成屏幕上运动的模型”为主线,系统解析动画系统的四层架构:控制层(时间采样与播放)、采样层(关键帧插值)、变形层(骨骼蒙皮、Morph变形)与渲染层(Compute与绘制)。通过四个示例,深入探讨秒与tick换算、四元数旋转、逆绑定矩阵、权重归一化、法线逆转置变换及多动画混合等核心机制。文章强调数据流一致性,提出统一公式对比三类权重(骨骼、Morph、混合),并提供可追溯的数据链排查路径与代码阅读入口,帮助读者建立可手算、可验证的动画理解体系。
2026-11-04 18:00:57
264
原创 从两个三角形到多模型渲染:Chapter08-03 学习总结
本文系统阐述了多模型合并与渲染的核心技术,通过手算三角形验证编号重映射、索引偏移与坐标空间转换,结合小黄鸭与魔法书的真实模型完成场景、几何与材质的合并。重点掌握四种关键函数:mergeScenes(层级重组)、mergeMeshData(顶点与索引拼接)、mergeMaterialLists(纹理去重)及mergeNodesWithMaterial(按材质合批),强调编号一致性与顺序统一的重要性。实践涵盖缓存预处理、包围盒计算、线框调试与辐照度环境光实现,验证了合并后局部变换与世界位置的正确性。最终通过Vu
2026-10-29 22:00:48
225
原创 从显示模型到交互编辑:场景图学习总结
本文系统梳理了3D模型渲染中数据组织与交互的核心问题。围绕“模型数据如何组织、修改后如何同步至GPU”主线,深入解析了场景图的父子变换关系、局部与全局矩阵计算、节点选择与操作手柄实现、动画与手动编辑的冲突处理、包围盒更新、材质与贴图的CPU-GPU同步机制。最终提炼出两条贯穿全章的数据链:变换链(用户输入→局部变换→全局重算→上传GPU)与材质链(修改材质→标记→转换→上传→着色生效),为复杂场景的动态编辑与调试提供了清晰的分析框架。
2026-10-29 13:36:24
376
原创 描述符索引与 GPU 驱动:从点击爆炸到音乐节拍演出
本章将传统CPU驱动的爆炸动画改造为GPUDriven流水线:通过SpawnBuffer(CPU)、Compute Shader(GPU计算帧号/透明度/紧凑打包)与DrawIndirect(GPU渲染)实现全GPU调度。解决描述符索引偏移问题,引入前缀和确保顺序稳定,结合音乐节拍事件驱动爆炸节奏,实现颜色稳定性与律动波形可视化。核心收获:数据契约对齐、确定性优先、最小实验排查,三层流水线架构提升性能与可扩展性。
2026-10-22 20:42:44
171
原创 PBR 材质扩展:从清漆到解析光源
本文系统解析了PBR材质的八大扩展:清漆(Clearcoat)、布料光泽(Sheen)、透射(Transmission)、体积吸收(Volume)、折射率(IOR)、镜面强度(Specular)、自发光(Emissive)与解析光源(AnalyticalLight)。通过物理基础与渲染实现,构建了覆盖车漆、丝绸、玻璃、琥珀等复杂材质的完整表达体系,强化能量守恒与材质分层逻辑,最终实现从标准PBR到真实世界材质的全面拓展。
2026-10-19 15:35:06
234
原创 从无光照到 PBR:我的环境光照学习记录
本文系统梳理了PBR渲染的核心流程:从无光照渲染奠定颜色基础,到离线生成BRDF LUT与环境贴图预过滤,最终合体实现金属-粗糙度材质的完整PBR光照。关键在于分离“材质”与“光照”,通过预计算(LUT、mip-filtered环境图)降低实时开销,运行时以查表替代复杂积分。掌握C6-02~C6-04的分工逻辑(split-sum)、材质参数转换(MR/SG体系差异)及数据流骨架,理解“预计算+查表+实时公式”的组合模式,是构建真实感渲染管线的核心。动手调试贴图、修改参数、注释流程,远胜于死记公式。
2026-10-15 17:59:59
160
原创 从曲面细分到计算着色器:我的 Vulkan 实验记录
本文记录了四章Vulkan图形编程实践:曲面细分实现动态网格加密,顶点压缩与间接绘制提升性能,计算着色器生成等离子纹理,以及计算网格每帧动态生成波浪平面。重点解决了控制点布局、数据对齐、内存同步、编码规范等关键坑点,深入理解了GPU数据流动机制与底层细节,掌握了从模型到渲染的全流程优化能力。
2026-10-14 19:39:52
251
原创 从纹理鸭子到环境反射
本文记录了在 LVK/Vulkan 渲染器中为纹理鸭子添加天空盒与环境反射的完整过程。核心改动包括:将 push constant 改为 `GL_EXT_buffer_reference` 地址传递以突破 128 字节上限、严格对齐 CPU/GPU 共享结构体(std430 + `alignas(16)`)、新增 Cubemap HDR 环境纹理、补齐管线 `color[]` 声明、天空盒先画且关闭深度测试、顶点与片元间改用结构体传递并计算反射方向。
2026-09-18 12:27:49
286
原创 给gltf模型增加纹理
本文基于LVK框架,实现glTF模型的纹理渲染与线框叠加显示。通过Assimp加载模型,提取顶点与纹理坐标,利用stb_image加载贴图并创建GPU纹理,结合着色器中的texture采样实现材质映射。创建两套渲染管线:一套正常着色,另一套以线框模式渲染,通过specializationconstant复用着色器代码。重点展示了缓冲区、纹理、着色器与渲染管线的配置流程,掌握纹理坐标绑定与采样机制,为后续光照、多模型渲染奠定基础。
2026-09-16 10:31:31
43
原创 Vulkan 实战:使用 LVK 加载 glTF 模型并渲染线框模式
本文介绍使用轻量级Vulkan封装库LVK实现glTF模型(橡皮鸭)的线框渲染。通过初始化窗口与Vulkan上下文,利用Assimp加载并三角化模型数据,创建顶点、索引及深度缓冲区,配置顶点输入布局,构建实体与线框双渲染管线(后者启用PolygonMode_Line),并在主循环中动态更新相机视角,最终完成带线框效果的实时渲染。LVK有效降低了Vulkan开发复杂度,助力开发者聚焦核心逻辑。
2026-09-09 17:49:21
29
原创 LVK 实战:从三角形到立方体——绘制差异详解
<think>我们只需要根据内容生成摘要,不超过150字。要求概括主要内容和亮点。</think>本文基于LVK和GLFW实现旋转彩色立方体,利用特化常量切换实体与线框渲染,单次循环绘制彩色表面与黑色轮廓。重点对比从三角形到立方体的差异:索引绘制顶点数从3增至36,并新增线框管线叠加效果,同时采用动态MVP矩阵形成旋转动画,帮助理解Vulkan渲染管线。
2026-09-08 14:23:21
153
原创 使用 LightweightVK 封装引擎进行 Vulkan 渲染:三角形绘制入门
Vulkan 作为新一代图形 API,以其高性能和低开销著称,但其繁琐的初始化流程和冗长的样板代码也让许多开发者望而却步。LightweightVK(简称 LVK)是一个轻量级的 Vulkan 封装库,它旨在简化 Vulkan 的开发流程,让开发者能够更专注于核心渲染逻辑,而不必深陷于设备、队列、交换链等底层细节之中。本文将基于一个完整的三角形渲染示例,带你一步步了解如何使用 LVK 搭建一个最基本的 Vulkan 渲染程序。我们将从窗口初始化、上下文创建、着色器加载、渲染管线构建,到最终的事件循环与绘制,
2026-09-04 14:13:42
241
原创 用 doctest 搭建测试模块taskflow执行并行任务
本文介绍了基于doctest的C++测试框架实现方案。测试代码独立存放在tests目录,通过CMake选项控制编译,主工程通过METEOR_BUILD_TESTS开关决定是否包含测试模块。测试入口仅需包含doctest头文件并定义主宏,基础测试用例使用简单的CHECK断言。方案支持VS2022调试,可集成Taskflow并行任务库进行并发测试,并能生成DOT文件可视化任务流。该方案具有依赖少、隔离性好、配置灵活等特点,便于IDE集成和并行验证。
2026-03-20 15:42:53
91
原创 OBJ格式3D模型显示异常解决
今天用JS解析OBJ格式文件的时候,顶点数据以及索引数据加载完成。但是显示出来的模型样式与实际的模型线框不一样。一开始不知道什么原因造成的,后面排查发现是OBJ的索引是从1开始的,导致三角形组合的时候,模型线框错乱。这个获取到索引数据后要减1.做到了我想要的效果。OK,简单记录一下,防止忘记以后可以查阅。
2026-02-03 14:02:49
63
原创 从一只会转的企鹅开始我的3D渲染底层之旅
本文通过手写JavaScript+Canvas实现3D渲染系统,深入剖析现代3D渲染管线本质。作者从模型数据结构、UV展开原理、纹理采样、三角形光栅化等核心环节入手,不使用任何3D引擎,完整复现了从顶点变换到像素渲染的全流程。重点揭示了UV展开是人为决策与几何映射的结合、纹理采样的数组索引本质、Z-Buffer对空间正确性的关键作用等核心认知。实践表明,理解渲染管线各阶段的职责划分和实现原理,比单纯追求渲染效果更重要,这为后续使用专业3D引擎奠定了扎实的理论基础。
2026-01-26 17:39:56
931
原创 一个揭开3D图形神秘面纱的公式
本文介绍了如何在浏览器中实现3D透视效果,仅使用HTML Canvas和简单数学公式x'=x/z、y'=y/z。通过透视投影原理,将3D坐标转换为2D屏幕坐标,并实现模型旋转和远近变化。文章详细讲解了从数学坐标到屏幕坐标的映射、3D投影核心算法、旋转平移变换,以及完整的3D渲染管线流程。最后通过penger.js中的顶点数据演示了真实3D模型的线框渲染效果,展示了不使用复杂矩阵和WebGL也能实现基本3D渲染的方法。
2026-01-04 14:00:58
385
原创 Vulkan 一句话心智词典(去恐惧版)
Vulkan图形API核心概念速览:Vulkan通过Instance初始化,通过PhysicalDevice和LogicalDevice管理GPU资源。其核心机制包括Queue队列执行、CommandBuffer命令缓冲和CommandPool内存管理。同步机制使用Fence、Semaphore和PipelineBarrier确保执行顺序。资源管理涉及Buffer和Image,通过ImageLayout控制用途状态。渲染流程由RenderPass、Subpass和Framebuffer组成,Pipeline
2025-12-28 20:03:22
392
原创 如果把vulkan渲染流程比作烤面包的制作过程
Vulkan与OpenGL的区别如同自建工厂与点单服务:Vulkan要求开发者像工厂老板一样事无巨细地管理整个GPU流水线。从注册工厂(Instance)、选择设备(PhysicalDevice)、配置电源(Device),到设计面包托盘(Swapchain)、编写工艺流程(RenderPass)、搭建生产线(Pipeline),再到制定工人操作清单(CommandBuffer)和启动生产(QueueSubmit),每个环节都需要开发者自主决策。这种底层控制虽然复杂,但避免了运行时开销,就像工业级烤面包工厂
2025-12-23 13:51:59
353
原创 Vulkan之cpu gpu都有自己的暂存缓冲区吗
暂存缓冲区是显存中的主机可见内存区域,主要用于CPU向GPU高效传输数据。其典型使用流程为CPU写入数据后,通过命令将数据复制到GPU专用缓冲或图像资源中。在Vulkan等API中,暂存缓冲区通常具有传输源和主机可见属性,而目标资源则标记为传输目标。根据更新频率不同,数据应采用不同处理策略:静态或低频更新的大数据应通过暂存缓冲一次性上传;高频更新数据则可直接映射主机可见资源,避免额外拷贝开销。
2025-11-12 10:49:56
545
原创 vulkan创建的暂存缓冲区是在cpu上还是在gpu上
摘要:Vulkan暂存缓冲区采用两段式设计,主机可见内存用于CPU映射写入数据,再通过传输命令拷贝至设备本地内存,兼顾易用性与性能。主机可见方案适合高频更新数据,设备本地方案适用于静态资源,而集成GPU可优化统一内存访问。实际应用中需根据数据类型、更新频率选择适当方案,大块静态资源优先使用设备本地内存配合暂存上传,动态数据则可直接映射主机可见内存以降低开销。
2025-11-12 10:29:36
266
原创 如何理解Vulkan中渲染与呈现中imageIndex和 currentFrame_的关系
这篇文章通过电影院的比喻解释了Vulkan渲染中的imageIndex和currentFrame_关系。imageIndex相当于电影院使用的具体画布(物理资源),而currentFrame_则是工位编号(逻辑流水线),管理着同步工具的使用。核心要点包括:1)画布(imageIndex)是动态分配的物理图像;2)工位(currentFrame_)确保同步对象有序使用;3)二者协作实现安全并行渲染。这种分离设计既避免了资源竞争(画布复用),又保证了工作流程有序(工位轮换),精确映射了Vulkan的多缓冲渲染机
2025-10-13 14:09:16
399
原创 Vulkan原理到底学什么
学习 Vulkan 原理 ≈ 理解它为什么这样设计,以及如何在程序中正确使用 GPU显式控制:你负责内存、同步、渲染顺序。渲染流程:RenderPass + Pipeline + CommandBuffer。内存与资源:显存类型、Layout、Barrier。同步机制:CPU/GPU、多线程安全。Shader 数据传递:DescriptorSet / PushConstants。扩展与优化:Pipeline Cache、多帧渲染、Ray Tracing。
2025-09-22 14:39:11
589
原创 Vulkan计算着色器中Dispatch、workGroups、invocation之间的关系
Vulkan计算着色器采用三级并行模型:Dispatch(任务分发)定义Workgroup网格,Workgroup(工作组)是基本执行单元,每个包含固定数量的Invocation(线程)。线程通过局部ID、工作组ID和全局ID定位,共同完成并行计算。类比学校结构:Dispatch如学校(定义班级总数),Workgroup如班级(固定学生数),Invocation如学生(执行具体任务)。这种层级设计使GPU能高效组织大规模并行计算。
2025-09-04 16:48:18
1105
原创 VkImage、VkDeviceMemory、VkImageView之间的关系
Vulkan深度缓冲由三个关键对象构成:VkImage存储像素数据,VkDeviceMemory分配物理内存,VkImageView提供访问接口。创建流程为:先创建Image,再分配绑定Memory,最后创建ImageView。这种设计体现了Vulkan显式控制的理念,虽然比OpenGL复杂,但能实现更精细的性能和内存管理。销毁顺序与创建相反:先销毁ImageView,再Image,最后释放Memory。深度缓冲核心功能是实现深度测试,确保3D场景正确遮挡关系,避免不必要的片段渲染。
2025-09-02 11:09:15
278
原创 Vulkan学到什么程度才算学会
Vulkan作为低抽象层图形API,学习关键在于理解其设计思想而非死记API。掌握程度可分为四个阶段:入门(创建窗口/渲染三角形)、熟练(实现模型加载/光照/资源管理)、进阶(多帧渲染/高级效果/性能优化)和专家(多线程/扩展应用/框架开发)。真正"学会Vulkan"的标志是能独立完成从基础渲染到复杂3D渲染器的开发,逐步深入同步机制、性能调优等核心概念,最终达到灵活运用高级特性与跨平台优化的专家水平。学习路径体现为从功能实现到系统设计的渐进过程。
2025-08-25 21:54:48
557
原创 Vulkan笔记(十四)-同步设定绘制三角形
允许同时处理多帧(如设为2时,CPU可录制第N帧命令,而GPU执行第N-1帧),提升GPU利用率。:确保CPU等待GPU完成前一帧,防止命令缓冲区冲突(CPU-GPU同步)。录制绘制命令到当前帧的命令缓冲区(如绑定管线、设置视口、执行绘制调用。提交命令到图形队列,并关联当前帧的围栏(GPU完成后触发该围栏)。每帧拥有独立的命令缓冲区、信号量和围栏,避免同步干扰。循环使用帧资源(实现多帧并行,如双缓冲/三缓冲)。:重置命令缓冲区,确保其可被重新录制。:重置围栏状态,为当前帧做准备。)完成(避免GPU过载)。
2025-08-20 11:24:44
378
原创 Vulkan笔记(十三)-帧缓冲区与命令池命令缓冲区
帧缓冲区(Framebuffer)是 Vulkan/D3D12/OpenGL 中的核心对象,用于存储渲染结果的最终目标(即“画布”)。命令池负责为命令缓冲区分配和回收内存,避免频繁的内存申请/释放开销。(Color Attachments):存储像素颜色(输出到屏幕或纹理)。:可同时绑定多个颜色附件(如延迟渲染中的 G-Buffer)。(创建时指定队列族),确保命令缓冲区在正确的线程中录制和提交。命令缓冲区寿命短(每帧或频繁重置),驱动会优化内存分配。分配命令池(Command Pool)和命令缓冲区。
2025-08-19 17:28:24
1059
原创 Vulkan笔记(十一)-渲染通道(RenderPass)详解
1. 核心作用(1) 组织渲染流程将复杂的渲染分解为多个子流程(Subpasses),每个子流程可以依赖前一个子流程的结果(如延迟渲染中的 G-Buffer 传递)。明确附件(Attachments)(如颜色、深度、模板缓冲区)的生命周期和用途。(2) 优化内存带宽通过指定附件的加载操作(Load Op)和存储操作(Store Op),避免不必要的内存读写:****:保留附件原有内容(如叠加 UI)。****:清空附件(如每帧清空深度缓冲区)。****:保存渲染结果(如最终颜色输出到屏幕)。
2025-08-19 16:22:12
1364
原创 Vulkan笔记(十)-图形管道的七个配置项
深度测试:解决“谁在前谁在后”的问题,是 3D 渲染的基础。它决定了当前绘制的像素(源颜色,Source Color)如何与帧缓冲区(目标颜色,Destination Color)中已有的像素进行混合。将几何图元(如三角形)离散化为屏幕上的像素(称为片元/Fragment),确定哪些像素被图元覆盖,并进行属性插值计算(如颜色、深度)这里对顶点属性比如:位置 、颜色 、法线、纹理等描述信息进行创建,装配按照什么方式是点、线还是三角形等方式把顶点数据组织起来。,用于决定哪些像素最终被绘制到屏幕上。
2025-08-19 15:57:24
244
原创 VulKan笔记(九)-着色器
Vulkan 中的着色器代码必须在字节码中指定格式,而不是 GLSL 和 HLSL 等可读语法。顶点着色器与片元着色器,我这里使用的是GLSL语法格式。这个不做过多解释了。当你写好比如:shader.vert 与 shader.frag 着色器文件。如下绘制一个三角形硬编码的着色器文件。渲染管道创建的时候要把着色器创建对象赋值给管道,通过设置VkPipelineShaderStageCreateInfo分别按照不同类型设置着色器。创建shader着色器 就是两块内存设置顶点着色器与片元着色器字节码数据。
2025-08-19 15:28:47
357
原创 Vulkan笔记(八)- 图形渲染管线
每个阶段均可定制(通过着色器或状态设置),适合需要精细性能控制的场景(如游戏引擎或专业渲染工具)。存储模型的顶点数据(位置、法线、纹理坐标等)和索引数据(定义三角形如何连接)。从缓冲区读取顶点和索引数据,组装成基本图元(如三角形、线段)。对完整图元(如三角形)进行操作,可生成或销毁图元。将几何图元(如三角形)转换为屏幕上的像素(片元/Fragment)。:需手动配置管线状态(如深度测试、混合模式),不同于OpenGL的隐式状态机。对顶点属性(如颜色、深度)进行插值,生成每个片元的属性。
2025-08-19 15:15:32
569
原创 Vulkan笔记(七)---图像视图
这段代码是Vulkan中创建图像视图(Image Views)的实现,用于为交换链(Swap Chain)中的每个图像创建对应的视图。:使用交换链创建时确定的格式(swapChainImageFormat_),确保视图与图像格式一致。:设置为2D纹理视图(VK_IMAGE_VIEW_TYPE_2D),这是最常见的交换链图像类型。为交换链中的每个VkImage创建对应的VkImageView,使渲染管线能够访问这些图像。图像视图是由我们显式创建的,在程序结束时再次销毁它们。循环为每个交换链图像创建视图。
2025-08-19 11:06:35
249
原创 Vulkan笔记(六)--- 交换链
我们要设置的属性名存放在临时容器requiredExtensions中,如果全被删除,说明枚举设备扩展中包含了我们所设置的扩展属性,以此方式来判断是否支持此扩展。队列到底是如何工作的,以及从队列中呈现图像取决于交换链的设置方式,但是交换链的一般目的是同步具有屏幕刷新率的图像。Vulkan 没有“默认帧缓冲区”的概念,因此它需要一个基础设施来拥有我们将渲染到的缓冲区,然后再将它们可视化到屏幕上。这个就是选择设备支持的与屏幕设置的尺寸大小的分辨率。在设备判断是否支持的函数中增加物理设备是否支持交换链的判断。
2025-08-19 10:06:09
406
原创 Vulkan笔记(五)-逻辑层与队列
逻辑设备与队列逻辑层是应用程序与GPU交互的接口.通过 vkCreateDevice 创建需指定所需的队列族扩展与特性。(如启用几何着色器)管理资源(如缓冲区、图像、管线)和命令队列(VkQueue), 提交渲染或计算任务。:一个物理设备可创建多个逻辑设备,每个逻辑设备拥有独立的状态和资源,避免冲突(例如多线程渲染时隔离资源访问)。:可根据需求启用不同的硬件特性或扩展(如仅启用计算功能用于挖矿,而不需要图形队列)。通过获取物理设备的队列族索引(如图形队列和呈现队列)。初始化。
2025-08-18 16:24:09
521
原创 Vulkan笔记(四)-物理设备队列族
这个函数就是设置物理设备的过程,在initVulkan里初始化完成VkInstance后创建物理设备。,每个队列系列只允许子集的命令。可能有一个队列系列只允许处理计算命令或仅允许内存传输相关命令的命令。我们需要检查设备支持哪些队列系列以及哪些队列系列 中支持我们想要使用的命令。初始化 Vulkan 库后,我们需要查找并在系统中选择支持我们所需功能的显卡。几乎在Vulkan的每一次执行, 从绘图到上传纹理,任何事情都需要提交命令到队列。这样物理设备的选择以及队列族准备好以后,就可以创建逻辑设备了。
2025-08-18 12:30:52
186
转载 Vulkan笔记(三)-验证层
Vulkan验证层机制解析:通过VK_LAYER_KHRONOS_validation层实现调试功能,在非发布版本中默认启用。验证层通过检查参数合法性、追踪资源生命周期和线程安全等方式进行错误检测。实现过程包括:1)检查层可用性;2)创建实例时配置层参数;3)建立调试回调接口输出错误信息;4)通过vkCreateDebugUtilsMessengerEXT等扩展函数管理消息传递。验证层可将错误信息输出到标准错误流,开发者也可自定义回调处理。该机制有效降低了驱动程序开销,同时为开发阶段提供了必要的调试支持。
2025-08-12 14:40:38
143
转载 Vulkan笔记(二)-环境与绘制GLFW窗口
本文介绍了Vulkan开发环境的搭建和简单窗口创建方法。在Windows环境下需要安装Vulkan SDK、GLFW库和GLM数学库,并在Visual Studio中配置这些依赖项。文章展示了一个基本的Vulkan应用程序框架,包括初始化GLFW窗口、Vulkan环境的主循环流程。代码示例演示了如何创建不可调整大小的GLFW窗口并设置帧缓冲大小回调,以及通过mainLoop()函数实现基本的窗口事件处理循环。这些步骤为后续Vulkan图形渲染功能的实现奠定了基础。
2025-08-11 17:15:28
132
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅