<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Lee notes]]></title><description><![CDATA[do one thing and do it well]]></description><link>https://blog.youkuaiyun.com/chengfenglee</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; chengfenglee]]></copyright><item><title><![CDATA[软件设计原则与模式本质总览]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/162671941</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/162671941</guid><author>chengfenglee</author><pubDate>Tue, 07 Jul 2026 18:36:13 +0800</pubDate><description><![CDATA[几乎所有模式都在回答同一个问题：哪一部分将来最可能变？怎样让「变」不影响「不变」？]]></description><category></category></item><item><title><![CDATA[VTK 策略模式详解：InteractorStyle、Mapper、Picker 与可替换算法]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/162671535</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/162671535</guid><author>chengfenglee</author><pubDate>Tue, 07 Jul 2026 18:01:47 +0800</pubDate><description><![CDATA[GoF策略模式定义一族算法，把它们封装起来，并且使它们可以互相替换。调用方依赖抽象接口，运行期换实现，而不是在业务代码里堆。VTK 没有一个叫维度Strategy 抽象Context 持有方典型切换 API交互绘制vtkMappervtkActorvtkVolume拾取或业务代码/ 局部使用（扩展）插值、坐标映射、体绘制后端等对应 Filter / Prop各模块SetXxx()本篇按交互 → 绘制 → 拾取 → 组合与其他模式展开；为什么是教科书级策略？]]></description><category></category></item><item><title><![CDATA[VTK 中的观察者模式与命令模式：机制、渲染链路与本质]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/162669631</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/162669631</guid><author>chengfenglee</author><pubDate>Tue, 07 Jul 2026 16:39:39 +0800</pubDate><description><![CDATA[很多人第一次读 VTK 文档时，会把「观察者模式」和「命令模式」当成两个独立话题。但 VTK 官方在的类注释里写得很直白：观察者模式谁订阅、谁广播、如何一对多通知；命令模式通知到了以后，具体执行什么逻辑，以及如何封装、替换、中断这条逻辑链。是观察者订阅；vtkCommand是命令对象；是事件广播。分开理解概念，结合理解 VTK。概念在 VTK 中的落点本质问题观察者模式vtkObject谁通知谁？命令模式通知后执行什么？责任链priorityAbortFlagGrabFocus谁优先处理。]]></description><category></category></item><item><title><![CDATA[VTK 交互系统详解：vtkRenderWindowInteractor 内部流程]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/162638872</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/162638872</guid><author>chengfenglee</author><pubDate>Mon, 06 Jul 2026 17:03:55 +0800</pubDate><description><![CDATA[在 VTK 可视化应用中，用户最常见的操作——缩放、平移、旋转、选择对象、退出程序——都依赖交互子系统完成。定义：几个关键类各司其职：交互风格可通过  随时切换，例如从轨迹球相机风格换成图像查看风格，而无需改动底层事件循环。教材强调，交互器使用 VTK 的 Command/Observer（命令/观察者）模式 来路由事件：这是整个交互体系的「枢纽」——平台差异在子类中被消化，上层代码只面对统一的 VTK 事件常量（如 、）。
 内部遍历观察者链，依次回调所有订阅了该事件的对]]></description><category></category></item><item><title><![CDATA[Python VTK Canny 边缘检测：从数学原理到代码实现]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/162453144</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/162453144</guid><author>chengfenglee</author><pubDate>Tue, 30 Jun 2026 14:44:21 +0800</pubDate><description><![CDATA[Canny 边缘检测通过高斯平滑 → 求梯度 → 非极大值抑制 → 双阈值 → 边缘跟踪五个阶段，在噪声环境下获得细、准、少的边缘。VTK 没有单一Canny→Gradient→Magnitude→→LinkEdgels→Threshold→→Stripper理解这条管线，既有助于掌握 Canny 原理，也便于在 VTK 中按需替换某一步（例如换成求梯度）做对比实验。]]></description><category></category></item><item><title><![CDATA[Python VTK Sobel 边缘检测：从数学原理到代码实现]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/162299635</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/162299635</guid><author>chengfenglee</author><pubDate>Thu, 25 Jun 2026 11:52:06 +0800</pubDate><description><![CDATA[层次要点数学边缘 ≈ 梯度模长极大；离散图像用差分近似导数SobelGxSy⊗DxGx​Sy​⊗Dx​，求导方向差分、垂直方向平滑合成VTK生产环境用；教学验证用手写核一阶导数 / 梯度是边缘检测的理论基础。离散差分对噪声敏感；Sobel 通过外积引入平滑，更稳定。Python VTK 中，即可完整实现 Sobel 梯度与边缘强度计算。]]></description><category></category></item><item><title><![CDATA[OpenGL Forward | Deferred | Forward+ 三条路径渲染实现对比]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/162207799</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/162207799</guid><author>chengfenglee</author><pubDate>Mon, 22 Jun 2026 17:06:24 +0800</pubDate><description><![CDATA[配套：Rendering_Paths_代码导读.md（零基础概念、模块地图、阅读路线）]]></description><category></category></item><item><title><![CDATA[OpenGL 抗锯齿对比 Demo：设计、实现]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/162041699</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/162041699</guid><author>chengfenglee</author><pubDate>Tue, 16 Jun 2026 17:27:24 +0800</pubDate><description><![CDATA[本 Demo 的价值在于用同一根 Scene Pass、四种 Post 路径，把 None / MSAA / FXAA / TAA 的差异拆到可测量、可切换、可逐行阅读的程度。MSAA 在画的时候多采样，FXAA 在画完之后修边缘，TAA 在多帧之间攒样本并用重投影对齐 history——其余代码都是为这三句话服务的工程细节。阅读时遇到新概念，可先查本文第 11 节问答或附录，再对照Anti_Aliasing_代码导读.md打开对应.cpp.frag文件。]]></description><category></category></item><item><title><![CDATA[OpenGL OIT 之 Depth Peeling 实现（下篇）：Shader 与关键代码实现]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/161692710</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/161692710</guid><author>chengfenglee</author><pubDate>Thu, 04 Jun 2026 16:56:41 +0800</pubDate><description><![CDATA[组成关键逻辑剥离 Shader— 用上一层的深度裁剪当前层混合 Shader极简——颜色传递，混合由完成最终合成— 累积颜色混合背景乒乓机制交替使用两个深度纹理提前终止查询 →→ break深度清除初始化0.0（最近），每层1.0（最远）]]></description><category></category></item><item><title><![CDATA[OpenGL OIT 之 Depth Peeling 实现（上篇）：原理与架构]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/161692695</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/161692695</guid><author>chengfenglee</author><pubDate>Thu, 04 Jun 2026 16:56:01 +0800</pubDate><description><![CDATA[在上一篇中，我们介绍了通过逐像素链表在 GPU 内部收集并排序所有透明片段的方法。Depth Peeling（深度剥离）是另一种经典的 OIT 方案，它不依赖 SSBO 和原子操作，而是通过多次渲染 Pass 逐层剥离来实现透明排序。Depth Peeling 的最大优势是兼容性极好——它只需要标准的深度测试和 FBO，不需要任何 OpenGL 4.3+ 的高级特性（SSBO、Image Texture、Atomic Counter）。但代价是渲染 Pass 数与场景深度复杂度成正比。逐层剥离。]]></description><category></category></item><item><title><![CDATA[OpenGL OIT 之 Stochastic Transparency 实现（下篇）：Shader 与关键代码实现]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/161692599</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/161692599</guid><author>chengfenglee</author><pubDate>Thu, 04 Jun 2026 16:52:21 +0800</pubDate><description><![CDATA[组成说明标准 MVP 变换，无特殊逻辑唯一核心：alpha → 随机样本掩码 →随机数经典 ShaderToy 随机frameID区分不同对象的随机种子，循环GL 状态渲染目标直接渲染到默认帧缓冲，无 FBOPass 数量1 个 PassStochastic Transparency 的代码量是三种 OIT 方案中最少的——核心 Shader 只有 26 行。它用概率论替代了精确排序，用 MSAA 硬件替代了手动混合，是"less is more"的典范。]]></description><category></category></item><item><title><![CDATA[OpenGL OIT 之 Stochastic Transparency 实现（上篇）：原理与架构]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/161692584</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/161692584</guid><author>chengfenglee</author><pubDate>Thu, 04 Jun 2026 16:51:41 +0800</pubDate><description><![CDATA[在前两篇中，我们分别介绍了（通过 GPU 端链表收集排序）和（通过多次 Pass 逐层剥离）。这两种方案都是确定性的——每个像素的最终颜色是精确计算的。用随机化替代排序。它不精确，但实现极其简单，只需要一个 Pass 和一个 Shader。用概率替代排序，用 MSAA 替代精确混合。：逐样本控制片段覆盖，用 alpha 值作为概率MSAA 硬件：自动将样本平均为最终颜色，无需手动混合单 Pass 渲染：所有对象在一个 Pass 中绘制，深度测试处理遮挡随机种子。]]></description><category></category></item><item><title><![CDATA[OpenGL OIT 之 Linked List 实现（下篇）：Shader 与渲染 Pass 代码实现]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/161692381</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/161692381</guid><author>chengfenglee</author><pubDate>Thu, 04 Jun 2026 16:43:34 +0800</pubDate><description><![CDATA[│ 共享opaqueFBO写入不透明物体的颜色和深度写入透明物体的颜色，但共享不透明物体的深度纹理这样 Pass 2 中透明物体的深度测试会比较不透明物体的深度，被遮挡的透明片段被正确丢弃同时确保透明物体不会污染共享的深度缓冲文件核心功能头插法将透明片段插入逐像素链表，使用分配节点 ID，原子更新头指针遍历链表 → 去重 → 插入排序 → Back-to-Front over 混合标准 Blinn-Phong 光照计算不透明物体。]]></description><category></category></item><item><title><![CDATA[OpenGL OIT 之 Linked List 实现（上篇）：原理、流程与缓冲区设计]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/161692354</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/161692354</guid><author>chengfenglee</author><pubDate>Thu, 04 Jun 2026 16:42:48 +0800</pubDate><description><![CDATA[在 OpenGL 渲染中，透明物体一直是一个棘手的问题。传统的 alpha 混合要求物体从远到近排序绘制，但实际场景中物体之间可能有穿插、包含关系，无法简单地按距离排序。更糟糕的是，随着视角旋转，物体的远近关系会动态变化，每帧都要重新排序——这在 CPU 侧代价高昂且容易出错。OIT（Order-Independent Transparency，与顺序无关的透明度）就是为了解决这个问题而生的。基于逐像素链表的 OIT（Linked List OIT）。]]></description><category></category></item><item><title><![CDATA[OpenGL MSAA + 随机 Sample Mask 实现无序半透明渲染]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/161624937</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/161624937</guid><author>chengfenglee</author><pubDate>Tue, 02 Jun 2026 14:56:13 +0800</pubDate><description><![CDATA[传统半透明需要按深度排序再 Alpha 混合。本文说明一种无需排序——在 MSAA 的每个子采样上按纹理 Alpha「掷骰子」，用决定写入哪些子采样，再配合子采样级深度测试，最后由硬件Resolve平均得到屏幕像素。下文聚焦原理、关键着色器实现，以及本项目中里五行 OpenGL 状态在何时、何阶段起作用。问题答案原理是什么？Alpha = 子采样保留概率；mask + 深度 + Resolve关键代码在哪？quad.frag中循环五行 GL 状态何时设？init()一次，作用于之后每帧整条管线。]]></description><category></category></item><item><title><![CDATA[OpenGL 深度剥离 OIT关键技术、关键流程详解及实现]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/161397321</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/161397321</guid><author>chengfenglee</author><pubDate>Mon, 25 May 2026 17:34:03 +0800</pubDate><description><![CDATA[全流程、discard与深度测试分工、、Blend 阶段 GL 状态、fboPeel_颜色/深度角色、在管线中的位置、、层数上限等。]]></description><category></category></item><item><title><![CDATA[OpenGL 中为什么 RBO 不能被着色器采样]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/161228642</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/161228642</guid><author>chengfenglee</author><pubDate>Tue, 19 May 2026 16:46:08 +0800</pubDate><description><![CDATA[RBO 缺少纹理所需的采样状态（过滤、包裹、mipmap），且无法绑定到纹理单元，所以着色器无从知道「怎么去读这块内存」。它是为。]]></description><category></category></item><item><title><![CDATA[CMake / Make / Ninja / MSVC / GCC / Clang / MSBuild —— 完整体系化理解]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/161196624</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/161196624</guid><author>chengfenglee</author><pubDate>Mon, 18 May 2026 15:57:38 +0800</pubDate><description><![CDATA[CMake 是指挥者，Make/Ninja 是执行者，MSVC/GCC/Clang 是工具。CMake 生成构建系统，Ninja 执行构建，MSVC 编译代码。VSCode 下最佳组合：CMake + Ninja + MSVC。]]></description><category></category></item><item><title><![CDATA[VSCode + CMake + C++：配置文件体系完整说明]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/161195253</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/161195253</guid><author>chengfenglee</author><pubDate>Mon, 18 May 2026 15:04:05 +0800</pubDate><description><![CDATA[CMakePresets.json ←——— 定义如何配置/构建（Ninja + Debug/Release）↓tasks.json ——→ VSCode 调用 CMakePresets 构建↓launch.json ——→ 调试 CMake 构建出的 exe↓settings.json ——→ 控制 VSCode 的 CMake 行为。]]></description><category></category></item><item><title><![CDATA[OpenGL 调试方式详解]]></title><link>https://blog.youkuaiyun.com/chengfenglee/article/details/161115392</link><guid>https://blog.youkuaiyun.com/chengfenglee/article/details/161115392</guid><author>chengfenglee</author><pubDate>Fri, 15 May 2026 15:19:47 +0800</pubDate><description><![CDATA[glGetError。]]></description><category></category></item></channel></rss>