- 博客(79)
- 资源 (9)
- 收藏
- 关注
原创 Normal Transformation(法线变换)
关于三维空间法线变换的问题,之前就有看到过,但是一直也木有注意,普通的三维空间中的法线变换还是直接使用模型的变换矩阵来进行。但是,近来又看到了一些这方面相关的东西,因而总结一下。已经知道不能直接用模型变换矩阵来变换Normal,比如使用某含有非一致性缩放(在x,y,z方向上进行不程度的拉伸)的变换矩阵来变换一球体,则可能得到如下列图示的结果: 左图为原始球体及其表面上的法向分布(2D
2012-02-22 23:47:22
9565
原创 Bent Normal (环境法线?)
前段时间读论文看到了Bent Normal这个概念,找了些相关的资料学习了一下。Bent Normal常见于离线的Ambient Occlusion渲染中(中文翻译过来应该叫做环境法线?网上搜索看有些地方是这么叫的),从它的字面意思中即可以看出其同样是一种Normal,只不过是做了修改变形(Bent)。这个Bent是如何计算而来的呢?这个Bent Normal又有什么用外呢?这里做个简单的介绍。
2012-02-19 20:58:15
19858
1
原创 基于FBX SDK的FBX模型解析与加载 -(四)
8. 骨骼蒙皮动画骨骼蒙皮动画是当前游戏引擎中最常用的一种动画方式,关于其基本原理网络上的资料较多,关于到涉及的其它较复杂操作,如插值、融合等在这里也就先不再讨论了,而且其实现方式也与具体引擎的动作管理系统相关;在这里就主要简单介绍一下如何从FBX里加载骨骼以及蒙皮信息并完成最基本的蒙皮动画效果。骨骼动画的实现主要包括骨骼的驱动和蒙皮两部分操作,骨骼的驱动在前一篇中介绍动画数据的加载时已经完成
2012-02-03 19:26:02
21342
4
原创 基于FBX SDK的FBX模型解析与加载 -(三)
6. 加载Camera和Light在FBX模型中除了几何数据外较为常用的信息可能就是Camera和Light,虽然在游戏中一般不直接从模型中得到这两部分信息,而是由引擎来提供,但是FBX中提供了对这些信息保存的支持。其实单纯加载这两部分的信息很简单,就像之前介绍的在整个Scene Graph中对每个Node遍历过程中,判断得到当前结点是Camera或Light时调用相应的ProcessCame
2012-02-02 19:32:00
18574
11
原创 基于FBX SDK的FBX模型解析与加载 -(二)
5. 加载材质 Material是一个模型渲染时必不可少的部分,当然,这些信息也被存到了FBX之中(甚至各种贴图等也可以直接内嵌到FBX内部),就需要从FBX中加载这些信息以完成带有材质的渲染。材质的加载可以与Mesh的加载相结合来完成,但更好的方法是独立进行,这样各模块间的关系更清晰,但这就需要一个额外的操作,那就是关联Mesh与Material。FBX中的材质对象包含了丰富的信息,比如最常
2012-01-19 22:27:00
25577
原创 基于FBX SDK的FBX模型解析与加载 -(一)
1. 简介 FBX是Autodesk的一个用于跨平台的免费三维数据交换的格式(最早不是由Autodesk开发,但后来被其收购),目前被 众多的标准建模软件所支持,在游戏开发领域也常用来作为各种建模工具的标准导出格式。Autodesk提供了基于C++(还有Python)的SDK来实现对FBX格式的各种读写、修改以及转换等操作,之所以如此是因为FBX的格式不是公开的,这也是FBX的诟病之一。与FB
2012-01-19 16:45:27
80940
46
原创 使用XeLaTeX/XeTeX编译中文文档
最近需要写一些文档,就重新用到了LaTeX。不得不说,这个东西真是个好东西,之前在学校写论文那会就已经充分发现它相对于Word来排版的优势。不过之前所写的文档都是用的现成模板,而且其中的中文字体多是宋体。现在老是觉着用微软雅黑排出来的中文版式比宋体更漂亮,因此就想把之前的格式均转化成微软雅黑的。但是普通的中文都是使用CJK包来扩展,而且可以支持的中文字体也很有限,最近搜索后发现XeLaTeX对中文
2012-01-13 17:37:39
44190
原创 Bilateral Filtering(双边滤波) for SSAO
1. 简介图像平滑是一个重要的操作,而且有多种成熟的算法。这里主要简单介绍一下Bilateral方法(双边滤波),这主要是由于前段时间做了SSAO,需要用bilateral blur 算法进行降噪。Bilateral blur相对于传统的高斯blur来说很重要的一个特性即可可以保持边缘(Edge Perseving),这个特点对于一些图像模糊来说很有用。一般的高斯模糊在进行采样时主要考虑了像素
2012-01-01 20:31:49
55484
12
原创 Screen Space Ambient Occlusion(SSAO)
1. 简介AO(Ambient Occlusion)是全局光照中(Global Illumination)中一个很重要的概念,主要用来描述物体间的相互遮挡关系 以及漫射光线之间相互作用的效果。AO的主要方法是在每个采样点上计算它被其它几何体元遮挡的程度,进而得到在一个统一的光照强度下场景中的软阴影效果的图形算法。一般的3D处理软件中均有该算法提供,但是所有这些都是基于离线的渲染,直到在CryT
2011-12-25 19:04:22
19170
1
原创 在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
7427
原创 Spherical Harmonic Lighting(球谐光照)
1.简介 球谐光照是实时渲染技术中的一种,属于Precompute Radiance Transfer(PRT)的范畴。经过预处理并存储相应的信息之后,它可以产生高质量的渲染及阴影效果。球谐光照需要使用新的光照方程来代替通常的光照方程,并将该方程中的相关信息使用球谐基函数来投影到频度空间,并用系数进行表示(该变换与信号处理中的Fourier变换同样的道理)以一定的方式存储。在渲染的过程中就结合
2011-11-21 00:16:33
19219
1
原创 空间分割加速三维数据的查询
最近在对一些模型进行轻量化的处理,需要压缩模型的大小,并且要求可以较快的读取加载。原始的模型由3DMax导出的FBX获得,鉴于上述要求与FBX模型的格式就选择了与渲染时的Vertex Buffer最接近的方式来对模型进行存储,存储结构如下:Triangle Data->Vertex Data其中每个Triangle data存储其所对应的顶点的索引,每个顶点数据中又存储其对应的Positi
2011-10-31 22:21:28
2333
1
原创 ProxyDLL实现对D3D程序的(FPS)监控
最近一测试组的同事说想写一个自动化的游戏测试工具,有这么一个需求:怎么在一个程序中获取另一个D3D程序的FPS等渲染相关的信息?这个问题倒是比较常见,比如录像软件Fraps就有这个最基本的功能,而性能测试工具GPA则实现得更加彻底。乍一想还真没什么思路,通过驱动层实现吧又太复杂了,不是对方想要的。于是网上搜了一下发现一种叫做Proxy Dll(代理Dll)的方法,觉得可行性比较强,而且做法简单
2011-10-29 18:55:14
4443
原创 VS中对.fx文件进行Custom Build的设置
对于D3D中.fx文件进行编译可以直接使用D3D Tools中的fxc.exe,或是在程序运行后加载.fx文件的时间调用fx编译器进行编译,但这样种种不便。受CUDA文件编译设置的启发,同样可以对.fx进行custom build设置,进而直接调用fxc.exe进行编译。
2011-08-13 21:24:14
11813
4
原创 Ambient Occlusion(AO)
AO(Ambient Occlusion)是图形学领域近来较为流行的用来获取较为真实的全局光照效果的一种方法。这种方法针对要渲染的全局场景,利用每个渲染像素点周围的几何体分布的遮挡信息来确定当前点的AO效果。基于AO的渲染方法可以有效地增强人类视觉系统对场景全局的认知能力[Luft06]。它提供了很好的一种质量和速度间的均衡。1. AO的理论基础 传统的实现方法,通常使用光线跟踪的方
2011-05-10 14:21:00
8691
2
原创 三维模型的网格细化
三维模型的网格细化是基于网格离散曲面的一种表示方法,它可以从任意拓扑网格构造光滑曲面。细化方法的基本思想是:定义一个网格序列的极限,网格序列是采用一定的细分规则(一般是加权平均),在给定的初始网格中插入新的顶点,从而不断细化出新的网格,重复运用细分规则,在极限时,该网格即收敛于一个光滑的曲线或者曲面。三维模型网格的细化是图形学算法以及游戏领域中一个较为常用且有代价值的算法。网络细分是由细分规则
2011-03-14 22:11:00
19680
11
原创 Lin-Canny算法求解凸包间的最近点对
求解凸包间的最近点对是几算几何中一个非常有用的算法,经常被用在谐如碰撞检测、物理引擎等图形学相关的领域,而且该算法的效率对于最终整个系统的效能有着相当关键的制约。常规的对于几何体之间的最近点对求解一般即是暴力的遍历算法,这种效率太过于低下,不具有普遍的适用意义,尤其是在一个较大的碰撞系统里边。因而,Lin以及Canny等人提出了渐进式求解的Lin-Canny算法。Lin-Canny算法的主要用
2011-03-08 14:21:00
4306
原创 3D模型的姿态单位化
三维模型姿态单位化在模型的处理与分析领域中是一个很重要的操作。目前常用的对于三维模型进行姿态单位化的方法一般有两咱,即基于主成分分析的对齐方法(PCA)和基于优化算法的最优模型对齐(OA)。PCA方法是使用组成三维模型的网格中的顶点、法向量或其它的一些信息来分析三维模型几何体元的分布特性,进而使用PCA方法计算出一个全局对齐下交坐标系,从而将三维模型对齐到该坐标系中。这种方法的操作对象为单个模
2011-02-25 20:41:00
4493
原创 基于CUDA的光线跟踪算法
光线跟踪是目前常用的主流绘制技术之一,由于它能方便地模拟生成复杂的光照效果,生成高质量的图像,在很多领域得到了广泛的应用,如真实感绘制,虚拟现实,可视化,计算机动画等。但光线跟踪算法的计算开销较大,妨碍了其应用效率。光线跟踪渲染的主要运算操作耗费在光线与场景求交的过程中,为此,为了加快这一计算过程,人们研究了大量的技术来加快求交操作。其中,通过建立一定的空间组织结构来加速求交计算机取得了很大的进展
2010-09-16 20:51:00
12265
4
原创 七月...
七月份的大部分时间都在等待,月初在等考试的结果,中旬又在等前段时间投的两篇论文的结果,不过现在都已经结束了。两篇论文一篇投了AMR,另一篇投了ACMMM,都是关于三维模型检索的。结果是第一篇中了,第二篇没有中。对于AMR的结果,没有太多的惊喜,虽然是自己的第一篇EI论文,但毕竟难度要相对小些,而对于ACMMM的结果却多少有些失望,毕竟自己对这一篇倾注了更多的心思。ACMMM是多媒体领域里面的一级会
2010-07-19 21:11:00
2110
原创 碰撞检测之分离轴测试(Separate Axis Testing)
分离轴测试(Separate Axis Testing)是空间碰撞检测中一个很常用、很有效的判断方法。它的原理来源于集合分析中的“分离超平面定理”(separating hyper-plane theorem):如果两个集合A和B不相交,那么必定存在一个分离超平面P,并使得A和B分别位于P的不相同的两侧。此定理对于空间数据中的凸集合和凹集合均适用。当数据集是凸集时这里的分离超平面就是一个空间的
2010-07-11 17:29:00
6753
6
转载 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
4540
原创 SouTek Engine(一)之UI
引擎的第一个主部分是UI系统,而UI的主要原则就是尽可能地简约。最典型的例子就是Source引擎下的半条命中的UI系统,其尽管简单却令人印象深刻且操作方便。其实,现在想来觉得不使用第三方库,转而来做自己的UI系统是一个不太好的想法,毕竟这部分也需要很大的工程量,而且做出来之后有没有美感、效果如何等还是很重要的问题。不过由于最初已经决定了实现自己的UI系统,而且此前已经实现了大部分的工作,那就将它彻底完成得了。在目前的情况看来对ST的UI系统还是比较满意的。
2010-06-09 21:32:00
2601
原创 好久没有更新博客了……
最近一直忙着搞论文,好久都没有更新博客了。做工程的话很快就会有新东西出来,比较容易满足;但做研究的话真是一个漫长的过程,必须得有创新才可以。但当下我们缺少的就是这样一个搞研究的氛围啊……
2010-06-08 15:51:00
1877
原创 3D模型体素化
体素化(Voxelization)是将物体的几何形式表示转换成最接近该物体的体素表示形式,产生体数据集,其不仅包含模型的表面信息,而且能描述模型的内部属性。表示模型的空间体素跟表示图像的二维像素比较相似,只不过从二维的点扩展到三维的立方体单元,而且基于体素的三维模型有诸多应用。由于使用的需要,需对模型进行体素化操作,这里采用了一种简单但却有效的操作方法。首先设定模型体素化的分辨率,假设为N
2010-04-25 18:58:00
26111
3
原创 三维模型的主成分分析(3D Model PCA, CPCA, NPCA)
PCA(Principal Component Analysis,主成分分析)是模型处理中常用的一种方法,因为它能够有效地提取出模型的主要成分和结构,一定程度上去除噪音和干扰,因此成为了对3D模型施加其它后续操作的基本变换。由于模型的3D自由度,因而在对模型施加PCA操作时需要满足以下几个基本要求:平移不变性,旋转不变性,缩放不变性。在进行PCA分析时,由于旋转和缩放不变性比较容易实现,因而各种方
2010-04-09 21:00:00
17050
5
原创 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
7948
1
原创 非真实渲染(二)——Toon Shading
Toon Shading是一种简单、基本的卡通着色方式,其着色的主要效果是用大块、突变的色调来代替正常情况中的渐变色调,从而表现出卡通效果。使用这种渲染方法,然后再结合轮廓边界线的勾勒,这种渲染方式也能得到很赏心悦目的表现效果。 其主要实现方式即是计算得到当前像素得的法线与光线之间的夹角,然后根据此夹角大小在颜色表中查找当前像素所应具有的Toon color,用这个颜
2010-04-02 22:09:00
9260
原创 非真实渲染(一)
轮廓和边界的提取是非真实渲染中一个常用的表现方法,由于它的卡通描述风格,尽管结构简单但却对整体效果的表现有极大的增强效果。基本的轮廓边界提取方法有基于图像空间和基于3D空间的方法:基于图像空间的方法利用传统渲染管线来得到当前模型投影的辅助信息,然后用这些信息来提取模型的轮廓和边界。这种方法速度较快,效率较高,但是提取的轮廓可能会不连贯,而且得到的轮廓是基于像素而非几何的,因此一般不可控,不太
2010-03-30 23:04:00
7921
原创 GLSL实现ShadowMap及阴影软化
Shadow Map是一种成熟的实时阴影生成技术,由于其实现较为简单、方便,而且因为是基于图像空间的,故而与场景的空间复杂度关联度不大,故而在游戏中广为使用。原理:1. 生成深度纹理。将场景的深度值在光源所在的投影坐标系下进行生成并存储,进而得到深度纹理。 2. 正常渲染场景并查询深度纹理进行阴影判断。在片断着色器中将当前片段变换到光源矩阵中,得到该片段在此坐标
2010-03-27 19:25:00
8964
1
原创 光照贴图生成中的精度问题
使用全局光照贴图对场景进行渲染,首先就需要对场景进行光照贴图的生成,同时计算出场景中各个多边形的顶点所对应的纹理坐标,然后再对多边形列表的光照贴图进行合并,并进行纹理坐标的重新定位,这样就可以生成整个场景的一张光照贴图,从而实现带有光照效果的高效率渲染。理论上,在渲染时各个多边形根据它所对应的纹理坐标来访问场景光照贴图就能得到正确的显示效果,但在实际中却由于浮点运算的精度误差而使得到的纹理坐标
2010-03-20 23:28:00
5565
原创 LightMap的创建与生成
为了增加场景的表现力,在渲染中添加光照效果必不可少。首先用某种算法对整个场景生成光照渲染效果,然后再将光照渲染效果以纹理的方式来存储,将场景中各个多边形所对应的光照效果存于光照贴图中,这样的话在实时渲染时,只需要对场景在原有纹理渲染的基础上添加多纹理的融合即可渲染出光照效果。然而这样得到的光照贴图是和场景中每个单一多边形相对应的,因此若场景中有N个多边形就需要对应N个光照贴图,这样在渲染时就需要对
2010-03-17 17:50:00
6173
1
原创 辐射度算法的CUDA实现
1. 简介辐射度算法是一种经典的全局光照算法,它可以解决光线跟踪等直接照明方法中所不能表现的真实世界中的照明现象问题。虽然渲染的结果表现力强,但是问题之一就是算法的耗费较大,由于其原理就是对各个多边形面片进行着色,而且常常需要较多的迭代次数才能达到比较理想的效果,因此算法原理虽然比较简单,但效率就成为一个重要的瓶颈。 2. 辐射度算法原理辐射度算法的原理就是模拟真实世界中的光照原理
2010-03-10 22:29:00
7110
1
原创 OpenGL Buffer Object
OpenGL的缓冲对象提供了一种高效的数据操作及吞吐方式,这此操作涉及整个渲染管线的多个环节,用来提高OpenGL的实现效率。常见的缓冲对象有:顶点缓冲对象(VBO)、像素缓冲对象(PBO)和帧缓冲对象(FBO),各种缓冲对象的操作方式及应用场合不尽相同,但主要都是在关系到内存与显存之间需进行数据传输与交互时而进行的优化操作,因为内存与显存之间的数据交互在当前的硬件渲染架构下是必须的,但效率却又受
2010-03-08 16:08:00
6674
原创 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
4514
原创 全局光照渲染器
游戏场景管理的实现差不多已经告一段落了,为了对场景管理的健壮性进行测试同时也为了对场景的效果进行更好的优化,决定在此前场景管理的基础上实现一个全局光照渲染器,然后将游戏场景添加全局光照的效果。当然,这个渲染器不仅实现为游戏场景添加全局光照效果的目的,同时也可以作为自己进一步学习并实现基于物理的渲染的一个基础。寒假在家时已经开始着手做了,现在已经有了初步的框架,并有了粗略的效果,在与其它
2010-02-28 21:38:00
6143
原创 计算三角网格的顶点法向量
前段时间基本上完成了场景编辑器的大部分工作,现在已经可以用它生成自己需要的网格模型了。目前,在编辑器中对生成的网格是指定面的法向量,这对于用场景生成BSP等相关操作已经足够了。不过为了测试BSP的健壮性,准备实现一下基于BSP的光线跟踪算法来看看效果,于是只是指定面的法向量就显得不太够用,因为在逐像素作着色时就需要对面上各个点的法向量进行插值,因此就需要各个顶点的法向量。查了下相关的资料,找到了一
2010-02-11 21:16:00
12076
1
原创 BSP创建中的一些问题
用BSP来对游戏中的室内场景进行分割是一个传统但却有效的手段,BSP创建的质量决定了BSP在使用时的健壮性,因为之后要使用BSP进行渲染、物理交互等操作。创建一个BSP的过程即简单又烦琐,虽然逻辑简单,但是在分割结点的过程中也会产生不少问题,以下是本人创建BSP时的一些简单经验总结。 BSP树创建流程:1. 得到场景的多边形列表(多边形何种方式组织无关紧要,只要含有足够信息即
2010-01-26 20:49:00
3249
原创 OpenGL多线程多视图的实现
OpenGL在MFC下的多视图显示在很多场合都能用到,而且表现力够强。前段时间自己需要做一个类似于MAX之类的场景编辑工具,用来编辑自己正在做的FPS游戏中所需要的场景。由于自己不懂美工、不会用MAX,所以在学习MAX与做一个自己更容易操作的编辑器两者间,就一直很纠结,最终还是选择做一个自己的编辑器。现在看来这个选择是明智的,因为用自己的编辑器来处理自己胡思乱想出来的场景时能更方便地与自己的游戏进
2010-01-26 20:39:00
10948
11
OpenCL Specification(OpenCL参考手册)
2010-01-28
ShaderDesigner(GLSL Tools)
2010-02-11
OpenGL Geometry Shader Tutorial(OpenGL几何着色器教程)
2010-04-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人