- 博客(322)
- 资源 (1)
- 收藏
- 关注
原创 ECS架构的理解
Unity里面可以同时拥有多个不同的世界, 每个世界独立包含EntityManager与Systems, 在世界里面创建出来的一个Entity,只属于这个世界。Archetype由EntityManager创建出来,创建出来后这个类型的Entity的大小,包含的组件数据,内存布局都确定了。一个游戏对象的实体,可以是游戏中玩家、BOSS、NPC等,一个Entity里面包含了一个个的ComponentData,每个ComponentData代表这个Entity拥有这个功能。组件便可以认为它拥有了移动的能力,
2023-08-20 23:49:03
6439
原创 opengl笔记之VBO,VAO
1.1一般用来存放顶点数据1.2 VBO创建和销毁1.3 VBO绑定和数据更新opengl提供很多全局状态插槽,当我们想要更新一个VBO数据时候,先要将这个VBO编号绑定到当前状态槽中,然后向当前绑定的VBO中发生数据。OPENGL中很多对象的操作都是这样的。1.4 我们可以把每个属性存为一个vbo也可以,也可以将多个属性交叉存在一个vbo中。
2026-04-02 17:28:42
31
原创 OpenGL笔记之深度测试原理
顶点坐标经过MVP变换后得到顶点在裁剪空间的坐标,然后透视除法得到NDC空间坐标,最后将NDC下的坐标转换成0的1的范围。这时候得到的Z坐标就是顶点的深度值。深度0表示视景体近平面上的点,深度1表示远平面上的点。
2026-04-02 15:14:34
16
原创 opengl笔记之透视投影
目的是将摄像机空间的坐标点变换到裁剪空间,然后作为顶点着色器的输出(gl_Position),后续管线会自动进行透视除法将裁剪空间坐标变换到NDC空间(-1到1)
2026-03-31 20:10:51
25
原创 OpenGL笔记之正交投影变换
在视图变换后的摄像机空间中,选择一块立方体区域进行渲染显示,在立方体内的顶点才会显示,超出这个盒子立方体的顶点会被踢除。 我们通过正交投影矩阵来生成这个投影盒子,此矩阵将盒子内部顶点转化到NDC坐标系。2.我们设置了正交投影矩阵后,就可以使用定义的盒子坐标范围,来设置顶点坐标了。
2026-03-29 15:16:06
24
原创 OPENGL之摄像机与视图变换矩阵
就是需要把所有物体的所有顶点的世界坐标变换到摄像机坐标系中,然后计算投影,这个变换矩阵也叫视图变换矩阵。摄像原点和方向不和世界原点重合的情况下,计算物体的投影很困难 ,要怎么解决呢?
2026-03-27 16:53:11
66
原创 OpenGL 纹理过滤
场景推荐设置 (param理由是否需要通用 3D (放大)GL_LINEAR平滑过渡,消除马赛克,性能好。❌ 否通用 3D (缩小)最佳画质。消除闪烁、噪点和层级跳变。✅必须性能敏感 (缩小)画质好,略微减少计算量,可能有轻微层级跳变。✅必须像素风 (放大)GL_NEAREST保持锐利的像素边缘。❌ 否像素风 (缩小)保持锐利边缘,同时防止远处闪烁。✅必须绝对禁止GL_LINEAR(缩小且无 Mipmap)会导致严重的远处闪烁和摩尔纹。❌ (用了也白搭)
2026-03-16 11:21:37
414
原创 OpenGL纹理与采样
我们准备一张200x250像素的图片,如何贴到250x400的矩形上?矩形需要250x400个像素颜色,图片只有200x250个像素,显然不够用。我们需要对图片进行拉伸,这个拉伸具体怎么实现的?我们可以用UV坐标来实现,uv坐标用于表示当前像素或顶点对应图片上百分比位置的横纵百分比;u为横向百分比,v是纵向百分比;根据图片宽高乘以uv,得到对应像素位置,取得像素颜色。
2026-02-28 16:56:48
64
原创 初等函数图形的变换规律
上加下减放大直接乘规则直观。函数图像的变换并不是公式技巧,而是变量变换的结果。一旦理解:表达式永远是在补偿坐标变化所有“反着来”的规律都会变得自然。振幅频率平移量中心线图像就会在脑海中自动浮现。这正是函数变换真正优美之处。
2026-02-28 13:50:52
569
原创 Shader 中的插值算法
无论是纹理的平滑采样、动画的自然过渡,还是 3D 物体表面的正确渲染,背后都依赖着不同的插值算法。如果你在做 Pixel Art (像素艺术) 风格的游戏,务必在引擎设置中将纹理过滤模式改为 Point/Nearest,强制关闭双线性插值,否则画面会变得模糊不清,破坏艺术风格。相比之下,普通的 Lerp 在球面上走的是弦(直线),会导致中间速度慢、两头快,且向量长度会缩短。双线性 (Bilinear):在 2D 平面上,先对水平方向的两个点进行线性插值,再对垂直方向的结果进行插值。
2026-02-27 15:15:21
346
原创 OpenGL之标准化设备坐标(Normalized Device Coordinate =NDC)
所有顶点经过顶点着色器处理后,最终都会被转换到 NDC 空间,然后映射到实际的屏幕像素坐标。
2026-02-22 16:51:03
39
原创 Creator源码解析之Device 和 DeviceManager
类职责特点设备管理、初始化、Swapchain 管理单例、平台适配Device图形 API 抽象、资源创建、命令执行抽象基类、统一接口两者协作实现了跨平台的图形渲染抽象层,上层代码无需关心底层是 WebGL、WebGPU 还是原生 API。
2025-11-09 21:18:53
332
原创 cocos的Spine 源码解析
float time;管理整个角色的骨架结构递归更新每个骨骼的世界坐标控制皮肤切换、绘制顺序层级类主要职责数据层资源与图集加载骨骼层骨骼树结构与空间变换显示层控制显示内容与贴图绑定动画层动画插值与混合控制渲染层绘制最终画面。
2025-11-09 21:09:52
527
原创 纹理采样常见算法
采样算法纹理插值方式缩小效果放大效果特点最近点(Nearest)无锯齿、闪烁像素化最快、最原始双线性(Bilinear)2x2 texel 线性插值有模糊较平滑平衡性能与质量三线性(Trilinear)bilinear + Mipmap 级间插值平滑平滑缩小远景更清晰各向异性(AF)根据屏幕投影方向优化采样清晰清晰倾斜纹理细节好,但开销高。
2025-11-04 20:26:36
402
原创 Unity 流光shader的思路
3.由上面的函数图像可以看出 z=x+ky (k是常量),表示所有斜率为k的直线集合,z是直线在x轴的截距,每个z的取值确定一条唯一的直线。
2024-08-10 18:05:50
603
原创 C++ 异步编程:std::async、std::future、std::packaged_task 和 std::promise
用于设置异步操作的结果或异常。用于获取异步操作的结果或异常。封装函数为任务,并与结合使用。std::async简化异步任务的创建和管理,自动处理线程和任务。通过理解和使用这些 C++ 标准库组件,你可以更高效地进行异步编程,管理复杂的任务和线程操作。
2024-08-04 20:05:59
784
原创 2D游戏剔除算法,考虑物体的旋转和缩放
核心思想:如果物体的中心点在扩大后的可见区域内,我们可以认为物体在可视区域内;如果物体的中心点在扩大后的可见区域外,我们可以认为物体在可视区域外。
2024-08-04 16:28:32
364
原创 状态机和行为树的搭配使用
下面是一个完整的TypeScript案例,展示了如何将状态机和行为树结合起来使用。状态机负责智能体的身体状态,行为树负责智能体的智能决策。在行为树做决策前,会考虑状态机的状态。
2024-06-19 21:30:22
756
原创 行为树行为树行为树
/ 重复执行装饰节点:重复执行子节点指定的次数,或直到满足某个条件。// 装饰节点:用于修改其他节点的行为,通常只有一个子节点。// 选择器节点:依次执行子节点,直到其中一个成功为止。// 序列节点:依次执行子节点,直到其中一个失败为止。// 条件节点:判断某个条件是否满足,并返回结果。// 行为节点:执行具体的动作,并返回结果。// 判断敌人是否在范围内的条件节点。// 反转节点:将子节点的结果反转。// 非叶节点类,用于容纳子节点。// 追击敌人的行为节点。// 攻击敌人的行为节点。
2024-06-19 20:56:43
1453
原创 Creator中的Assembler和渲染组件
Assembler 的作用是根据渲染组件的属性和状态,生成渲染所需的绘制数据,并将其发送给渲染引擎进行绘制。不同类型的渲染组件可能需要不同的 Assembler 来实现特定的渲染效果。总体来说,渲染组件负责管理节点的渲染信息,而 Assembler 则根据渲染组件的信息生成绘制数据,实现节点的具体渲染效果。如果我们想要自定义一个渲染逻辑,就需要创建自己的渲染组件类来继承引擎的渲染组件的基类,如UIRender,并且需要创建一个渲染组件的 Assembler实现IAssembler接口。
2024-05-10 09:40:28
774
原创 cocoscreator 之Renderable2D
在 Cocos Creator 中,是一个基类,用于支持 2D 渲染的组件。它提供了一些基本的属性和方法,以便开发者可以创建自定义的 2D 渲染组件。通常情况下,开发者可以通过继承类来创建自己的渲染组件,并实现其中的渲染逻辑。以下是。
2024-05-09 18:01:02
541
原创 SPFA算法
SPFA 在形式上和广度优先搜索非常类似,不同的是广度优先搜索中一个点出了队列就不可能重新进入队列,但是SPFA中一个点可能在出队列之后再次被放入队列,也就是说一个点修改过其它的点之后,过了一段时间可能会获得更短的路径,于是再次用来修改其它的点,这样反复进行下去。2.遍历队首元素的邻接节点,如果队首元素的加入使得邻接节点的dis值变小了,那么这些邻接节点入队,并且更新它们的dis值。这个算法,简单的说就是队列优化的bellman-ford,利用了每个点不会更新次数太多的特点发明的此算法。
2024-04-19 22:21:21
240
转载 Unity Shader 中step,lerp 和 smoothstep 应用
b 的差值,w 越接近0,返回结果越接近a,w越接近1,返回结果越接近1,通常用来计算一些渐变量。1→2:平滑过渡(0→1),2→3:保持过渡后的效果(1),3→4:平滑过渡(1→0)平滑过渡,_Start=0, _End=0.35(过渡的距离较长)当 w = 0 时,返回a,当 w = 1 时返回b,否则返回对 a 和。1→2:平滑过渡(0→1),2→3:平滑过渡(1→0))可以用来生成0到1的平滑过渡值,它也叫平滑阶梯函数。作用是计算两个参数的距离。的代码,下面看一个使用。提供了单一的平滑过渡方法。
2024-04-06 15:37:36
5249
原创 向量点乘在图形学中的作用
我们把图中b的在a上的投影向量称作b1吧,因为b1就在a上,所以只需要求出b1的大小,然后乘以a的单位向量,我们就得到向量b1了。b1的大小刚好等于b的模长乘以夹角余弦。图中a点乘b大于0,称a和b方向趋于相同, a点乘c小于0,a和c的方向趋于相反。点乘结果等于0的话两个向量垂直。1.找到两个向量之间的夹角(不用多说)
2024-03-31 20:27:03
690
原创 ORCA(动态避障)算法
A物体沿着向量v1和v2移动,刚好能和B擦肩而过,不会发生碰撞;若V1和V2的夹角再小一点的话就一定会发生碰撞。A的速度为V1,B的速度为V2,A对于B的相对速度(也就是我们把B看做静止,A的速度)就是V1-V2。,那么怎么判定A的速度向量是不是在碰撞区域内呢?这就需要用A相对于B的速度来判定。红线画出来的锥形区域就是A相对于B的。
2024-03-20 21:12:04
4421
4
原创 UnityShader的混合模式
Blend OneMinusDstAlpha:与上一个混合模式相反,使用一个材质的颜色,并将一个背景颜色与它的目标透明度混合。- Blend OneMinusSrcAlpha:与上一个混合模式相反,使用一个材质的颜色,并将一个背景颜色与它的源透明度混合。- Blend OneMinusSrcColor:与上一个混合模式相反,使用一个材质的颜色,并将一个背景颜色与它混合。- Blend OneMinusDstColor:与上一个混合模式相反,使用一个材质的颜色,并将一个背景颜色与它相除。
2024-01-24 17:02:11
787
原创 特别大的地图A*算法优化思路
那么为了保证每次搜索不会超过一定代价,可以设置深度限制,每搜一次则深度+1,搜到一定深度限制还没搜到终点,则返还失败值。step2:让角色向下一个小地图的入口点移动,若下一个小地图不是终点所在的地图,那么重复step1根据这个入口点到终点的方向计算出,新的小地图的出口点,用A*找到出口点的路径。step1:根据起点和终点的方向算出走出当前小地图出口点,用A*寻路到出口点。若下一个小地图是终点所在小地图那么就再用A*寻路到终点即可。(注:当前小地图出口点也就是要经过的下一个小地图的入口点)
2024-01-22 23:10:58
1947
3
原创 Distance Field Font (DF Font) 和 传统 TTF 的纹理化表示方式
Distance Field Font(DF字)是一种用于渲染平滑和高质量文字的技术。它使用距离场来表示字体的形状,然后通过特定的算法将距离场转换为像素图像。
2024-01-21 17:58:33
754
原创 游戏架构之继承对象模型和组件对象模型
在所有游戏性架构相关的内容中,运行时对象模型可能是最复杂的系统,并且不同的游戏引擎呈现出的差异极大。例如Unity3D提供的组件模型,虚幻引擎提供的面向对象继承模型,其他一些游戏则使用一种不同于两者的基于数据驱动的游戏对象模型。管理游戏对象的创建与销毁。许多游戏引擎都提供一种统一的动态创建、销毁游戏对象的方式,并管理游戏对象的内存及资源。比如Genius-X框架中使用createEntity()、removeEntity(entity)来动态创建、销毁一个游戏对象。
2023-12-07 23:23:56
969
原创 Emscripten学习笔记之内存模型
在WebAssembly标准出现前的很长一段时间内,Emscripten的编译目标是asm.js。自1.37.3起,Emscirpten才开始正式支持WebAssembly。以asm.js为编译目标时,C/C代码被编译为.js文件;以WebAssembly为编译目标时,C/C代码被编译为.wasm文件及对应的.js胶水代码文件。两种编译目标从应用角度来说差别不大——它们使用的内存模型、函数导出规则、JavaScript与C相互调用的方法等都是一致的。
2023-12-05 18:44:56
1085
原创 Emscripten学习笔记之胶水代码
Emscripten 是一个可以将 C 和 C++ 代码编译为 JavaScript 的工具链。它可以将 C/C++ 代码转换为高效的 JavaScript,并生成相应的 HTML 和 JavaScript 胶水代码,以便在浏览器中运行。这将生成一个 HTML 文件()和一个 JavaScript 文件(3. 最后,我们需要在浏览器中打开生成的 HTML 文件。这将会运行我们的 C 代码,并输出 "Hello, World!生成的文件就是我们的 JavaScript 胶水代码。
2023-12-05 17:46:48
834
原创 WebAssembly 和javaScript的差异
然而,JavaScript具有更强的灵活性和广泛的支持,更适合用于某些特定的开发需求。总的来说,WebAssembly在执行速度和加载速度方面通常比纯JS更优,
2023-11-21 16:21:02
456
转载 Unity ShaderLab中的模板测试(Stencil)
模板测试 发生在片元着色器之后的逐片元操作阶段:透明度测试——>——>深度测试——>透明度混合。
2023-11-13 11:13:58
1082
改写cocos2d的ProgressTimer实现任意起始点的Radial进度条
2023-06-20
改写cocos2d的ProgressTimer实现任意起始点的Radial进度条
2023-06-20
CocosCreator框架设计Demo,内容在这篇文章介绍:
2022-09-17
UNITY最近打开文件记录,多个资源来回切换
2022-08-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅