- 博客(64)
- 收藏
- 关注
原创 BVH(一):BVH的基础构建和查询
在GamePlay中,BVH常用于碰撞检测的BroadPhase阶段,通过自根节点向下逐层与查询目标进行AABB间的相交测试,排除那些明显不可能发生碰撞的分支,快速筛选出需要提供给NarrowPhase阶段进行精度片元测试的物体,基于此思想,在构建树时需要一方面使节点的AABB尽量紧凑,另一方面尽量使左右子节点分散,减少重叠,这样才能在查询阶段有效地进行剪枝提高查询效率。而树所管理的实际物体,则均位于最下层的叶子节点中。】中我们介绍了KD树的基本使用,这里要介绍的是另一种加速查询的空间划分结构:BVH。
2025-06-29 19:19:48
799
原创 使用KD树进行最近邻查找(1NN)和K近邻查找(KNN)
均匀网格、四叉树(或八叉树)、KD树、BVH是游戏开发中比较重要的几种空间管理的手段。其中均匀网格和四叉树比较简单,通常都是以客观空间为基础进行空间划分(或者建树),而KD树和BVH则以被管理的物体本身为基础划分空间。KD树本身是一个数据集划分的手段,根据数据的不同维度交替对数据进行划分(如年龄、身高、成绩等),但是在游戏开发中,经常会根据物体的位置信息构建KD树,从而达到空间管理的效果。下面讨论的都是特指这种应用场景。
2025-06-21 13:04:22
1090
原创 堆排序和优先队列
入队指向队列中添加元素,可以将新加入的元素插入到堆的最后一个位置,然后该元素与其父节点比较,如果不满足堆特性,则将其与父节点交换,由于队列内本身已经是成型的堆,这里依然假设为大顶堆,父节点一定比另一个子节点大,因此新插入的元素跟父节点交换后不需要再跟另外一个子节点作比较。此时新放到堆顶的值是无法满足大顶堆的性质的,但是堆顶以下的部分依然满足,其实就相当于构建堆时还剩根节点没有执行下沉操作,因此只要对新的堆顶执行下沉操作,就又能重新达到大顶堆的状态。于是结果中的最后一个值就确定了。
2025-06-21 13:02:25
859
原创 泊松圆盘采样进行随机选点
上面也提到过,说白了这个格子就是个空间划分的工具,用来快速筛选目标点的,相当于碰撞检测的BroadPhase阶段,所以只要逻辑合理,怎么划分都可以,只不过不同的划分方式可能带来一些不同的额外情况需要考虑。一种标准的划分网格的方式是Bridson算法,以MinDis作为格子的对角线,由于同一个正方形中两个点能够相距的最远距离就是对角线,因此即使在极限情况下,满足距离要求的两个点也不会落到同一个格子中。在这种划分下,需要参与检测的最远的情况也就是两个点正好跨了一个格子的对角线,如下图所示。
2025-06-10 13:20:02
646
原创 米切尔最佳候选进行随机选点
米切尔最佳候选算法是一种进行相对均匀的随机布点的手段,可以严格限制最小间隔也可以不严格限制,因此相比于直接随机,米切尔最佳候选的选点效果更加均匀,相比于泊松圆盘随机,米切尔选点的效果整体均匀局部可能又不均匀。此时候选点集只有一个点,所以就是选距离初始点最远的候选点作为最佳候选点,加入确定点集。大概过程如下图所示,其中蓝色点为确定点集中的点,红色点为候选点。选择DisMin最大的候选点作为最佳候选点,加入候选点集。为确定点集中的每个点再次随机候选点。从初始点出发,随机三个候选点。
2025-06-10 10:20:26
257
原创 使用柏林噪声生成随机地图
柏林噪声(Perlin Noise)是一种由 Ken Perlin 在1983年提出的梯度噪声(Gradient Noise)算法,用于生成自然、连续的随机值。它被广泛用于计算机图形学中模拟自然现象(如地形、云层、火焰等),是程序化生成(Procedural Generation)的核心技术之一。
2025-06-07 23:05:34
1589
转载 【备份】GASDocumentation_Chinese
Attribute是由结构体定义的浮点值, 其可以表示从角色生命值到角色等级再到一瓶药水的剂量的任何事物, 如果某项数值是属于某个Actor且游戏相关的, 你就应该考虑使用AttributeAttribute一般应该只能由修改, 这样ASC才能预测(Predict)其改变.Attribute也可以由定义并存于其中.用于同步那些标记为replication的Attribute. 参阅部分来了解如何定义AttributeTip: 如果你不想某个Attribute显示在编辑器的Attribute列表, 可以使用。
2025-04-30 12:00:50
396
原创 EntitasLite源码分析(八)
ISystem是所有System的基础接口类,从ISystem又继承下来一系列的System接口,各自提供对应的方法,用于在特定的生命周期节点进行调用,执行逻辑处理。
2024-12-07 12:53:40
785
原创 EntitasLite源码分析(七)
顾名思义,ICollector是一个收集器,通过监听Group的Event事件,对相关的Entity进行收集,以供后续逻辑处理。
2024-12-07 12:52:48
854
原创 EntitasLite源码分析(六)
Matcher是EntitasLite提供的一个匹配器,也可以叫筛选器,通过定义一系列Component规则来对Entity进行匹配或筛选。基本结构由IMatcher接口类定义:这一堆的IMatcher接口乍一看有点乱,仔细一看,还真是有点乱。没关系,我们继续看实现类Matcher。
2024-12-01 01:02:30
964
原创 EntitasLite源码分析(五)
在ECS结构中,Component并不实际承载逻辑,而是负责为逻辑提供所需的数据,因此Component只是一个负责记录数据的容器。EntitasLite框架中,几乎所有类型都维持着一个接口类对应一个接口实现类的形式,如 IContext 和 Context、IEntity 和 Entity。Component则不同,Component存在的意义是为了使数据有个存取的地方,以供实际的业务逻辑使用,其本身是没有任何特性的。
2024-12-01 01:01:42
866
原创 EntitasLite源码分析(四)
Group是Context的子集,它通过Matcher指定的规则筛选并存储一组具有某些共同特征的Entity,方便在业务逻辑中对这些Entity进行遍历处理。
2024-11-28 12:34:39
1038
原创 EntitasLite源码分析(三)
Entity作为ECS的基础个体,是整个框架中最大的类。同样,通过对应的 IEntity 接口类定义了Entity的基本能力。
2024-11-28 12:33:23
687
原创 EntitasLite源码分析(二)
上文介绍了Context是EntitasLite框架中管理一切的管家,而Contexts则是负责创建和管理单个Context的大管家(从名字也能看出来)。IContexts接口本身内容非常简单,只有一个记录所有Context的数组。
2024-11-26 23:43:09
834
1
原创 EntitasLite源码分析(一)
EntitasLite是一个轻量级的ECS框架,代码量少,结构清晰,非常适合扩展和封装,创建适合自身项目实际情况的ECS系统。
2024-11-26 23:41:58
888
原创 【Unity Shader入门精要 第8章】透明效果(四)
前面提到过,在进行半透物体的渲染时需要关闭深度写入,但是如果物体本身存在复杂的遮挡关系时,关闭深度写入的渲染就会出现问题。如上图红框中的部分,这种情况下,可以使用开启深度写入的半透渲染方式。这里我们通过 ZWrite On 开启深度写入。
2024-05-20 09:41:39
912
原创 【Unity Shader入门精要 第8章】透明效果(一)
之前我们并没有提到过渲染顺序的问题,也就是当场景中有多个物体时,需要先渲染哪个后渲染哪个。实际上,对于不透明物体,先渲染谁后渲染谁都是一样的,都可以得到正确的渲染结果,这是由于深度缓冲(Z-Buffer)的存在。在实时渲染中,深度缓冲用于解决可见性的问题,它可以决定哪个物体的哪些部分会被渲染在前面,哪些部分会被其他物体挡住。其基本思想是,根据深度缓冲中的值来判断片元距离摄像机的距离。
2024-05-17 21:45:20
727
原创 【Unity Shader入门精要 第7章】基础纹理(三)
另外一种对于纹理的使用方式是通过渐变纹理为物体提供漫反射光照效果。顾名思义,渐变纹理本身就是一张颜色渐变(可以是连续渐变,也可能是突变)的图片,这个渐变的过程模拟的就是光源从不同的角度照射物体的过程,因此对渐变纹理的采样通关不关心目标像素的位置信息,只关心光照角度。通常来讲,渐变纹理都是左右不可以互相拼接的(像上图这样)。
2024-05-16 12:18:03
466
原创 【Unity Shader入门精要 第7章】基础纹理(二)
除了用于直接表示物体表面颜色,纹理的另外一种常见用法是用来进行凹凸映射,在不增加顶点的情况下,通过纹理来提供额外的法线信息,从而在视觉上增加表面凹凸细节,丰富渲染表现。最常用的两种凹凸映射为法线贴图和高度图。
2024-05-16 12:17:12
1034
原创 【Unity Shader入门精要 第7章】基础纹理(一)
每一张纹理可以看作拥有一个属于自己的2D坐标空间,其横轴用U表示,纵轴用V表示,因此也称为UV坐标空间。UV空间的坐标范围为[0,0]到[1,1],在Unity中,UV空间也是从左下到右上,即纹理的左下角对应的UV坐标为[0,0],纹理右上角对应的UV坐标为[1,1]在美术导出模型资源时,会通过UV展开将模型每个顶点对应的UV坐标存储到顶点信息中。渲染时通过顶点(或片元)的UV坐标映射到纹理上的某一点,这样就可以通过采样每一个顶点(或片元)对应的纹理上的颜色将纹理显示出来。
2024-05-14 22:31:15
1432
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅