- 博客(182)
- 收藏
- 关注
原创 CS2压枪练习工具开源分享|告别手忙脚乱,轻松掌握AK压枪
玩CS2的都知道,AK47的压枪是每个玩家必须掌握的基本功。但是手动练习压枪曲线太枯燥了,而且很难直观地感受到每次射击的偏移量。于是我就想,能不能做一个辅助工具,让玩家在练习时能够:1. 专注于准星放置和走位2. 通过肌肉记忆感受正确的压枪节奏3. 快速熟悉各种武器的后坐力模式
2026-06-17 10:46:07
188
原创 nvpro_core2 详解:NVIDIA Vulkan / OpenGL 图形样例背后的现代 C++ 基础库
nvpro_core2 是 NVIDIA nvpro-samples 组织下的现代图形开发基础库。它面向 Vulkan 1.4+ 和 OpenGL 4.6,主要用于支撑 NVIDIA 官方图形样例、实时渲染实验以及高性能图形研究项目。
2026-06-08 21:28:04
190
原创 Vulkan Swapchain 通俗入门:渲染结果是怎么显示到屏幕上的?
在 Vulkan 中,Swapchain可以理解为:一组用来显示画面的图像。GPU 渲染出来的画面,并不是直接显示到屏幕上的,而是先画到一张图像里,然后再把这张图像交给窗口系统显示。这个“管理多张显示图像”的东西,就是 Swapchain。GPU 渲染画面↓写入 Swapchain 图像↓提交给窗口系统↓显示到屏幕Swapchain 是 Vulkan 中负责“把画面显示到屏幕上”的核心机制。
2026-06-08 19:11:35
357
原创 Vulkan 图像系统核心概念解析:VkImage、VkImageView、VkSampler、VkDeviceMemory 与 VkImageLayout
Vulkan中图像资源由五个关键对象组成
2026-06-08 15:28:56
566
原创 Vulkan 离屏渲染详解:从 Framebuffer 到后处理、阴影贴图与 Render Texture
本文系统介绍了Vulkan中的离屏渲染技术。离屏渲染指将渲染结果写入自定义VkImage而非交换链图像,是实现高级渲染效果的基础。文章详细阐述了离屏渲染的核心概念、应用场景(后处理、阴影贴图、G-Buffer等)及实现流程,包括图像创建、RenderPass配置、布局转换和同步机制。重点分析了颜色/深度附件创建、多RenderTarget管理,以及Vulkan 1.3 Dynamic Rendering的优化方案。文中还总结了常见错误排查方法和工程实践建议,强调正确的图像用途声明、布局管理和同步控制是离屏渲
2026-06-08 11:31:42
325
原创 Vulkan 示例解析:texture.cpp 如何加载 KTX 纹理并在 Shader 中采样
该示例演示了Vulkan中2D纹理的基本使用流程,包括从磁盘加载KTX格式纹理、创建GPU资源对象、设置采样参数并最终在片段着色器中采样。
2026-06-05 16:06:02
296
原创 Vulkan Texture 纹理系统详解:从 VkImage 到 Shader 采样的完整路径
Vulkan中的纹理系统是一个复杂的资源协作体系,不同于其他图形API的简单Texture对象。它由多个组件构成:VkImage存储图像数据,VkDeviceMemory管理显存,VkImageView提供访问视图,VkSampler定义采样规则,通过DescriptorSet绑定到Shader。
2026-06-05 14:46:40
292
原创 Specialization constants演示了 Vulkan 的 shader specialization constants
本文介绍了一个使用Vulkan specialization constants的示例项目,通过同一份fragment shader代码实现三种不同的光照效果(Phong、Toon卡通和纹理光照)。项目展示了如何在pipeline创建时传入不同的常量值,从而生成行为各异但共享大部分状态的管线。关键点包括:specialization constants与uniform/push constant的区别、C++代码结构、初始化流程和资源加载方式。
2026-06-05 14:30:56
366
原创 Vulkan Specialization Constants 详解:在“运行时配置”和“编译期优化”之间取得平衡
Vulkan中的Specialization Constants是一种介于编译期常量和运行时变量之间的机制,它允许在Shader编译后、Pipeline创建前注入具体值,使驱动能基于这些值进行静态优化。
2026-06-05 13:46:33
364
原创 Vulkan 示例解析:pushconstants.cpp 如何用 Push Constants 传递每个物体的小数据
本文解析了 Vulkan 示例 pushconstants.cpp,展示如何使用 Push Constants 高效传递 shader 数据。Push Constants 适用于高频更新、与 draw call 强关联的小数据(如对象颜色、位置等),无需创建 descriptor set。示例通过一个 uniform buffer 共享投影/视图矩阵,同时为 16 个球体分别推送 32 字节的位置和颜色数据,每次绘制前调用 vkCmdPushConstants 更新。
2026-06-05 11:03:53
358
原创 Vulkan Push Constants 详解:小数据高速传递机制与工程实践
Vulkan中PushConstants是一种高效的轻量级数据传递机制,可直接通过命令缓冲区将少量数据推送给Shader,无需创建Buffer或DescriptorSet。它适合传递高频变化的小数据(如模型矩阵、对象ID等),但容量有限(通常不超过128字节)。
2026-06-04 21:44:40
127
原创 Vulkan Dynamic Uniform Buffers 详解:从普通 UBO 到动态偏移的工程实践
本文详细介绍了Vulkan中的Dynamic Uniform Buffer技术。该技术通过将多个对象的Uniform数据存储在一个大Buffer中,绘制时通过动态偏移量选择特定数据段,从而减少资源数量和绑定开销。文章从普通Uniform Buffer的局限性出发,阐述了Dynamic Uniform Buffer的工作原理、对齐要求、实现步骤和常见错误,并与Push Constants和Storage Buffer进行了对比。
2026-06-04 21:03:33
281
原创 Vulkan 示例解析:dynamicuniformbuffer.cpp 如何用 Dynamic Uniform Buffer 批量绘制对象
这个示例展示了Vulkan中动态统一缓冲区的高效使用方法,通过单个大缓冲区存储多个对象的变换矩阵,避免为每个对象单独创建缓冲区和描述符集。
2026-06-04 19:55:37
301
原创 Vulkan 示例解析:descriptorsets.cpp 如何用 Descriptor Set 给不同物体绑定不同资源
本文分析了Vulkan示例descriptorsets.cpp的核心内容。该示例演示了如何使用描述符集(descriptor set)将CPU侧的buffer、image等资源绑定到shader中使用。
2026-06-04 19:03:57
286
原创 Vulkan 基础全面入门:从第一张三角形到完整渲染引擎
Vulkan 并不是一个“帮你自动管理渲染状态”的图形 API,而是一个“把 GPU 控制权尽可能交还给程序员”的现代底层图形与计算 API。
2026-06-04 16:18:43
350
原创 Vulkan 基础全景解析:从 Pipeline、Descriptor Set 到 Texture 与 glTF 模型加载
因为 Vulkan 并不是一个“帮你自动管理渲染状态”的图形 API,而是一个“把 GPU 控制权尽可能交还给程序员”的现代底层图形与计算 API。
2026-06-04 15:29:26
328
原创 Vulkan 中的 Pipeline 全面解析:从图形管线到工程实践
Pipeline 可以理解为 GPU 执行一次绘制或计算任务时所需要的一整套“执行配置”。它不仅包含 Shader,还包含大量固定功能阶段状态,例如顶点输入、图元装配、光栅化、深度测试、模板测试、混合状态等。
2026-06-04 14:03:29
306
原创 Vulkan 示例解析:pipelines.cpp 如何在一个 Render Pass 中切换多条 Graphics Pipeline
在 Vulkan 中,如果两个物体使用了不同的 shader,通常意味着它们需要不同的 graphics pipeline。如果两个物体使用了不同的 polygon mode,例如一个填充绘制、一个线框绘制,也通常意味着它们需要不同的 graphics pipeline。
2026-06-03 20:51:28
153
原创 Vulkan 示例解析:gltfskinning.cpp 如何实现 glTF 骨骼蒙皮动画
本文分析了一个基于Vulkan实现的glTF骨骼蒙皮动画示例gltfskinning.cpp。该示例在静态模型加载基础上,展示了如何使用glTF的骨骼动画数据,包括皮肤(skin)、关节(joint)、逆绑定矩阵(inverseBindMatrices)等核心概念。通过将关节索引(JOINTS_0)和权重(WEIGHTS_0)作为顶点属性传入着色器,配合SSBO传输关节变换矩阵,在顶点着色器中实现骨骼变形计算。
2026-06-03 18:23:35
294
原创 Vulkan 示例解析:gltfscenerendering.cpp 如何渲染一个复杂 glTF 场景
本文分析了Vulkan示例gltfscenerendering.cpp,它通过加载Crytek Sponza场景展示了复杂glTF渲染的关键技术。相比基础模型加载示例,该实现新增了切线空间法线贴图、多材质管线管理、alpha遮罩和双面渲染等功能。核心改进包括:顶点结构增加tangent数据支持法线贴图;材质系统扩展支持法线贴图、透明度模式等属性;=
2026-06-03 17:26:19
290
原创 Vulkan 中 Shader 的 vert、frag、mesh、comp 全面解析:作用、关系、特点与工程实践
本文系统介绍了Vulkan渲染系统中四类核心Shader的作用与关系。VertexShader(.vert)是传统图形管线的几何入口,负责顶点变换和属性传递;FragmentShader(.frag)处理片元着色,实现材质和光照计算;MeshShader(.mesh)作为现代几何阶段,以workgroup方式生成顶点和图元;ComputeShader(.comp)则独立于图形管线,执行通用GPU计算。
2026-06-03 17:04:41
986
原创 Vulkan 中 Vertex Shader 与 Fragment Shader 的作用、关系与工程实践解析
本文深入解析了Vulkan图形渲染中Vertex Shader(.vert)和Fragment Shader(.frag)的核心作用与区别。Vertex Shader负责顶点坐标变换(模型空间→裁剪空间)和顶点属性传递,必须输出gl_Position;Fragment Shader则处理光栅化后的片元着色,计算颜色、光照等表面属性。
2026-06-03 16:35:41
346
原创 Vulkan 示例解析:gltfloading.cpp 如何加载并渲染一个 glTF 场景
本文分析了 gltfloading.cpp 示例代码,该代码演示了如何通过 tinyglTF 加载 glTF 2.0 模型(FlightHelmet.gltf)并转换为 Vulkan 可渲染资源。
2026-06-03 14:41:32
228
原创 Vulkan 示例解析:triangle_light.cpp 如何用更少代码画出三角形
本文分析了一个精简版的Vulkan示例程序triangle_light.cpp,它基于Sascha Willems的示例框架,专注于展示绘制索引三角形所需的核心逻辑。相比原版triangle.cpp(手动处理命令池、缓冲区、同步对象等底层细节),该版本复用框架已有功能,代码量大幅减少。
2026-06-03 12:37:11
363
原创 Vulkan 示例解析:triangle.cpp 如何把一个三角形渲染到窗口上
本文分析 Sascha Willems 的 Vulkan 示例项目中的基础三角形绘制案例 triangle.cpp。该案例完整展示了 Vulkan 图形渲染的核心流程,包括初始化、资源创建、命令录制和图像呈现等关键步骤。文章详细解析了案例中的核心概念:swapchain、framebuffer、render pass、graphics pipeline、顶点/索引缓冲、uniform缓冲、命令缓冲以及同步对象等。
2026-06-02 16:45:05
346
原创 LeetCode Hot 100 知识点总结与算法指南
这篇文章总结了LeetCode Hot 100题单中的核心知识点与算法技巧,适合准备面试的程序员、算法竞赛入门者和计算机科学学生。
2026-06-01 15:24:26
615
原创 爬楼梯 —— 从动态规划到斐波那契数列
文章首先通过列举小规模案例(1-6阶)发现其解符合斐波那契数列规律,然后推导出关键的状态转移方程f(n)=f(n-1)+f(n-2),详细解释了该方程的含义。接着给出了完整的动态规划实现代码,并演示了空间优化为O(1)的滚动数组解法。最后指出这道入门题包含了动态规划的核心思想:最优子结构、重叠子问题和状态转移,是学习更复杂DP问题的重要基础。
2026-06-01 12:42:19
176
原创 编辑距离(Edit Distance)——从字符串相似度到动态规划经典模型
Levenshtein距离(编辑距离)是衡量两个字符串相似度的经典算法,由Vladimir Levenshtein于1965年提出。它通过计算将一个字符串转换为另一个所需的最少操作次数(插入、删除、替换)来评估相似性。该问题可通过动态规划高效解决,建立二维状态表,根据字符匹配情况分类处理。算法广泛应用于拼写检查、搜索引擎纠错、DNA序列比对等场景,时间复杂度O(mn),空间可优化至O(n)。编辑距离与LCS等算法共同构成字符串处理的基础,在NLP和生物信息学领域具有重要价值。
2026-06-01 11:37:04
362
原创 不同的二叉搜索树:从动态规划到卡特兰数
题目要求统计用1~n个节点能构造多少种不同的二叉搜索树(BST)。核心思路是利用动态规划,定义dp[i]表示i个节点的BST数量。根据BST性质,选定根节点i后,左右子树结构独立,方案数为dp[i-1] * dp[n-i]。递推式为dp[n] = Σ dp[i-1] * dp[n-i](i从1到n),初始条件dp[0]=1(空树)和dp[1]=1。该递推式实为卡特兰数,通项公式为C(n) = (1/(n+1)) * C(2n,n)。
2026-05-29 14:00:49
332
原创 二叉树基础详解:TreeNode、buildTree、deleteTree 与 printTree 的实现原理(C++)
本文系统讲解了二叉树的核心基础模块,包括节点结构设计、构建、遍历和内存管理。重点介绍了TreeNode的结构设计(val、left、right指针),使用队列进行层序建树(buildTree),后序遍历释放内存(deleteTree),以及层序打印(printTree)等方法。文章还分析了递归思想在求最大深度(maxDepth)等操作中的应用,强调理解树结构和递归的重要性。通过完整C++示例,展示了二叉树的基本操作和经典算法思想(BFS、DFS),为LeetCode刷题和实际开发打下坚实基础。
2026-05-28 15:40:51
1009
原创 任务调度器:从贪心模拟到数学公式优化
本文分析了LeetCode621任务调度器问题,提出了一种基于贪心算法的数学公式解法。通过统计任务频率,找出最高频任务的出现次数(maxFreq)和达到该频率的任务种类数(maxCount),利用公式(maxFreq-1)*(n+1)+maxCount计算最短时间框架,并与任务总数取最大值作为最终答案。该方法避免了复杂的模拟过程,时间复杂度为O(m),空间复杂度为O(1)。文章通过多个示例验证了公式的正确性,并与模拟法进行了对比,指出公式法更简洁高效。
2026-05-27 20:59:23
388
原创 二叉树展开为链表:从先序遍历到原地指针重排
将二叉树原地展开为单链表,链表顺序需与先序遍历一致。本文分析了三种解法:1)先序遍历保存节点法(O(n)空间);2)递归反向构造法(O(h)空间);3)最优的原地指针重排法(O(1)空间)。核心思路是:对每个节点,若存在左子树,则找到其最右节点,将原右子树接在此节点后,再将左子树移到右边。该方法通过指针重排实现O(1)空间复杂度,满足题目进阶要求,是解决二叉树原地展开问题的推荐方案。
2026-05-27 20:35:16
417
原创 单词搜索:二维网格中的 DFS 回溯与剪枝优化
本文分析了LeetCode79「单词搜索」问题的解题思路。题目要求在m×n字符网格中搜索是否存在构成给定单词的路径,路径需满足相邻字符相连且不重复使用单元格。核心解法采用DFS+回溯算法:从每个起点出发,递归搜索四个方向,使用原地标记避免重复访问,并在回溯时恢复现场。优化策略包括:长度剪枝、字符频率统计和起点方向优化(从稀有字符端开始搜索)。时间复杂度为O(mn3^L),空间复杂度O(L)。
2026-05-27 20:05:52
403
原创 从有序链表合并看链表算法的指针设计:LeetCode 21「合并两个有序链表」深度解析
本文系统讲解了合并两个有序链表的经典算法问题。通过双指针法和虚拟头节点技巧,实现了O(n)时间复杂度的迭代解法,同时分析了递归解法的实现思路。文章详细解析了代码执行过程、复杂度分析、常见错误及解决方案,并比较了迭代与递归的优缺点。该问题不仅是链表基础操作的重要练习,更为后续学习合并K个链表、链表排序等高级问题奠定基础。核心在于利用链表已有序的特性,通过指针重新连接节点而非创建新节点,体现了链表操作的精髓。
2026-05-26 16:48:56
434
原创 下一个排列:从字典序到原地算法的完整推导
「下一个排列」问题要求在给定整数数组中,找到字典序中刚好比当前排列大的下一个排列。若已是最大排列,则返回最小排列。核心算法分为三步:1) 从右向左找到第一个升序位置i;2) 在右侧找到最小的大于nums[i]的数并交换;3) 反转i后的后缀使其升序,确保增幅最小。该算法时间复杂度为O(n),空间复杂度O(1),满足原地修改要求。
2026-05-26 14:38:14
412
原创 二分查找:一种经典的 O(log n) 高效搜索算法
本文系统讲解了二分查找算法及其应用。首先介绍了二分查找的核心思想:在有序数组中通过中间值比较快速缩小搜索范围,时间复杂度为O(logn)。然后以"查找元素的第一个和最后一个位置"为例,详细分析了如何改造普通二分查找来寻找目标值的左右边界。文章提供了完整的代码实现,重点讲解了边界处理的关键点:寻找左边界时继续向左搜索,寻找右边界时继续向右搜索。最后总结了二分查找的适用条件、常见错误和重要性,强调其作为基础算法在解决有序数组相关问题中的关键作用。
2026-05-25 14:55:13
420
原创 回溯算法:在状态空间树中进行有约束的深度优先搜索
回溯算法是一种通过逐步尝试构建候选解,并在发现无效选择时撤销回溯的搜索方法。其核心框架包括路径记录、选择列表和约束条件判断,通过深度优先搜索遍历状态空间树。算法关键点在于:1)使用path保存当前组合;2)动态更新target表示剩余目标值;3)通过start参数控制搜索起点避免重复组合。在组合总和问题中,递归时传入i而非i+1允许数字重复使用,而排序后的剪枝优化能显著提升效率。回溯算法虽时间复杂度较高,但能系统枚举所有解,是解决组合、排列等问题的经典范式。
2026-05-25 13:39:36
591
原创 「接雨水」问题的算法建模与双指针优化分析
「接雨水」是数组与双指针领域中的经典问题,也是算法面试中高频出现的一类边界约束问题。题目给定一个长度为 n 的非负整数数组 height,其中 height[i] 表示第 i 个位置上宽度为 1 的柱子高度。要求计算在这些柱子构成的地形中,降雨后能够存储的雨水总量。
2026-05-25 12:49:34
472
原创 旋转图像:从矩阵转置、镜像到坐标变换的系统理解
本文详细解析了LeetCode48题"旋转图像"的解题思路。题目要求将n×n矩阵原地顺时针旋转90度,核心在于理解坐标变换公式:(i,j)→(j,n-1-i)。文章提出了两种经典解法:1)先转置再水平镜像;2)先垂直镜像再转置。同时分析了不同旋转角度(180度、逆时针90度)的变换规律,并给出了完整的C++实现代码。重点强调了矩阵变换的顺序性和原地操作的空间复杂度优势(O(1)),帮助读者从坐标映射的本质理解矩阵旋转问题。
2026-05-22 17:06:04
341
原创 Backtracking 回溯算法
本文详细讲解了回溯算法在生成合法括号组合中的应用。回溯算法通过递归尝试所有可能选择,在发现路径不合法时撤销选择并尝试其他路径。对于生成n对括号问题,算法通过两个关键限制确保合法性:左括号不超过n个,右括号不超过左括号数量。代码通过push_back()和pop_back()实现选择与撤销选择,体现了回溯的核心思想。文章还分析了递归过程、时间复杂度和空间复杂度,并总结了回溯算法的通用模板,强调"做选择-递归-撤销选择"这一核心结构。掌握这种回溯思路对解决排列、组合、子集等问题具有重要意义。
2026-05-22 16:44:21
379
工业异常检测中的多模态大语言模型实战-基于腾讯混元 Hunyuan-Vision 的 MMAD 数据集评测全记录
2025-12-12
从语义到推荐:大语言模型(LLM)如何驱动智能选车系统?
2025-06-21
弗雷德里克 运筹学导论 英文答案Instructor's Solutions Manual
2024-11-01
源码数据可视化:基于 Echarts + Python 实现的动态实时大屏范例-运动健康
2024-11-01
Python基础教程:解释器安装与IDE配置及文件操作
2024-09-30
工业机器人编程与操作-搬运机器人码垛系统编程与仿真
2023-06-22
ABB工业机器人实操与应用技巧第二版
2023-05-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅