<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[专注分享游戏引擎相关技术]]></title><description><![CDATA[欢迎来到我的技术博客，这里专注于C++编程、游戏开发、游戏引擎与计算机图形学的探讨与分享。在这里，你将找到关于如何在C++中实现高效的代码、如何设计和开发游戏引擎、以及深入浅出的图形学知识。我会定期发布实用的教程、技术文章和项目案例，帮助你在游戏开发的道路]]></description><link>https://blog.youkuaiyun.com/fuchenyang01</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; fuchenyang01]]></copyright><item><title><![CDATA[不只是在窗口里画一个三角形：Nullus 如何构建完整的实时 3D 创作链路]]></title><link>https://blog.youkuaiyun.com/fuchenyang01/article/details/164026584</link><guid>https://blog.youkuaiyun.com/fuchenyang01/article/details/164026584</guid><author>fuchenyang01</author><pubDate>Mon, 24 Aug 2026 16:33:32 +0800</pubDate><description><![CDATA[从显式 RHI、FrameGraph 和 HLSL 工作流，到资产数据库、反射、C# / Lua 脚本与可视化 Editor，了解 Nullus 正在解决什么问题。]]></description><category></category></item><item><title><![CDATA[std::atomic＜bool＞ 与 std::atomic_flag 的核心区别]]></title><link>https://blog.youkuaiyun.com/fuchenyang01/article/details/145902548</link><guid>https://blog.youkuaiyun.com/fuchenyang01/article/details/145902548</guid><author>fuchenyang01</author><pubDate>Thu, 27 Feb 2025 13:54:38 +0800</pubDate><description><![CDATA[都是用于原子操作的模板类型，但它们在实现、功能和使用场景上有显著差异。是 C++ 中唯一保证无锁的原子类型，其底层通常直接映射到硬件的原子指令（如 x86 的。是否无锁取决于编译器和目标平台。通常用于实现底层同步原语（如自旋锁）。在 C++ 多线程编程中，指令），无需依赖锁机制。]]></description><category></category></item><item><title><![CDATA[什么是指令重排（Reordering）]]></title><link>https://blog.youkuaiyun.com/fuchenyang01/article/details/145900685</link><guid>https://blog.youkuaiyun.com/fuchenyang01/article/details/145900685</guid><author>fuchenyang01</author><pubDate>Thu, 27 Feb 2025 12:26:02 +0800</pubDate><description><![CDATA[单线程中，重排不会改变程序逻辑；但多线程中，线程间交互的隐含顺序可能被破坏。]]></description><category></category></item><item><title><![CDATA[如何理解内存序]]></title><link>https://blog.youkuaiyun.com/fuchenyang01/article/details/145900667</link><guid>https://blog.youkuaiyun.com/fuchenyang01/article/details/145900667</guid><author>fuchenyang01</author><pubDate>Thu, 27 Feb 2025 12:24:11 +0800</pubDate><description><![CDATA[掌握内存序需要结合代码实践和分析工具（如ThreadSanitizer）。建议通过编写多线程代码并尝试不同内存序，观察其行为差异，逐步加深理解。理解内存序（Memory Order）是掌握多线程编程和原子操作的关键，尤其在涉及并发数据访问时。，确保不同线程对共享数据的操作按照预期执行，避免因编译器或硬件优化导致的数据不一致问题。C++11起定义了6种内存序]]></description><category></category></item><item><title><![CDATA[一篇看懂compare_exchange_weak和compare_exchange_strong的区别]]></title><link>https://blog.youkuaiyun.com/fuchenyang01/article/details/145900590</link><guid>https://blog.youkuaiyun.com/fuchenyang01/article/details/145900590</guid><author>fuchenyang01</author><pubDate>Thu, 27 Feb 2025 12:21:22 +0800</pubDate><description><![CDATA[通过这种方式，CAS 操作能够高效地协调多线程对共享资源的访问。]]></description><category></category></item><item><title><![CDATA[图形学系列教程，带你从零开始入门图形学（包含配套代码）—— 裁剪区域和模板缓冲区]]></title><link>https://blog.youkuaiyun.com/fuchenyang01/article/details/142261790</link><guid>https://blog.youkuaiyun.com/fuchenyang01/article/details/142261790</guid><author>fuchenyang01</author><pubDate>Sat, 14 Sep 2024 17:20:14 +0800</pubDate><description><![CDATA[在某些情况下，我们可能希望只渲染屏幕的一部分，将当前颜色缓冲区的其余部分屏蔽起来，防止其发生任何变化。在 OpenGL 中有两种方法可以做到这一点，即裁剪区域和模板缓冲区。本教程将解释如何在你的 OpenGL 应用程序中使用这两种方法。在完成这个简单的教程后，你应该对如何在游戏渲染中使用模板缓冲区和裁剪区域有了很好的了解。关于裁剪区域没有太多要说的了，但是模板缓冲区可能会更复杂一些——可以使用的掩码变量在模板缓冲区中添加多个模板区域；但现在你应该对模板缓冲区有足够的了解，可以在你的游戏中实现一些有趣的效果。]]></description><category></category></item><item><title><![CDATA[图形学系列教程，带你从零开始入门图形学（包含配套代码）—— 透明度和深度]]></title><link>https://blog.youkuaiyun.com/fuchenyang01/article/details/142210417</link><guid>https://blog.youkuaiyun.com/fuchenyang01/article/details/142210417</guid><author>fuchenyang01</author><pubDate>Fri, 13 Sep 2024 15:05:31 +0800</pubDate><description><![CDATA[在本教程中，你将了解 OpenGL 是如何确定场景中哪些物体在其他物体前面的——这可不像看起来那么容易！还会介绍 Alpha 混合，它能让我们 OpenGL 场景中的物体具有不同程度的透明度。随着你尝试使用 OpenGL 创建的场景变得更加复杂，你可能会希望某些物体出现在其他物体的前面。你可能还会希望某些物体是部分透明的，比如窗户或者水。要做到这些，你需要了解如何处理屏幕上一个像素的深度，以及如何处理它的 Alpha 值。]]></description><category></category></item><item><title><![CDATA[图形学系列教程，带你从零开始入门图形学（包含配套代码）—— 纹理映射]]></title><link>https://blog.youkuaiyun.com/fuchenyang01/article/details/142052003</link><guid>https://blog.youkuaiyun.com/fuchenyang01/article/details/142052003</guid><author>fuchenyang01</author><pubDate>Thu, 12 Sep 2024 15:41:11 +0800</pubDate><description><![CDATA[在本教程中，你将学习纹理映射，通过在你之前的教程中一直使用的三角形上执行一些纹理映射操作来实现。纹理映射是将图像应用到构成你的场景的多边形上的过程，以提高视觉真实感。OpenGL 为我们做了很多繁重的工作，但我们仍然必须手动配置我们图形硬件的纹理单元，以便获得我们想要的图形结果。如果编译成功，当你运行程序时，你应该在屏幕上看到一个带有纹理的三角形。你可以使用箭头键旋转纹理，并使用数字键 1 和 2 切换双线性过滤和纹理重复。恭喜！]]></description><category></category></item><item><title><![CDATA[图形学系列教程，带你从零开始入门图形学（包含配套代码）—— 视图矩阵 & 帧速率]]></title><link>https://blog.youkuaiyun.com/fuchenyang01/article/details/141953714</link><guid>https://blog.youkuaiyun.com/fuchenyang01/article/details/141953714</guid><author>fuchenyang01</author><pubDate>Fri, 06 Sep 2024 11:41:57 +0800</pubDate><description><![CDATA[现在你已经可以在世界空间中移动你的物体了，你可能也想知道如何移动你的视角。本教程将向你展示如何使用视图矩阵来做到这一点，并展示一个在 OpenGL 应用程序中使用的简单的“相机类”的示例。你还将看到如何以恒定的速度在你的场景中移动，而不管你的帧率是多少。在上一个教程中，你简单地了解了视图矩阵，它作为 OGLRenderer 类的一个成员变量和着色器的一个统一变量出现，但你并没有对它们做太多操作。在本课程中，你将学习如何操作视图矩阵，从而能够在你的场景中移动。]]></description><category></category></item><item><title><![CDATA[图形学系列教程，带你从零开始入门图形学（包含配套代码）—— 顶点变换]]></title><link>https://blog.youkuaiyun.com/fuchenyang01/article/details/141932290</link><guid>https://blog.youkuaiyun.com/fuchenyang01/article/details/141932290</guid><author>fuchenyang01</author><pubDate>Thu, 05 Sep 2024 16:43:35 +0800</pubDate><description><![CDATA[在上一节教程中，你学会了在屏幕上绘制三角形 - 现在你将学习如何使用平移、缩放和旋转矩阵来变换该三角形。你还将学习投影矩阵的知识，它可以给你渲染场景的深度感。在第一个教程中，我们直接在裁剪空间中渲染了一个三角形。作为入门介绍这没问题，但从长远来看并不是特别有用！在本节课中，你将学习如何使用顶点着色器，将顶点从它们的局部坐标空间，经过模型矩阵和投影矩阵，依次变换到世界空间，最后到裁剪空间。模型矩阵、投影矩阵以及之后会介绍的视图矩阵和纹理矩阵都是一种变换矩阵——用于操作齐次坐标的矩阵。齐次坐标有一个额外的坐标w]]></description><category></category></item><item><title><![CDATA[图形学系列教程，带你从零开始入门图形学（包含配套代码）—— 你的第一个三角形]]></title><link>https://blog.youkuaiyun.com/fuchenyang01/article/details/141867972</link><guid>https://blog.youkuaiyun.com/fuchenyang01/article/details/141867972</guid><author>fuchenyang01</author><pubDate>Thu, 05 Sep 2024 11:03:35 +0800</pubDate><description><![CDATA[一个三角形——听起来很无聊，是吧？嗯，确实很无聊！但是在屏幕上绘制一个三角形将教给你 OpenGL 的基础知识，并让你在进行更高级的图形渲染的道路上顺利前行。为了使用 OpenGL 编写图形程序，你需要知道如何处理三种不同类型的数据——顶点数据、纹理数据和着色器。我们将在后面的教程中处理纹理数据；现在我们将集中精力于如何处理顶点数据和着色器。OpenGL 提供了用于复制顶点数据和编译着色器的函数，但在以“面向对象”的方式处理此类数据方面提供的帮助很少——没有类结构来整洁地封装功能。]]></description><category></category></item><item><title><![CDATA[怎样用c++实现一个vector类]]></title><link>https://blog.youkuaiyun.com/fuchenyang01/article/details/141886563</link><guid>https://blog.youkuaiyun.com/fuchenyang01/article/details/141886563</guid><author>fuchenyang01</author><pubDate>Wed, 04 Sep 2024 10:41:43 +0800</pubDate><description><![CDATA[向量（Vector）就像动态数组一样，当插入或删除一个元素时，它能够自动调整自身大小，其存储由容器自动管理。vector中的元素被放置在连续的存储空间中，这样就可以使用迭代器来访问和遍历它们。在向量中，数据是在末尾插入的。在末尾插入的时间是不同的，因为有时候可能需要扩展数组。给定的任务是用 C++实现一个类，这个类的行为要和标准库中的 Vector 类一样。：它返回向量的大小，也就是向量中的元素个数。时间复杂度是 O(N)，其中 N 是向量的大小。下面是我们自己实现的 Vector 类的代码。]]></description><category></category></item><item><title><![CDATA[图形学系列教程，带你从零开始入门图形学（包含配套代码）—— 初探图形编程]]></title><link>https://blog.youkuaiyun.com/fuchenyang01/article/details/141856192</link><guid>https://blog.youkuaiyun.com/fuchenyang01/article/details/141856192</guid><author>fuchenyang01</author><pubDate>Tue, 03 Sep 2024 13:43:24 +0800</pubDate><description><![CDATA[本教程将向你介绍现代图形编程背后的概念，包括顶点数据是如何变成最终的像素化图像的。你将了解到可用于渲染图形的应用程序接口（API）、渲染过程中使用的数据类型，以及图形硬件是如何被编程的。不同于其他晦涩难懂的英文翻译产物，本教程将用通俗易懂的语言来带你入门图形学，并且每一章都有配套的练习代码，让你牢牢掌握学过的知识。]]></description><category></category></item><item><title><![CDATA[游戏引擎中的物理学 - 射线检测]]></title><link>https://blog.youkuaiyun.com/fuchenyang01/article/details/141817059</link><guid>https://blog.youkuaiyun.com/fuchenyang01/article/details/141817059</guid><author>fuchenyang01</author><pubDate>Mon, 02 Sep 2024 15:23:34 +0800</pubDate><description><![CDATA[在开发视频游戏时，一个常见的操作是确定从特定点是否可以看到或触摸到一个物体——在菜单屏幕上点击一个按钮，或者在即时战略游戏中点击一辆坦克就是这样的例子。有时我们可能希望确定一个 AI 单位从其当前位置是否能“看到”另一个玩家单位。虽然这些 AI 可见性检查和菜单鼠标点击在表面上看起来可能不太相似，但它们通常都是通过相同的过程实现的——光线投射。光线投射允许我们从世界中的特定点（无论是坦克的炮塔还是玩家的鼠标指针）发射无限细的光线，并查看它在途中与哪些物体碰撞。]]></description><category></category></item><item><title><![CDATA[游戏引擎中的物理学 - 线性运动]]></title><link>https://blog.youkuaiyun.com/fuchenyang01/article/details/141813322</link><guid>https://blog.youkuaiyun.com/fuchenyang01/article/details/141813322</guid><author>fuchenyang01</author><pubDate>Mon, 02 Sep 2024 11:40:35 +0800</pubDate><description><![CDATA[现代视频游戏中，可能会有数百个物体在屏幕上移动和互动，看起来非常逼真。这背后是一个物理引擎，它由一系列函数和类组成，用于模拟物体之间的复杂互动，使其在实时环境中表现得更为真实。物理引擎的核心有两个功能：首先，它必须让物体在受力的情况下以符合物理规律的方式移动；其次，它必须检测到物体之间的碰撞，并根据碰撞结果让物体做出相应的反应。在本文中，笔者将带你们学习如何实现真实的物体运动，并且了解如何在游戏模拟中加入加速度、速度和质量等概念。]]></description><category></category></item><item><title><![CDATA[Unity+QT， 如何把Unity打包出的exe嵌入QT程序中，并且使用Socket进行交互]]></title><link>https://blog.youkuaiyun.com/fuchenyang01/article/details/141719776</link><guid>https://blog.youkuaiyun.com/fuchenyang01/article/details/141719776</guid><author>fuchenyang01</author><pubDate>Fri, 30 Aug 2024 16:26:18 +0800</pubDate><description><![CDATA[本文详细介绍了如何通过 QT 服务器向 Unity VR 程序发送命令，以实现场景切换和游戏物体创建等交互功能。通过 UDP 进行通讯，您可以实现桌面和 VR 头盔之间的无缝互动，提升用户体验。如果您在实施过程中遇到问题或有其他需求，欢迎交流讨论。]]></description><category></category></item></channel></rss>