[toc] # 序 一直想学习一下 Nanite 是如何实现的,最近悄悄打开 UE 源码小鹿乱撞的看了一下,然后发现了一个奇观 Nanite 的剖分核心代码文件只有这么多 XD 这么一来,忽然感觉也有机会稍微不那么彻底的将 Nanite 的实现进行一次理解与拆分么?那么就开始吧 这一篇的目的是先对目前已知的模块进行大体的拆分 # Nanite 的大体思路 todo: 这一部分其实之前已经比较熟悉了,现在需要考虑的是 UE是如何具体的实现的 所以这一章暂时先搁置啦 # 1. Nanite Mesh 的切分方式 倘若给我们一个如上图那么复杂的三维模型,让我们尝试将这个三维模型切分成...

[toc] # 关卡编辑器需要什么? 一个和关卡有关的世界根节点 根节点下的不同子节点 (如动态物体,静态物体,事件点,等), 称之为 元素 针对不同的 元素 素材库的配置,并支持对素材库的查看和编辑器下的生成 存储关卡数据时,需要从根节点出发,索引所有的根节点元素,并进行序列化保存,且需要支持多种序列化方式 支持虚拟的包围盒,方便运行时裁剪 # 实现思路 先将数据分解为:元素数据库、元素展示器 / 关卡编辑器、关卡序列化器、关卡运行时生成器 元素数据库 数据库内存放各种不同类型的关卡元素 举例: static element: 静态元素 元素展示器 /...

[toc] # 序 技能编辑器和 Goap 类 AI 已经大概了解了,在想要动身做 Demo 的时候,忽然发现一个很显而易见的问题:我该如何进入一个 "地方", 这个 "地方" 是什么,“地方 "又可以到" 哪个地方”? 然后经过思考,就发现了另一个重要的模块也是需要认真做一下的. 关卡编辑器 # 我所思考的关卡编辑器 关卡编辑器最主要的作用是什么?可能一开始我们的思考就是 关卡编辑器可以用来设计一个的场景用的...

[toc] # ComputeShader 驱动的粒子效果 # DrawProcedureNow 接口 可以使用 DrawProcedureNow 接口来绘制粒子效果 (但是只有 ES4.5 以上才可能支持), 但是这个其实完全可以用 instance 来代替,主要的作用是: 不需要输入顶点,顶点数量是procedure中指定的,其他的数据都是从SSBO中获取的 ,而牵扯到 SSBO , 那就估计就要 ES5.0 以后才可以完全支持 DrawProcedure 触发的时候,可以不用每帧提交 # 基于 point 的粒子 通常粒子的数据只需要一个简单的结构体 12345struct...

[toc] # 1. 浮动的圆 # 效果拆解 单体圆的绘制: Bresenham 并发画圆算法 有了上述并发画圆的方法,我们就可以在每帧绘制一个单体圆。 如果我们想绘制更多的圆,只需要分配更多的 ThreadGroup , 每个线程负责画一个 (如果想也可以画多个) 圆形如何移动? 只需要在时序上更新圆的中心点即可 如何实现不同圆有不同的匀速? 这就需要用到 SSBO Shader Storage Buffer Object , 首先需要知道的是,这个 Buffer 的适配性很差,至少移动端基本不同架构的数量相差巨大,可以说不能用 (? 比如有的只允许 30 个,有的却可以允许...

[toc] 开篇:为什么要系统的学习和记录这个? 在实际的游戏开发中对于性能有着很高的要求,即可能给你的业务或者行为链的时间耗费只有不到 1ms 的时间 业界通常使用的 ECS 架构可以做到将 逻辑 - 组件库 - 渲染 进行分离,其实这之中的每一个点都可以使用 ECS 来进行重构. 那么为什么 ECS 有如此的魅力呢?因为 ECS 并非一个简单的架构问题,如果去看一些开源的 ECS 库,你会发现它们在存储 Component 时会使用 Sparser 进行命名,而这个 Sparser 其实就是并发编程中一个很常见的结构思路,比如: 稀疏数据结构 、 稠密数据结构 、 AOS 、 SOA...

[toc] 前序: 技能编辑器主要是用来编辑一个行为过程中触发的事件,而这些行为本质上是存在相互依赖的关系的,比如: A 准备攻击 B, 前摇阶段被 B 打断 A 离开攻击行为,进入被击行为。所以,实际上角色的每个行为本身都可以抽象成为一个状态,行为之间的转移就可以抽象为状态转移 而时间轴则可以给状态加入时间 (帧) 的概念,当前状态的每个时间点 (帧) 会发生什么事,发生的事情会转换到哪个状态…...

[toc] 之前有记录过 GPU 硬件相关的知识,现在学习一下 ComputeShader. # ComputeShader 线程组概念 首先,编写 ComputeShader 时需要我们指定核函数,即 #pragma kernel 名字 ,核函数的构造一般如下: 123456789#pragma kernel Circles[numthreads(8,8,1)]void Circles (uint3 id : SV_DispatchThreadID){ int2 center = (texResolution >> 1); int radius...

[toc] # 概述 这篇个人手记目标是将一个一直以来都挺想学到的 Goap 技术熟悉一下. # 我对于游戏层面 AI 的想像 游戏 AI 的算法实际上已经发展了很久了。相比于传统计算机学科中的 AI,游戏 AI 更像是一种定式 / 启发式的固定 AI 构造器。而我所理解的基于深度学习一类的 AI,更类似于基于统计学来计算出一个可以拟合特定问题的高维函数,而这个函数的参数要远大于游戏领域的 AI 参数 (毕竟什么读指令,环境因素等参数输入也不是很多嘛),从这个角度出发,我们似乎可以得出这样一个结论,传统游戏 AI 在算力优先的前提下,是需要找出让 NPC 看起来不那么愚蠢的小型函数...

[toc] # 级联阴影需要解决的问题 透视锯齿 方向光通常模拟太阳光,单个方向光即可照亮整个场景。这意味着方向光的阴影贴图会覆盖场景的大部分,因此可能会引起称为 “透视锯齿” 的问题。透视锯齿是指靠近摄像机的阴影贴图像素看起来比那些更远的像素更大块。 上述问题产生的原因 1. 假设光源垂直于摄像机 第二张图的网格就是生成的阴影贴图,可以看出,由于透视视椎体的近平面只占了贴图的 4 个像素,而远平面则占了 20 个像素。 而阴影的计算方法,就是通过近平面上的一个片元的深度和深度图的深度进行对比,而这个过程就需要对阴影贴图进行采样, 由于最终视椎体是会转到NDC空间的...