
Game Engine
文章平均质量分 85
BugRunner
这个作者很懒,什么都没留下…
展开
-
碰撞检测之分离轴测试(Separate Axis Testing)
分离轴测试(Separate Axis Testing)是空间碰撞检测中一个很常用、很有效的判断方法。它的原理来源于集合分析中的“分离超平面定理”(separating hyper-plane theorem):如果两个集合A和B不相交,那么必定存在一个分离超平面P,并使得A和B分别位于P的不相同的两侧。此定理对于空间数据中的凸集合和凹集合均适用。当数据集是凸集时这里的分离超平面就是一个空间的原创 2010-07-11 17:29:00 · 6718 阅读 · 6 评论 -
Shadow Caster Culling
最近读到去年I3D上面的一篇论文,Shadow Caster Culling for Efficient Shadow Mapping,觉得不错,这里简单总结一下。对于算法的基本原理还是比较容易理解的,可以见下图所示。从图中可以看出对于当前某特定帧下的Camera来说,其可见的几何体元是整个场景的一个有限子集,而需要做阴影计算的也必然是这些可见几何体元集的一个子集,因而在生成Shadow Ma原创 2012-06-09 18:23:10 · 4104 阅读 · 0 评论 -
Vertex Baking
顶点颜色渲染是一种较早的渲染方法,它为模型的三维网格中的每个顶点提供一组单独的颜色值,然后在传入硬件进行光栅化渲染时GPU会根据顶点的颜色对每个像素进行相应的插值而得到Pixel上的颜色值,进而为多边形着上渐变色。由其操作模式可知,一个三角形内部的像素受到其关联的三个顶点上的颜色值所影响而不论三角形的大小,因而若三角形的密度较大时这种方法还是很不错的,但是,当整个网格中三角形的密度较小时(大面种区原创 2012-06-16 22:39:10 · 3330 阅读 · 0 评论 -
计算Cube Map的SH系数
DX提供了一组用来操作Sphereical Harmonic的基本函数,如D3DSHAdd、D3DSHDot、D3DSHEvalDirection等;其中有一个是D3DSHProjectCubeMap,用来从CubeMap投影得到对应的SH系数,还是蛮有用的。一般情况下,在游戏场景中需要使用Light Probe时需要设置不同的采样点,然后生成对应上的Probe并计算SH系数,这些SH系数用来实时原创 2012-07-03 22:07:54 · 5755 阅读 · 4 评论 -
关于游戏中的特效
特效是游戏中增加交互印象的很重要一方面,一个好的特效系统能够很大程度上提高游戏的特色。这尤其体现在动作游戏上,比如God of War,Ninja Gaiden等系列中的特效效果就很出彩。这里简单总结一下自己所了解的一些游戏中较为常见的特效:公告板公告板效果就是直接使用公告板来渲染出一定的特殊效果。常规公告板的面方向始终与视线的方向垂直,但是也可以增加其属性设置为不必与视线垂直,此时即相当原创 2012-06-30 21:43:31 · 9101 阅读 · 1 评论 -
Some Shading Models in realtime rendering
前段时间有在这里(http://www.fseraph.com/?p=661)看到关于实时渲染中的一些常见渲染模型的总结,最近于是也找了些资料学习了一下,这里简单总结一下。1. 一些基本概念Photon(光子): 波粒二象性;属于粒子;拥有波长;具有能量Radiant Energy(辐射能量): 光子集所具有的能量,,单位:(焦耳)Radiant flux(辐射通量) , Radian原创 2012-08-17 22:18:05 · 5618 阅读 · 0 评论 -
Directional Light Map(Directional Irradiance)
Light Map是一个比较经典的技术,目前来说应该是一般游戏引擎中的标配,它很好的在一种拟全局光效果的质量和效率上做了中和。不过目前用的更多、质量更好的应该是Directional Light Map,它是原始LM的增强版,通过在预处理与实时还原中考量场景中表面的法向量进而增强效果。DLM的基本操作方法如下:在采样点处把其半球空间中的辐射照度用某种方法进行采集并保存(比如离线的光线跟踪)原创 2012-08-19 01:30:57 · 7334 阅读 · 0 评论 -
Voxel Cone Tracing based Global Illumination
之前很早就看到了UE4中的基于Sparse Voxel Octree的RTGI,效果很酷,一直尝试作些研究与实现,但苦于没机会。前段得空,抽时间学习了一下,这里小结一下备忘。整个算法主要分类几个过程:体素化、Mipmap OCTree、Cone Tracing。1. Voxelization体素化整个GI算法的基础。这里体素化可以采用的方法也比较多,主要有以下几种:直接将体原创 2013-05-23 16:09:33 · 15211 阅读 · 14 评论 -
Multi-Thread Programming Resources for Game Engine
From http://www.geeks3d.com/20100418/game-engine-multi-threading-programming-resources/Here is a collection of links that can be useful for multithreaded programming. Threads creation, data synchr转载 2013-05-24 22:40:05 · 6067 阅读 · 0 评论 -
基于FBX SDK的FBX模型解析与加载 -(一)
1. 简介 FBX是Autodesk的一个用于跨平台的免费三维数据交换的格式(最早不是由Autodesk开发,但后来被其收购),目前被 众多的标准建模软件所支持,在游戏开发领域也常用来作为各种建模工具的标准导出格式。Autodesk提供了基于C++(还有Python)的SDK来实现对FBX格式的各种读写、修改以及转换等操作,之所以如此是因为FBX的格式不是公开的,这也是FBX的诟病之一。与FB原创 2012-01-19 16:45:27 · 80759 阅读 · 46 评论 -
HDR Image encoding formats
HDR图像的编码与存储是PRBT、IBL中的一个重要问题。其主要是将scene-referred的颜色信息存储并保存后在渲染时进行使用,然后通过tone-mapping这样的操作将其映射到output-referred的R8G8B8的颜色值并输出到终端显示器上。当然,一般来说不需要直接存储并读取HDR图像,但如果要实现一些PBRT的效果或是一个自己的LightMap baker的话,那么HDR的存原创 2014-07-27 23:54:33 · 6802 阅读 · 0 评论 -
几种主流贴图压缩算法的实现原理
前段时间一直在搞项目上线前的各种优化,关于贴图压缩这块也是需要针对不同的平台做不同的设置,这里备忘一下在各种平台中常使用的几种贴图压缩格式及其细节,以便更加适宜地选择在特定设备下的压缩格式以便节省资源。关于移动平台和硬件设备与压缩格式的对应关系可以参考下这里,基本上比较清楚了。1. DXTCDXTC(或BC)为微软为DX而推出的基于block的贴图压缩格式,其主要采用调色板的原理来进行压缩。BC1原创 2016-03-15 23:29:09 · 31500 阅读 · 2 评论 -
Texture UV Atlas
UV的Atlas操作在某些场合下还是很有用途的,比如很常见的对于场景进行的LightMap烘焙时。这时就需要对于整个场景中的几何体元进行Light Map UV的生成,也即是将其投影到了一张Texture中去,且要求所有的几何体元对应唯一的Light Map UV(即在这一张纹理中没有相互重叠,以便取到正确的烘焙信息)。UV Atlas其实是一个传统的NP hard问题,一般来说都是通过某些最优化原创 2012-05-13 23:09:40 · 8096 阅读 · 2 评论 -
Tetrahedron based light probe interpolation(基于四面体的Light Probe插值)
在当前的游戏引擎中,使用Light Probe来计算全局环境光对于动态物体的影响是一种很主流的方法。在预处理阶段生成完场景的Light Probe之后,传统的方法采用查找最近的8个相邻的Probe然后使用三线性的方式(Trilinear Interpolation)进行插值,但是这样的插值代价稍大,不过一个可行的优化就是尽可能地减少插值中使用的Probe的数量,比如由8个减少到4个不等。但是这时就原创 2012-04-21 23:06:36 · 8007 阅读 · 1 评论 -
Deferred Decal(延迟贴花)
Decal渲染是一个引擎中重要的一部分,记忆中印象最深刻的就是以前CS中的弹痕与爆炸痕迹了。目前来说,Decal的实现方法也比较多,而且感觉还跟游戏类型有关,比如子弹乱飞的射击类FPS游戏中对贴花系统的要求就比较高,因为本来Decal的变化就比较丰富。一般来说贴花渲染主要有两种实现方法:Texture projection关于投影纹理的原理网上也有很多文章,基本就是需要对地形渲染两遍,一遍原创 2012-04-03 01:11:48 · 19814 阅读 · 8 评论 -
基于FBX SDK的FBX模型解析与加载 -(四)
8. 骨骼蒙皮动画骨骼蒙皮动画是当前游戏引擎中最常用的一种动画方式,关于其基本原理网络上的资料较多,关于到涉及的其它较复杂操作,如插值、融合等在这里也就先不再讨论了,而且其实现方式也与具体引擎的动作管理系统相关;在这里就主要简单介绍一下如何从FBX里加载骨骼以及蒙皮信息并完成最基本的蒙皮动画效果。骨骼动画的实现主要包括骨骼的驱动和蒙皮两部分操作,骨骼的驱动在前一篇中介绍动画数据的加载时已经完成原创 2012-02-03 19:26:02 · 21271 阅读 · 12 评论 -
计算三角网格的顶点法向量
前段时间基本上完成了场景编辑器的大部分工作,现在已经可以用它生成自己需要的网格模型了。目前,在编辑器中对生成的网格是指定面的法向量,这对于用场景生成BSP等相关操作已经足够了。不过为了测试BSP的健壮性,准备实现一下基于BSP的光线跟踪算法来看看效果,于是只是指定面的法向量就显得不太够用,因为在逐像素作着色时就需要对面上各个点的法向量进行插值,因此就需要各个顶点的法向量。查了下相关的资料,找到了一原创 2010-02-11 21:16:00 · 12029 阅读 · 1 评论 -
基于FBX SDK的FBX模型解析与加载 -(二)
5. 加载材质 Material是一个模型渲染时必不可少的部分,当然,这些信息也被存到了FBX之中(甚至各种贴图等也可以直接内嵌到FBX内部),就需要从FBX中加载这些信息以完成带有材质的渲染。材质的加载可以与Mesh的加载相结合来完成,但更好的方法是独立进行,这样各模块间的关系更清晰,但这就需要一个额外的操作,那就是关联Mesh与Material。FBX中的材质对象包含了丰富的信息,比如最常原创 2012-01-19 22:27:00 · 25515 阅读 · 13 评论 -
辐射度算法的CUDA实现
1. 简介辐射度算法是一种经典的全局光照算法,它可以解决光线跟踪等直接照明方法中所不能表现的真实世界中的照明现象问题。虽然渲染的结果表现力强,但是问题之一就是算法的耗费较大,由于其原理就是对各个多边形面片进行着色,而且常常需要较多的迭代次数才能达到比较理想的效果,因此算法原理虽然比较简单,但效率就成为一个重要的瓶颈。 2. 辐射度算法原理辐射度算法的原理就是模拟真实世界中的光照原理原创 2010-03-10 22:29:00 · 7071 阅读 · 1 评论 -
基于FBX SDK的FBX模型解析与加载 -(三)
6. 加载Camera和Light在FBX模型中除了几何数据外较为常用的信息可能就是Camera和Light,虽然在游戏中一般不直接从模型中得到这两部分信息,而是由引擎来提供,但是FBX中提供了对这些信息保存的支持。其实单纯加载这两部分的信息很简单,就像之前介绍的在整个Scene Graph中对每个Node遍历过程中,判断得到当前结点是Camera或Light时调用相应的ProcessCame原创 2012-02-02 19:32:00 · 18495 阅读 · 11 评论 -
Lin-Canny算法求解凸包间的最近点对
求解凸包间的最近点对是几算几何中一个非常有用的算法,经常被用在谐如碰撞检测、物理引擎等图形学相关的领域,而且该算法的效率对于最终整个系统的效能有着相当关键的制约。常规的对于几何体之间的最近点对求解一般即是暴力的遍历算法,这种效率太过于低下,不具有普遍的适用意义,尤其是在一个较大的碰撞系统里边。因而,Lin以及Canny等人提出了渐进式求解的Lin-Canny算法。Lin-Canny算法的主要用原创 2011-03-08 14:21:00 · 4268 阅读 · 0 评论 -
Normal Transformation(法线变换)
关于三维空间法线变换的问题,之前就有看到过,但是一直也木有注意,普通的三维空间中的法线变换还是直接使用模型的变换矩阵来进行。但是,近来又看到了一些这方面相关的东西,因而总结一下。已经知道不能直接用模型变换矩阵来变换Normal,比如使用某含有非一致性缩放(在x,y,z方向上进行不程度的拉伸)的变换矩阵来变换一球体,则可能得到如下列图示的结果: 左图为原始球体及其表面上的法向分布(2D原创 2012-02-22 23:47:22 · 9522 阅读 · 0 评论 -
Ambient Occlusion(AO)
AO(Ambient Occlusion)是图形学领域近来较为流行的用来获取较为真实的全局光照效果的一种方法。这种方法针对要渲染的全局场景,利用每个渲染像素点周围的几何体分布的遮挡信息来确定当前点的AO效果。基于AO的渲染方法可以有效地增强人类视觉系统对场景全局的认知能力[Luft06]。它提供了很好的一种质量和速度间的均衡。1. AO的理论基础 传统的实现方法,通常使用光线跟踪的方原创 2011-05-10 14:21:00 · 8597 阅读 · 3 评论 -
Point与AABB间的最远点对
最近需要做一些碰撞检测相关的东西。AABB是游戏引擎中最常用的碰撞基本体了,具有各种优良的特性。其本身的自交判断很简单(这句话咋恁别扭呢*~*),而且与其它形体的相交判断也不是很复杂。求一点到AABB上的最近点对很常用,也比较简单,代码如下所示:void ClosestPtPointAABB(const Point& p , const AABB& b , Point& q){ for (原创 2012-03-14 00:30:52 · 2868 阅读 · 0 评论 -
Barycentric Coordinates of Tetrahedron (计算四面体的重心坐标)
四面体应该是说空间体状结构的最简单形式,只需要四个顶点就可以构成,某些情况下可能需要用四面体来做一些插值之类的操作,或是碰撞检测(比如判断一个点是否在四面体的内部),这些都可以用其重心坐标来成(Barycentric Coordinates)。四面体的重心坐标跟三角形的重心坐标类似,都是找到组成四面体的几个顶点与目标点之间的权重关系,进而来描述该目标点。一般情况下,三角形重心坐标的计算方法是使用对原创 2012-04-03 16:02:02 · 15772 阅读 · 2 评论 -
Cascaded Shadow Map(CSM)中的一些问题
Cascaded Shadow Map(CSM)是目前引擎中主流的阴影技术,效率与效果均不错。它与传统的单张Shadow Map的区别主要在于将视锥体进行了层次的分解,每一层单独计算相关的SM,这样在渲染大场景的阴影就可以避免传统的SM的各种缺点。典型的CSM原理基本上如下图所示:虽然看起来原理简单,但是在实际中想实现一个健壮的CSM并不容易,涉到各种问题,其中一些是这种方法本身就固有的,原创 2012-03-18 17:20:08 · 13599 阅读 · 3 评论 -
Deferred Shading VS Deferred Lighting
鉴于传统的Forward Rendering对于多光源渲染时的低效问题,各种Deferred Rendering的方法被提出并且广泛使用。比如Deferred Shading以及其之后的Deferred Lighting。Deferred方法相对于传统Forward Rendering最主要区别都是提高了对多光源渲染时的效率,它是是将光源的计算转到屏幕空间来进行,进而不浪费无效的光源着色。Defe原创 2012-04-08 00:43:20 · 21405 阅读 · 1 评论