<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Siro_sama的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Siro_sama</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Siro_sama]]></copyright><item><title><![CDATA[【OpenGL】OpenGL游戏案例(二)]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/145406802</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/145406802</guid><author>Siro_sama</author><pubDate>Fri, 31 Jan 2025 18:08:41 +0800</pubDate><description><![CDATA[文本渲染部分依赖于一个库FreeType，在项目中只拿来读取ttf生成像素数据，然后记录在自定义的Character结构中。Destroyed决定是否要渲染其图像，Activated决定是否要启用其计时器，最后的状态则决定了是否要将其移除出列表。构造函数中负责初始化shader参数，初始化VAO和VBO，但VBO的具体顶点数据会在绘制时动态计算出来。刚碰撞时根据Type字段执行附加能力的逻辑，倒计时结束后执行取消附加能力的逻辑。当玩家消灭一个方块后，按固定概率随机生成或不生成一个随机能力的砖块。]]></description><category></category></item><item><title><![CDATA[【OpenGL】OpenGL游戏案例(一)]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/145288084</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/145288084</guid><author>Siro_sama</author><pubDate>Tue, 21 Jan 2025 17:57:38 +0800</pubDate><description><![CDATA[这个构造函数主要用于设置一个后处理器，它通过创建多个OpenGL对象（FBO、MSFBO、RBO、纹理）来实现图像的多重采样渲染、后期处理效果（如模糊、边缘检测等）。它还设置了相关的着色器参数，并为后期处理操作初始化了相关的渲染数据。]]></description><category></category></item><item><title><![CDATA[【OpenGL/Assimp】渲染模型、半透明材质与封装光源]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/145091506</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/145091506</guid><author>Siro_sama</author><pubDate>Sun, 12 Jan 2025 12:17:26 +0800</pubDate><description><![CDATA[我所需要绘制的模型有半透明的面部贴图，因此需要使用透明度，这里需要注意的是，如果所有使用数据获取数据的地方都没有出错但仍没有透明效果，可以检查原始数据的问题，如图片本身的透明效果，在工程中加载图片时是否包含透明通道。从GitHub拉取源码，根据网络教程，借助CMake生成VS工程项目，并用VS将其编译为静态链接库（lib）或动态链接库（dll + lib）。在抽象Model，Mesh这些类时，我改动LearnOpenGL的最大的类是Mesh类，将其直接使用的GLAPI替换成了封装好的API，类如下。]]></description><category></category></item><item><title><![CDATA[【OpenGL】三种光源方式的计算]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/145041451</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/145041451</guid><author>Siro_sama</author><pubDate>Thu, 09 Jan 2025 20:05:29 +0800</pubDate><description><![CDATA[使用Ambient（环境光），Diffuse（漫反射），Specular（高光）三种颜色混合出最终光照效果。典型的GLSL Fragment 示例代码如下//片元的位置和法向，由顶点着色器传入（已经过插值）//CPU端赋值//灯光和视角位置//灯光和物体颜色// Ambient//较暗的灯光颜色模拟环境光// Diffuse//片元指向灯光的向量//通过夹角决定漫反射亮度（0~1）//片元指向摄像机的向量//入射光线在法线为norm的平面上的出射光线向量。]]></description><category></category></item><item><title><![CDATA[【OpenGL/C++】面向对象扩展——测试环境]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/145040462</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/145040462</guid><author>Siro_sama</author><pubDate>Thu, 09 Jan 2025 19:13:00 +0800</pubDate><description><![CDATA[封装的功能：注意事项：
RunBase继承类展示：
LearnOpenGL的教程示例，十个箱子在固定位置旋转，并有各自的贴图，在制作了RunBase类后，使用时只需要专注于教程和测试的图形学部分。无需重复复制和束缚在其他C++代码上。
Main函数内容（使用示例）：
在制作该类前，我一直直接通过使用全局的函数名来调用不同的渲染代码，后来在使用glfw的按键绑定相关代码时出现了重定义的错误，后来想直接把这些东西放在类里，最后干脆再封装一下渲染流程，最后就成了这个RunBase类。]]></description><category></category></item><item><title><![CDATA[【C++/OpenGL】OpenGL面向对象]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/144997235</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/144997235</guid><author>Siro_sama</author><pubDate>Wed, 08 Jan 2025 01:22:44 +0800</pubDate><description><![CDATA[AddBuffer：传入缓存区和缓存区布局，根据缓存布局对象内部存储的数据，调用glEnableVertexAttribArray和glVertexAttribPointer来进行实际的布局指定。创建绑定纹理对象，设定默认参数，将纹理填入该纹理对象（通过glBindTexture和m_RendererID指定）中。Push：泛型函数，向m_Elements推入一个对象，向m_Stride累加大小。Renderer负责在渲染循环中调用，使用固定的渲染顺序，简化外部使用。]]></description><category></category></item><item><title><![CDATA[【Unity/HFSM】使用UnityHFSM实现输入缓冲（预输入）和打断机制]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/144515313</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/144515313</guid><author>Siro_sama</author><pubDate>Mon, 16 Dec 2024 18:41:06 +0800</pubDate><description><![CDATA[参考Animancer在状态机中的InputBuffer，在UnityHFSM中实现类似的InputBuffer机制，同时扩展一个状态打断机制插件介绍：Animancer：Unity的动画插件，易于修改和扩展。UnityHFSM：Github上的一个开源分层状态机项目基于继承的方法使用UnityHFSM：UnityHFSM有非常方便的使用方法，可以在不创建新类的情况下创建状态和状态机，定义转换条件等，但如果状态逻辑比较复杂，并且有统一的父级行为，则建议使用类继承的方式定义状态和状态机类。]]></description><category></category></item><item><title><![CDATA[【算法速刷(11/100)】LeetCode —— 101. 对称二叉树]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/143927983</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/143927983</guid><author>Siro_sama</author><pubDate>Wed, 20 Nov 2024 23:21:32 +0800</pubDate><description><![CDATA[如果使用递归思想，这道题则十分的好写。本题最重要的是如何同时比较两个镜像位置上的节点，并继续向下比较其镜像位置上的子节点，基于这点，我们至少知道递归的函数需要一左一右两个指针。并且比较当前镜像节点是否相同后继续向下递归，否则返回结果。来进行递归的查询二叉树镜像位置上的节点。]]></description><category></category></item><item><title><![CDATA[【C++/OpenGL】OpenGL初步学习——绘制一个矩形]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/143927873</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/143927873</guid><author>Siro_sama</author><pubDate>Wed, 20 Nov 2024 23:13:30 +0800</pubDate><description><![CDATA[最近在学点图形学，之前只是知道渲染管线，和一些图形学大概的知识，实际上对于Shader的编写经验几乎为0。因此打算开始学学OpenGL。毕竟听说这个比较底层，虽然工作肯定是写HLSL或者Unity的ShaderLab，但对于学习图形学想必还是很有用的，网上的相关资料和教程也是相当之丰富。

最近学的基本上都可以用一个文件写下来，之后开始学对这些流程的抽象，因此现在先对写下的文件进行一个总结

使用的库为GLFW + GLEW 的经典款搭配。]]></description><category></category></item><item><title><![CDATA[【算法速刷(10/100)】LeetCode —— 23. 合并 K 个升序链表]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/143823812</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/143823812</guid><author>Siro_sama</author><pubDate>Sat, 16 Nov 2024 21:38:05 +0800</pubDate><description><![CDATA[按照最朴素的方法，每轮都对所给列表进行一次遍历，O(n)的复杂度获得值最小的节点，并将其上的链表指针后移一位，一旦为空则剔除数组。数组为空时结束循环。这样写时间复杂度较高，因为涉及到枚举最小值节点，数组的删除操作，但空间复杂度可以降到O(1)]]></description><category></category></item><item><title><![CDATA[【Unity/Animator动画系统】多层动画状态机实现角色的基本移动]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/143820356</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/143820356</guid><author>Siro_sama</author><pubDate>Sat, 16 Nov 2024 17:33:27 +0800</pubDate><description><![CDATA[最近打算做个Rougelike + RPG + 塔科夫 混搭风格的冒险游戏。暂且就当是一个有随机元素，有基地，死亡会掉落物品的近战塔科夫罢。花了三天时间，整合了Mixamo的动画和模型资源，通过改动一点Unity自带的第三人称模板的控制器实现移动和动画控制，然后自己做了个动画状态机。写这篇主要是记录制作动画状态机时出现的问题状况和解决方案。当下动画状态机实现了以下特性基于人物速度的站立到奔跑的混合动画基于人物朝向和速度的四方向混合动画（行走和蹲伏）]]></description><category></category></item><item><title><![CDATA[【算法速刷(9/100)】LeetCode —— 42.接雨水]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/143691675</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/143691675</guid><author>Siro_sama</author><pubDate>Mon, 11 Nov 2024 18:33:09 +0800</pubDate><description><![CDATA[后来发现有点复杂化了，因为题目只需要累计的结果数字，不需要额外的东西，但因为先入为主的观念，我还是选择了从低到高从左到右依次遍历的模拟法，这种方法的复杂度基本上是O(N * MaxHeight)，实际也是十分低效，但私以为思路也是值得一分享，最后用例通过319/323。注意构造的数组的值，不应低于当前位置的高度，假设左边高度始终低于当前高度，则在数组中记录为当前位置的高度，这样可以保证构造的数组减去原数组中当前位置高度不会出现负值。需要注意的是，在出栈的操作中，需要三个高度。这个算式的值域 >= 0。]]></description><category></category></item><item><title><![CDATA[【Unity/GameFramework】Start Force ——配置和表加载]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/143689864</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/143689864</guid><author>Siro_sama</author><pubDate>Mon, 11 Nov 2024 16:51:35 +0800</pubDate><description><![CDATA[首先思考如果不使用框架，那么我们大概率会专门包装做一个Json或者XML工具类，然后实现序列化和反序列化的方法，利用第三方库来对指定路径的文件进行具体序列化反序列化操作。在外部使用时，传入路径，指定类型，即可返回需要的对象。如果是和GameFramework一样做配置使用，那么我们就不仅仅只是序列化出来再交出去。我们还可以做一个类专门存储这一类反序列化出来的配置对象。并指定在某个时机（如初始化，游戏资源加载流程）来让其将所有配置统统反序列化出来，并向外暴露接口来访问这些反序列化的配置对象。]]></description><category></category></item><item><title><![CDATA[【Unity/QFramework】QFramework学习笔记]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/143664100</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/143664100</guid><author>Siro_sama</author><pubDate>Sun, 10 Nov 2024 18:17:05 +0800</pubDate><description><![CDATA[QFramework是一个轻量级的游戏框架，并且整合了许多有用工具。源码只有800行不到，这既意味着其源代码足够凝练，不会束手束脚，也意味着在制作自己的游戏的时候，需要扩展和增加一下框架的功能。]]></description><category></category></item><item><title><![CDATA[【Unity/GameFramework】Star Force —— 启动流程]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/143337434</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/143337434</guid><author>Siro_sama</author><pubDate>Tue, 29 Oct 2024 18:15:01 +0800</pubDate><description><![CDATA[第二步是进行语言的配置，首先从GameEntry.Localization中拿出language，然后将其赋值为GameEntry.Setting中存储的Language（当然是在有的前提下），之后对语言进行，检查，是不支持的语言就默认改成英语，这个操作同样要再同步回GameEntry.Setting。第三步是加载资源包变体，GameFramework不仅允许字体的本地化，同时还支援了资源包的本地化，即不同的语言对应了不同的资源包，更加的自由哇！接下来是Procedure的逐步初始化。]]></description><category></category></item><item><title><![CDATA[【Unity AI】基于 WebSocket 和 讯飞星火大模型]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/142690970</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/142690970</guid><author>Siro_sama</author><pubDate>Thu, 03 Oct 2024 13:00:32 +0800</pubDate><description><![CDATA[通过Content Size Filter和Vertical Layout Group 和 Horizontal Layout Group 的多层嵌套，以及两种版本的气泡UI，通过同一个类对其进行显隐和更新的控制，实现了较少字体时气泡随字体更新改变自身大小，较多字体时气泡固定并允许内容滚动显示的功能。负责播放UI音效（文字冒泡音效，），内部使用池化的思想，构建了一个大小固定的AudioSource池，对外暴露的Play接口会从池中获取闲置的或者最早使用的AudioSource，避免每次都重新创建该组件。]]></description><category></category></item><item><title><![CDATA[【Roblox/Lua】Roblox抽奖游戏设计概述]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/142535530</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/142535530</guid><author>Siro_sama</author><pubDate>Wed, 25 Sep 2024 23:26:10 +0800</pubDate><description><![CDATA[最近在写的Roblox游戏的结构文档，边写代码边整理出来的，代码之后看看再贴出来。不过有一说一这Roblox的Lua代码感觉贴出来也没什么用，可读性太差]]></description><category></category></item><item><title><![CDATA[【算法】C++KMP算法的简洁实现]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/142535327</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/142535327</guid><author>Siro_sama</author><pubDate>Wed, 25 Sep 2024 23:20:17 +0800</pubDate><description><![CDATA[对于朴素的字符串匹配算法，如果想在主串中寻找到第一次出现子串的位置，需要依次枚举主串中的每一个位置作为起始位置进行匹配尝试，如果主串中存在许多与子串相似结构的部分，那么朴素算法会进行大量的无用枚举，时间复杂度非常之高。KMP算法区别于朴素算法的地方就是其在尝试匹配时，匹配失败后不会回溯主串的指针，而是通过一个预处理的next数组去回溯子串的指针，主串的指针会继续向后遍历。因此KMP算法只会遍历一次主串，这在主串长，子串短的情况下具有非常大的性能优势。]]></description><category></category></item><item><title><![CDATA[【VSCode】VSCode Background 背景插件辅助窗口程序]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/142289967</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/142289967</guid><author>Siro_sama</author><pubDate>Sun, 15 Sep 2024 22:21:10 +0800</pubDate><description><![CDATA[在右边的细节面板调整行为，这些行为与窗口程序和settings.json息息相关，并且不会去检测VSCode的settings.json中是否含有所需的字段，因此强烈建议你先在VSCode的settings.json上创建所需要在面板上自定义的条目。点击应用当前壁纸组后，VSCode的settings.json会被替换，此时VSCode会提示重启窗口，重启后即应用修改（我尝试了各种办法，但最后还是不能在外部操纵VSCode的命令行为，因此该窗口程序仍然是一个半自动程序）这对于我而言是十分苦恼的。]]></description><category></category></item><item><title><![CDATA[【设计模式】工厂模式]]></title><link>https://blog.youkuaiyun.com/Siro_sama/article/details/142062485</link><guid>https://blog.youkuaiyun.com/Siro_sama/article/details/142062485</guid><author>Siro_sama</author><pubDate>Mon, 09 Sep 2024 16:27:35 +0800</pubDate><description><![CDATA[设计模式共23种，总共分为三大类：创建型模式，结构型模式，行为性模式工厂模式属于创建型模式，其聚焦于如何组织类去实例化一个对象，实际上就是在原本直接的new的基础上进行一个封装，达到可以方便随时变更，扩展，和其他类交互的功能。]]></description><category></category></item></channel></rss>