
Game Development
文章平均质量分 74
BugRunner
这个作者很懒,什么都没留下…
展开
-
几种主流贴图压缩算法的实现原理
前段时间一直在搞项目上线前的各种优化,关于贴图压缩这块也是需要针对不同的平台做不同的设置,这里备忘一下在各种平台中常使用的几种贴图压缩格式及其细节,以便更加适宜地选择在特定设备下的压缩格式以便节省资源。关于移动平台和硬件设备与压缩格式的对应关系可以参考下这里,基本上比较清楚了。1. DXTCDXTC(或BC)为微软为DX而推出的基于block的贴图压缩格式,其主要采用调色板的原理来进行压缩。BC1原创 2016-03-15 23:29:09 · 31500 阅读 · 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 评论 -
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 评论 -
Cascaded Shadow Map(CSM)中的一些问题
Cascaded Shadow Map(CSM)是目前引擎中主流的阴影技术,效率与效果均不错。它与传统的单张Shadow Map的区别主要在于将视锥体进行了层次的分解,每一层单独计算相关的SM,这样在渲染大场景的阴影就可以避免传统的SM的各种缺点。典型的CSM原理基本上如下图所示:虽然看起来原理简单,但是在实际中想实现一个健壮的CSM并不容易,涉到各种问题,其中一些是这种方法本身就固有的,原创 2012-03-18 17:20:08 · 13599 阅读 · 3 评论 -
Barycentric Coordinates of Tetrahedron (计算四面体的重心坐标)
四面体应该是说空间体状结构的最简单形式,只需要四个顶点就可以构成,某些情况下可能需要用四面体来做一些插值之类的操作,或是碰撞检测(比如判断一个点是否在四面体的内部),这些都可以用其重心坐标来成(Barycentric Coordinates)。四面体的重心坐标跟三角形的重心坐标类似,都是找到组成四面体的几个顶点与目标点之间的权重关系,进而来描述该目标点。一般情况下,三角形重心坐标的计算方法是使用对原创 2012-04-03 16:02:02 · 15772 阅读 · 2 评论 -
Rodrigues' Rotation Matrix(罗德里格旋转矩阵)
使用蒙特卡洛方法做半球面采样时遇到有这样的一个问题:默认产生的采样向量组所在的半球面是Y轴(或其它轴)所对应的方向,但是在使用时可能就需要根据法向量对其进行变换,于是就有了这样一个问题,给定两个向量V0和V1 计算出一旋转矩阵R得到:R V0 =V1这个问题其实蛮简单,可以直接用两个向量的点积与叉乘计算出对应的夹角与旋转轴,然后组合出旋转矩阵即可(http://en.wikipedia.o原创 2012-03-15 23:38:18 · 24160 阅读 · 3 评论 -
Point与AABB间的最远点对
最近需要做一些碰撞检测相关的东西。AABB是游戏引擎中最常用的碰撞基本体了,具有各种优良的特性。其本身的自交判断很简单(这句话咋恁别扭呢*~*),而且与其它形体的相交判断也不是很复杂。求一点到AABB上的最近点对很常用,也比较简单,代码如下所示:void ClosestPtPointAABB(const Point& p , const AABB& b , Point& q){ for (原创 2012-03-14 00:30:52 · 2868 阅读 · 0 评论 -
Ambient Occlusion(AO)
AO(Ambient Occlusion)是图形学领域近来较为流行的用来获取较为真实的全局光照效果的一种方法。这种方法针对要渲染的全局场景,利用每个渲染像素点周围的几何体分布的遮挡信息来确定当前点的AO效果。基于AO的渲染方法可以有效地增强人类视觉系统对场景全局的认知能力[Luft06]。它提供了很好的一种质量和速度间的均衡。1. AO的理论基础 传统的实现方法,通常使用光线跟踪的方原创 2011-05-10 14:21:00 · 8597 阅读 · 3 评论 -
Bilateral Filtering(双边滤波) for SSAO
1. 简介图像平滑是一个重要的操作,而且有多种成熟的算法。这里主要简单介绍一下Bilateral方法(双边滤波),这主要是由于前段时间做了SSAO,需要用bilateral blur 算法进行降噪。Bilateral blur相对于传统的高斯blur来说很重要的一个特性即可可以保持边缘(Edge Perseving),这个特点对于一些图像模糊来说很有用。一般的高斯模糊在进行采样时主要考虑了像素原创 2012-01-01 20:31:49 · 55397 阅读 · 2 评论 -
Bent Normal (环境法线?)
前段时间读论文看到了Bent Normal这个概念,找了些相关的资料学习了一下。Bent Normal常见于离线的Ambient Occlusion渲染中(中文翻译过来应该叫做环境法线?网上搜索看有些地方是这么叫的),从它的字面意思中即可以看出其同样是一种Normal,只不过是做了修改变形(Bent)。这个Bent是如何计算而来的呢?这个Bent Normal又有什么用外呢?这里做个简单的介绍。原创 2012-02-19 20:58:15 · 19486 阅读 · 0 评论 -
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 评论 -
Shadow Caster Culling
最近读到去年I3D上面的一篇论文,Shadow Caster Culling for Efficient Shadow Mapping,觉得不错,这里简单总结一下。对于算法的基本原理还是比较容易理解的,可以见下图所示。从图中可以看出对于当前某特定帧下的Camera来说,其可见的几何体元是整个场景的一个有限子集,而需要做阴影计算的也必然是这些可见几何体元集的一个子集,因而在生成Shadow Ma原创 2012-06-09 18:23:10 · 4104 阅读 · 0 评论 -
Unity Notes之配置文件基于内容的差异化更新
游戏项目中各种策划配置的表格更新最近格式频繁,因为策划要反复来调节一些数值。这些个调整对于线上版本一般就通过差异化动态更新的方式来更新的玩家的客户端中。这过程中有一个问题,就是有的时间策划一更新的内容很小,比如只是在其中增删了一种物品的配置记录,而这样的话也就相当于这个表格整体有了修改,需要全部更新到客户端上去,这样做使得更新的资源量比较多。于是就添加了基于xml(这里用的是xml来做配置表格)的原创 2015-06-14 19:32:36 · 3435 阅读 · 1 评论 -
基于FBX SDK的FBX模型解析与加载 -(一)
1. 简介 FBX是Autodesk的一个用于跨平台的免费三维数据交换的格式(最早不是由Autodesk开发,但后来被其收购),目前被 众多的标准建模软件所支持,在游戏开发领域也常用来作为各种建模工具的标准导出格式。Autodesk提供了基于C++(还有Python)的SDK来实现对FBX格式的各种读写、修改以及转换等操作,之所以如此是因为FBX的格式不是公开的,这也是FBX的诟病之一。与FB原创 2012-01-19 16:45:27 · 80759 阅读 · 46 评论 -
Sparse Voxel DAGs
Siggraph 2013上面的一篇新文:High Resolution Sparse Voxel DAGs,主要介绍了一种基于图的稀疏体素空间存储结构。其主要是对SVO做了进一步的改进,减少里边的共享结点的冗余存储,将其用directed acyclic graph(DAG)直接连接,如下图所示:其创建方法也是基于SVO来进行自底向上的逐层合并(自顶向下效率较低),其中有用到一些原创 2013-06-16 18:09:23 · 5788 阅读 · 1 评论 -
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 评论 -
使用Ant自动构建Android版本
Ant是一个很好的跨平台构建工具,特别是对于Java项目,这里使用它对Android工程进行自动化构建可以得到非常大的便利。一般来说对Android工程进行构建主要有以下几个步骤:使用aapt来编译工程生成R.java;使用aapt来对工程所需用的资源进行打包;转换并编译AIDL文件;编译Java源文件并生成.class;转换并压缩.class文件成.dex文件;使用aapt打包生成未原创 2012-11-19 14:03:24 · 4230 阅读 · 0 评论 -
Directional Light Map(Directional Irradiance)
Light Map是一个比较经典的技术,目前来说应该是一般游戏引擎中的标配,它很好的在一种拟全局光效果的质量和效率上做了中和。不过目前用的更多、质量更好的应该是Directional Light Map,它是原始LM的增强版,通过在预处理与实时还原中考量场景中表面的法向量进而增强效果。DLM的基本操作方法如下:在采样点处把其半球空间中的辐射照度用某种方法进行采集并保存(比如离线的光线跟踪)原创 2012-08-19 01:30:57 · 7334 阅读 · 0 评论 -
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 评论 -
关于游戏中的特效
特效是游戏中增加交互印象的很重要一方面,一个好的特效系统能够很大程度上提高游戏的特色。这尤其体现在动作游戏上,比如God of War,Ninja Gaiden等系列中的特效效果就很出彩。这里简单总结一下自己所了解的一些游戏中较为常见的特效:公告板公告板效果就是直接使用公告板来渲染出一定的特殊效果。常规公告板的面方向始终与视线的方向垂直,但是也可以增加其属性设置为不必与视线垂直,此时即相当原创 2012-06-30 21:43:31 · 9101 阅读 · 1 评论 -
计算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 评论 -
Vertex Baking
顶点颜色渲染是一种较早的渲染方法,它为模型的三维网格中的每个顶点提供一组单独的颜色值,然后在传入硬件进行光栅化渲染时GPU会根据顶点的颜色对每个像素进行相应的插值而得到Pixel上的颜色值,进而为多边形着上渐变色。由其操作模式可知,一个三角形内部的像素受到其关联的三个顶点上的颜色值所影响而不论三角形的大小,因而若三角形的密度较大时这种方法还是很不错的,但是,当整个网格中三角形的密度较小时(大面种区原创 2012-06-16 22:39:10 · 3330 阅读 · 0 评论 -
Spherical Harmonic Lighting(球谐光照)
1.简介 球谐光照是实时渲染技术中的一种,属于Precompute Radiance Transfer(PRT)的范畴。经过预处理并存储相应的信息之后,它可以产生高质量的渲染及阴影效果。球谐光照需要使用新的光照方程来代替通常的光照方程,并将该方程中的相关信息使用球谐基函数来投影到频度空间,并用系数进行表示(该变换与信号处理中的Fourier变换同样的道理)以一定的方式存储。在渲染的过程中就结合原创 2011-11-21 00:16:33 · 19139 阅读 · 8 评论 -
Normal Transformation(法线变换)
关于三维空间法线变换的问题,之前就有看到过,但是一直也木有注意,普通的三维空间中的法线变换还是直接使用模型的变换矩阵来进行。但是,近来又看到了一些这方面相关的东西,因而总结一下。已经知道不能直接用模型变换矩阵来变换Normal,比如使用某含有非一致性缩放(在x,y,z方向上进行不程度的拉伸)的变换矩阵来变换一球体,则可能得到如下列图示的结果: 左图为原始球体及其表面上的法向分布(2D原创 2012-02-22 23:47:22 · 9522 阅读 · 0 评论 -
Screen Space Ambient Occlusion(SSAO)
1. 简介AO(Ambient Occlusion)是全局光照中(Global Illumination)中一个很重要的概念,主要用来描述物体间的相互遮挡关系 以及漫射光线之间相互作用的效果。AO的主要方法是在每个采样点上计算它被其它几何体元遮挡的程度,进而得到在一个统一的光照强度下场景中的软阴影效果的图形算法。一般的3D处理软件中均有该算法提供,但是所有这些都是基于离线的渲染,直到在CryT原创 2011-12-25 19:04:22 · 19125 阅读 · 11 评论 -
在D3D中使用MRT(Multiple Render Targets)
Multi-Render Target(MRT)可以使程序在一次渲染中同时写数据到多个Render Target中。这个特性在做Post Effect中很有用,比如需要写Depth, Normal,Geometry数据到RT中以待后用时,使用MRT可以减少生成这些数据的Pass。使用MRT的过程中主要有以下步骤:MRT的使用需要硬件的支持,在使用前可以先查询硬件的支持能力。在获原创 2011-12-09 11:54:22 · 7385 阅读 · 0 评论 -
空间分割加速三维数据的查询
最近在对一些模型进行轻量化的处理,需要压缩模型的大小,并且要求可以较快的读取加载。原始的模型由3DMax导出的FBX获得,鉴于上述要求与FBX模型的格式就选择了与渲染时的Vertex Buffer最接近的方式来对模型进行存储,存储结构如下:Triangle Data->Vertex Data其中每个Triangle data存储其所对应的顶点的索引,每个顶点数据中又存储其对应的Positi原创 2011-10-31 22:21:28 · 2314 阅读 · 2 评论 -
VS中对.fx文件进行Custom Build的设置
对于D3D中.fx文件进行编译可以直接使用D3D Tools中的fxc.exe,或是在程序运行后加载.fx文件的时间调用fx编译器进行编译,但这样种种不便。受CUDA文件编译设置的启发,同样可以对.fx进行custom build设置,进而直接调用fxc.exe进行编译。原创 2011-08-13 21:24:14 · 11751 阅读 · 6 评论 -
SouTek Engine(一)之UI
引擎的第一个主部分是UI系统,而UI的主要原则就是尽可能地简约。最典型的例子就是Source引擎下的半条命中的UI系统,其尽管简单却令人印象深刻且操作方便。其实,现在想来觉得不使用第三方库,转而来做自己的UI系统是一个不太好的想法,毕竟这部分也需要很大的工程量,而且做出来之后有没有美感、效果如何等还是很重要的问题。不过由于最初已经决定了实现自己的UI系统,而且此前已经实现了大部分的工作,那就将它彻底完成得了。在目前的情况看来对ST的UI系统还是比较满意的。原创 2010-06-09 21:32:00 · 2582 阅读 · 0 评论 -
10 Fun Things to do with Tessellation
Direct3D11 extends the Direct3D10 pipeline with three new stages: Two programmable shader stages (the Hull and Domain Shaders), and a fixed function stage (the Tessellator). More details can be foundhere and here.Rendering of Catmull-Clark subdivision su转载 2010-07-10 15:17:00 · 4520 阅读 · 0 评论 -
OpenGL Geometry Shader
Geometry Shader可以处理Vertex Shader和Fragment Shader不能完成的一些操作。不含GS的可编程管线的传统处理流程是:1. 顶点数据准备2. Vertex Shader操作3. 完成Vertex Shader4. 光栅化操作5. Fragment Shader6.原创 2010-04-06 17:18:00 · 7914 阅读 · 2 评论 -
非真实渲染(二)——Toon Shading
Toon Shading是一种简单、基本的卡通着色方式,其着色的主要效果是用大块、突变的色调来代替正常情况中的渐变色调,从而表现出卡通效果。使用这种渲染方法,然后再结合轮廓边界线的勾勒,这种渲染方式也能得到很赏心悦目的表现效果。 其主要实现方式即是计算得到当前像素得的法线与光线之间的夹角,然后根据此夹角大小在颜色表中查找当前像素所应具有的Toon color,用这个颜原创 2010-04-02 22:09:00 · 9206 阅读 · 0 评论 -
非真实渲染(一)
轮廓和边界的提取是非真实渲染中一个常用的表现方法,由于它的卡通描述风格,尽管结构简单但却对整体效果的表现有极大的增强效果。基本的轮廓边界提取方法有基于图像空间和基于3D空间的方法:基于图像空间的方法利用传统渲染管线来得到当前模型投影的辅助信息,然后用这些信息来提取模型的轮廓和边界。这种方法速度较快,效率较高,但是提取的轮廓可能会不连贯,而且得到的轮廓是基于像素而非几何的,因此一般不可控,不太原创 2010-03-30 23:04:00 · 7876 阅读 · 0 评论 -
GLSL实现ShadowMap及阴影软化
Shadow Map是一种成熟的实时阴影生成技术,由于其实现较为简单、方便,而且因为是基于图像空间的,故而与场景的空间复杂度关联度不大,故而在游戏中广为使用。原理:1. 生成深度纹理。将场景的深度值在光源所在的投影坐标系下进行生成并存储,进而得到深度纹理。 2. 正常渲染场景并查询深度纹理进行阴影判断。在片断着色器中将当前片段变换到光源矩阵中,得到该片段在此坐标原创 2010-03-27 19:25:00 · 8931 阅读 · 4 评论 -
VS中CUDA环境的配置
首先,需要安装CUDA显卡驱动、CUDA Sdk及CUDA Tool-Kit。 1. 自定义链接模式a. 在*.cu上右键【属性】->【常规】->【工具】,选择“自定义生成工具”b. 选择“自定义生成步骤”,在“命令行”使用以下设定: Release模式:"$(CUDA_BIN_PATH)/nvcc.exe" -ccbin "$(VCInstallDir)bin"原创 2010-03-07 20:04:00 · 4420 阅读 · 0 评论 -
LightMap的创建与生成
为了增加场景的表现力,在渲染中添加光照效果必不可少。首先用某种算法对整个场景生成光照渲染效果,然后再将光照渲染效果以纹理的方式来存储,将场景中各个多边形所对应的光照效果存于光照贴图中,这样的话在实时渲染时,只需要对场景在原有纹理渲染的基础上添加多纹理的融合即可渲染出光照效果。然而这样得到的光照贴图是和场景中每个单一多边形相对应的,因此若场景中有N个多边形就需要对应N个光照贴图,这样在渲染时就需要对原创 2010-03-17 17:50:00 · 6136 阅读 · 6 评论 -
光照贴图生成中的精度问题
使用全局光照贴图对场景进行渲染,首先就需要对场景进行光照贴图的生成,同时计算出场景中各个多边形的顶点所对应的纹理坐标,然后再对多边形列表的光照贴图进行合并,并进行纹理坐标的重新定位,这样就可以生成整个场景的一张光照贴图,从而实现带有光照效果的高效率渲染。理论上,在渲染时各个多边形根据它所对应的纹理坐标来访问场景光照贴图就能得到正确的显示效果,但在实际中却由于浮点运算的精度误差而使得到的纹理坐标原创 2010-03-20 23:28:00 · 5532 阅读 · 0 评论 -
基于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 评论