
游戏引擎
文章平均质量分 89
游戏引擎
码上生花
强者创造时代,能者顺应时代,弱者繁衍后代。
展开
-
游戏缓动曲线函数
缓动函数指定动画效果在执行时的速度,使其看起来更加真实。现实物体照着一定节奏移动,并不是一开始就移动很快的。当我们打开抽屉时,首先会让它加速,然后慢下来。当某个东西往下掉时,首先是越掉越快,撞到地上后回弹,最终才又碰触地板。本页可以在每次你需要时,帮助你找到想要的缓动函数。上图是我们常见的曲线列表,章节内所有公式和图表摘自网站有需要可以自行查看。原创 2022-04-17 16:54:17 · 521 阅读 · 0 评论 -
游戏引擎中的物理应用
而在更多情况下,动画和物理的区分并不像上述一样清晰,而是直接互相融合,比如抱着一个小女孩跑步的过程,一方面小女孩自身拥有一定的晃动动画,另一方面随着整体位置的移动,动画带来的角色物理信息会一起输入到物理系统去更新最终呈现出来的融合效果,使得避免动画单纯重复(只动画)和小女孩乱晃(只物理/布娃娃)。3维物体的切割也是类似。分割3维物体的一个难点是处理切割处的纹理问题,一般有两种方式:1、直接制作对应的三维纹理,切割时直接用(麻烦、贵)2、离线计算好这些纹理,一旦破碎则切换到对应的纹理,(要瞬时处理)。原创 2024-04-03 11:41:02 · 1624 阅读 · 0 评论 -
游戏引擎中的物理系统
在这个基础上,优化方法是取凸包A的某条边a做轴时,直接将凸包B的所有顶点投影到a的垂线上,因为这样可以保证凸包A的所有顶点都在垂线上a的一侧,所以只需要判断凸包B上所有顶点在垂线上的投影是否在另一侧就行。这种方法下,由于实际游戏中的时间片Δt不可能和现实中一样小,所以会导致能量不守恒(变多)(如图中右侧所示,实际位移是偏多的),误差越来越大,物体逐渐甩出去。但实际游戏中时间不是连续的,而是由一帧帧实现的,所以通常需要解决的问题是在已知当前物体位置和速度的前提下获取之后某时刻的物体位置和速度信息。原创 2024-04-02 23:29:02 · 1738 阅读 · 1 评论 -
游戏引擎之高级动画技术
虽然线性插值本身简单,但其实现的一个重要前提是能够找到两个clip中匹配的对应pose(帧)去做插值,因而我们需要艺术家在做DCC(Digital Content Creator)时确保两个clip的节奏相同,这样可以在归一化后保证每一帧都对应一样的动作(比如取时间t时走的pose是踏在地上,跑也是一样,只是动作有所不同)。简单讲就是blending总是以additive的形式去融合,比如直接在眼睛的位置上加上闭着的眼睛,而不会将睁着的眼睛和闭着的去做插值。event概念引用于UE,即事件。原创 2024-04-02 19:52:41 · 4231 阅读 · 2 评论 -
游戏引擎中的声音系统
多普勒效应(Doppler effect)是波源与观察者有相对运动时,观察者接受到波的频率与波源发出的频率并不相同的现象。生活中比较常见的例子是远方急驶过来的火车鸣笛声变得尖细(即频率变高,波长变短),而离我们而去的火车鸣笛声变得低沉(即频率变低,波长变长),这就是多普勒效应现象,同样的现象也发生在私家车鸣响与火车的敲钟声,音频参见[声的多普勒效应]。三维场景中有无数的声源,每个声源从不同的方向,不同的距离表现的效果都不一样。高频的声音衰减的快,低频的声音衰减的慢。不同的材质对声音的吸收也不同。原创 2024-04-01 12:33:31 · 1802 阅读 · 2 评论 -
游戏引擎中的粒子系统
当我们渲染普通场景时,由于Z-buffer的帮助,其实只需要渲染接触到的场景的第一个物体(其他被遮挡不需要渲染),但粒子效果有时候(最差情况下)会在一瞬间产生叠满整个分辨率好多层的粒子,而且它们不存在完全遮挡关系,所以相当于一下子要进行超大量的渲染。当时间跳转到下一次tick时,会新建一个alive list1,并依序检索alive list中的粒子,如果发现某个粒子死亡了,就会把这个粒子序号移到死亡列表中,并且在渲染时也跳过这个粒子,如果仍存活就照抄到alive list1中。原创 2024-04-01 11:33:57 · 1662 阅读 · 0 评论 -
游戏引擎中的大气和云的渲染
从而导致原方法LUT参数中的高度 h 以及太阳顶角 η都不需要参与预计算(因为都实时更新了),所以新方法的LUT表中只需要计算出观察的天顶角 θ 和一个水平方向环绕360度的夹角 ϕ (对应原来太阳到观察视角水平方向的夹角)即可。因为上述缺点,一种更简化的多次散射方案被提出,其特点在于认为任何散射都是各向同性的,向所有方向均匀散射,所以对一个介质来说,其所有邻居介质收到来自它的散射能量都是相同的,因而一次散射带来的结果只是整体削减(吸收)了固定百分比。实际计算时,Ray Marching是最常用的方法。原创 2024-03-31 18:49:01 · 1160 阅读 · 0 评论 -
纹理压缩算法
我们知道游戏中对于3D物体表面细节的表现最重要的还是靠贴图来实现的,那么越是高分辨率越是真彩色的贴图自然表现力也是越强,但是同时带来的问题是所需占用的内存会成倍的上升,而节省内存这一点在目前的游戏中还是非常非常重要的。所以各个平台上都在使用纹理压缩的技术,让纹理贴图在内存占用和显示效果能达到一个尽可能的平衡。纹理压缩是为了解决内存、带宽问题,专为在计算机图形渲染系统中存储纹理而使用的图像压缩技术。画质比较 : RGBA > ASTC 4×4 > ASTC 6×6 > ETC2 ≈ ETC1。原创 2024-03-26 09:55:01 · 1081 阅读 · 0 评论 -
游戏引擎中的地形系统
首先,根据屏幕的分辨率,在模型的可见面上镶嵌和最终象素尺寸相同的微多边形。接着再为新的多边形确定好新的法线方向。一种实现的方式是比如有1000个顶点,根据纹理中的数据对平面特定区域的顶点的高度进行位移。但是会有一个T junctions的问题,这个得查找对应周围的边是不是更加细分,如果更加细分,那我相邻没有细分的也要进行切分。我们会把我们用到的存到内存中,没有用到的放在磁盘中,然后通过分页来对磁盘内容进行索引。事实上我们的游戏中会有非常多的纹理,我们的纹理会存储在Texture array。原创 2024-03-24 15:59:26 · 1775 阅读 · 1 评论 -
渲染管线 -- 后处理
Bloom的实现原理:我们首先根据一个阈值提取出图像中的较亮区域,把它们存储在一张渲染纹理中,再利用高斯模糊对这张渲染纹理进行模糊处理,模拟光线扩散的效果,最后再将其和原图像进行混合,得到最终的效果。根据距离摄像机的远近绘制,最远的物体最后绘制,这样来说天空盒是最后绘制的。延迟渲染在计算光照的时候,需要注意的是每个光源创建一个包围盒来算他对于pixel的贡献,这样计算才能正确获得光照加速。我的理解是AO,表示正半球上有多少部分能够看到,实际上就是计算渲染方程中的可见性函数,目的是突出阴影。原创 2024-03-23 16:33:59 · 1039 阅读 · 0 评论 -
现代游戏引擎架构
保证同一时间内只有一个线程可以操作修改资源,可是这样又会引起死锁的问题。最著名的就是银行家算法。是一个轻量级的线程,在切换是不需要调用中断,由程序员调用即可。用不同的线程,进行不同的逻辑计算。快的线程需要等慢的线程结束。但是摩尔定律已经不在适用了,硬件的发展目前已经达到瓶颈。游戏的渲染计算对算力要求很高,所以我们需要把操作系统的资源利用到极致。进程与线程: 进程有独立的存储单元 线程是进程之内的,会共享内存。原子操作,可以不用加锁,但是会浪费CPU资源。多添加几个线程,可以动态分配线程资源。原创 2024-03-22 15:38:10 · 675 阅读 · 0 评论 -
游戏引擎中网络游戏的基础
在玩家B的客户端看到的玩家A只是玩家A的复制品,他的行为逻辑是由服务器计算反馈的。优化:不等最慢的客户端,设定一个deadline,超出deadline后就不管没有提交的输入了,而是发放已经提交的输入。帧同步的过程:每一帧所有的客户端把你输入交给服务器,服务器汇总后再发给每个客户端,每个客户端按照同样的逻辑处理这些输入。例如游戏中的回放并不是游戏战斗过程的录屏,而是在游戏时记录所有玩家的输入,然后将这些输入重新计算就可以得到同样的效果。随机数:每个客户端生成的随机数也是一样的,使用随机种子。原创 2024-03-17 01:27:00 · 2406 阅读 · 0 评论 -
游戏引擎中的动画基础
视觉残留理论 - 影像在我们的视网膜上残留1/24s。交互:游戏中的玩家动画需要和场景中的物体进行交互。实时:最慢需要在1/30秒内算完所有的场景渲染和动画数据。(可以用动画压缩解决)真实:多个动画的融合,表情的变化。原创 2024-03-16 18:26:53 · 1925 阅读 · 0 评论 -
游戏引擎渲染流程
我们首先看到渲染技术的发展游戏渲染面临的挑战:一个容器中同一时刻有大量的游戏对象需要进行渲染,并且不同对象渲染的形式、算法还有所差异,这些使得游戏的绘制系统变得非常复杂;其次,游戏引擎的渲染还要与当代的硬件适配;同时,游戏引擎需要保证渲染的稳定性,即使进入非常巨大复杂的场景,也要在至少1/30ms内完成绘制,随着玩家需求的提高,这一时间甚至可能被缩短到1/60ms、1/120ms之内;原创 2024-03-05 19:05:34 · 1691 阅读 · 0 评论 -
游戏引擎分层简介
至于数据结构和容器,编程语言中自带的数据结构可能会出现一些问题,比如C++中的Vector在添加对象时开辟的储存空间会成倍增长,在添加大量对象后,使用的储存空间我们将无法得知,可能会产生内存空洞,而引擎中的数据结构更加方便内存的管理,提高访问效率;游戏中有的不只是一行行的源代码,还有各种格式的多媒体文件,如PhotoShop的PSD文件、3DSMAX的MAX文件,加载管理这一系列的图形、图像、音频、视频文件以及其他数据,就是资源层的任务了。这样的分层架构使得上层灵活,底层稳定,更有利于功能的更新和开发。原创 2024-03-03 21:17:18 · 4228 阅读 · 0 评论 -
游戏开发中的噪声算法
Value噪声是最简单的一种噪声,其主要思路是定义若干个顶点且每个顶点含有一个随机值(以顶点坐标作为参数通过哈希运算得到的),该随机值会周围坐标产生影响,越靠近顶点则越容易受该顶点影响(输出值越接近顶点随机值)。Simplex噪声也是一种基于晶格的梯度噪声,它和Perlin噪声在实现上唯一不同的地方在于,它的晶格并不是方形(在2D下是正方形,在3D下是立方体,在更高纬度上我们称它们为超立方体,hypercube),而是单形(simplex)。1.首先定义一个晶格结构,每个晶格的顶点有一个随机的梯度向量。原创 2024-01-19 14:57:30 · 2750 阅读 · 1 评论 -
空间数据结构(四叉树、八叉树、BVH树、BSP树、k-d树)
在游戏程序中,利用空间数据结构加速计算往往是非常重要的优化思想,空间数据结构可以应用于场景管理、渲染、物理、游戏逻辑等方面。原创 2024-01-18 14:29:04 · 3571 阅读 · 0 评论