
Graphics
文章平均质量分 77
BugRunner
这个作者很懒,什么都没留下…
展开
-
全局光照渲染器
游戏场景管理的实现差不多已经告一段落了,为了对场景管理的健壮性进行测试同时也为了对场景的效果进行更好的优化,决定在此前场景管理的基础上实现一个全局光照渲染器,然后将游戏场景添加全局光照的效果。当然,这个渲染器不仅实现为游戏场景添加全局光照效果的目的,同时也可以作为自己进一步学习并实现基于物理的渲染的一个基础。寒假在家时已经开始着手做了,现在已经有了初步的框架,并有了粗略的效果,在与其它原创 2010-02-28 21:38:00 · 6120 阅读 · 1 评论 -
Lin-Canny算法求解凸包间的最近点对
求解凸包间的最近点对是几算几何中一个非常有用的算法,经常被用在谐如碰撞检测、物理引擎等图形学相关的领域,而且该算法的效率对于最终整个系统的效能有着相当关键的制约。常规的对于几何体之间的最近点对求解一般即是暴力的遍历算法,这种效率太过于低下,不具有普遍的适用意义,尤其是在一个较大的碰撞系统里边。因而,Lin以及Canny等人提出了渐进式求解的Lin-Canny算法。Lin-Canny算法的主要用原创 2011-03-08 14:21:00 · 4268 阅读 · 0 评论 -
三维模型的主成分分析(3D Model PCA, CPCA, NPCA)
PCA(Principal Component Analysis,主成分分析)是模型处理中常用的一种方法,因为它能够有效地提取出模型的主要成分和结构,一定程度上去除噪音和干扰,因此成为了对3D模型施加其它后续操作的基本变换。由于模型的3D自由度,因而在对模型施加PCA操作时需要满足以下几个基本要求:平移不变性,旋转不变性,缩放不变性。在进行PCA分析时,由于旋转和缩放不变性比较容易实现,因而各种方原创 2010-04-09 21:00:00 · 16945 阅读 · 10 评论 -
Spherical Harmonic Lighting(球谐光照)
1.简介 球谐光照是实时渲染技术中的一种,属于Precompute Radiance Transfer(PRT)的范畴。经过预处理并存储相应的信息之后,它可以产生高质量的渲染及阴影效果。球谐光照需要使用新的光照方程来代替通常的光照方程,并将该方程中的相关信息使用球谐基函数来投影到频度空间,并用系数进行表示(该变换与信号处理中的Fourier变换同样的道理)以一定的方式存储。在渲染的过程中就结合原创 2011-11-21 00:16:33 · 19139 阅读 · 8 评论 -
Bilateral Filtering(双边滤波) for SSAO
1. 简介图像平滑是一个重要的操作,而且有多种成熟的算法。这里主要简单介绍一下Bilateral方法(双边滤波),这主要是由于前段时间做了SSAO,需要用bilateral blur 算法进行降噪。Bilateral blur相对于传统的高斯blur来说很重要的一个特性即可可以保持边缘(Edge Perseving),这个特点对于一些图像模糊来说很有用。一般的高斯模糊在进行采样时主要考虑了像素原创 2012-01-01 20:31:49 · 55397 阅读 · 2 评论 -
Ambient Occlusion(AO)
AO(Ambient Occlusion)是图形学领域近来较为流行的用来获取较为真实的全局光照效果的一种方法。这种方法针对要渲染的全局场景,利用每个渲染像素点周围的几何体分布的遮挡信息来确定当前点的AO效果。基于AO的渲染方法可以有效地增强人类视觉系统对场景全局的认知能力[Luft06]。它提供了很好的一种质量和速度间的均衡。1. AO的理论基础 传统的实现方法,通常使用光线跟踪的方原创 2011-05-10 14:21:00 · 8597 阅读 · 3 评论 -
使用UMFPACK求解大型稀疏矩阵方程
最近在对模型进行PRT处理时需要用到最小二乘法来做采样点的优化拟合,对最小二乘法有了解的可能就会知道(http://en.wikipedia.org/wiki/Least_squares),一般情况下为了便于目标点的计算通常会引入矩阵并得到一个如下的矩阵方程:Ax = b其中的x就是一个关于目标点的参数列向量,b是对应的观测值向量,而A就是根据应该背景得到的数据矩阵。求解这个矩阵形式的线性原创 2012-03-12 13:47:51 · 13103 阅读 · 9 评论 -
Point与AABB间的最远点对
最近需要做一些碰撞检测相关的东西。AABB是游戏引擎中最常用的碰撞基本体了,具有各种优良的特性。其本身的自交判断很简单(这句话咋恁别扭呢*~*),而且与其它形体的相交判断也不是很复杂。求一点到AABB上的最近点对很常用,也比较简单,代码如下所示:void ClosestPtPointAABB(const Point& p , const AABB& b , Point& q){ for (原创 2012-03-14 00:30:52 · 2868 阅读 · 0 评论 -
3D模型体素化
体素化(Voxelization)是将物体的几何形式表示转换成最接近该物体的体素表示形式,产生体数据集,其不仅包含模型的表面信息,而且能描述模型的内部属性。表示模型的空间体素跟表示图像的二维像素比较相似,只不过从二维的点扩展到三维的立方体单元,而且基于体素的三维模型有诸多应用。由于使用的需要,需对模型进行体素化操作,这里采用了一种简单但却有效的操作方法。首先设定模型体素化的分辨率,假设为N原创 2010-04-25 18:58:00 · 25961 阅读 · 14 评论 -
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 评论 -
BRDF能量守恒属性的证明
今天跟一哥们儿聊到BRDF,说起了其中能量守恒属性的证明,细想,这个之前倒还真没好考虑过的。于是搜了些资料,终还找到了方法,这里总结下。对于BRDF中的能量守恒属性的基本表述形式为(注意其中的o、i):考虑物体表面上某点X 处,其对应的光线辐入总能量(E ) 、辐出总能量(M)分别为(单位面积上,略去dA):根据能量守恒定律必有:(呃,这个就不需要多说了。。。)。在该点原创 2013-03-10 21:19:16 · 6420 阅读 · 6 评论 -
图形学中的贴图采样、走样与反走样等
计算机图形学中不可避免的会涉及到图像分析与处理的相关知识,前些时间也重温了下常用到的采样、重建以及纹理贴图等内容,并对其中的走样与反走样有了更多的认识,这里小结一下。1. 基本问题信号的采样与重建过程中首先面临着两个基本的问题:给定一个连续的信号g(x)以及它的离散采样信号gs(x),能否通过gs(x)来完整的描述g(x) 的信息;如果可以,如何通过gs(x)来重建出原始信原创 2013-04-21 00:36:46 · 13988 阅读 · 3 评论 -
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 评论 -
Sparse Voxel DAGs
Siggraph 2013上面的一篇新文:High Resolution Sparse Voxel DAGs,主要介绍了一种基于图的稀疏体素空间存储结构。其主要是对SVO做了进一步的改进,减少里边的共享结点的冗余存储,将其用directed acyclic graph(DAG)直接连接,如下图所示:其创建方法也是基于SVO来进行自底向上的逐层合并(自顶向下效率较低),其中有用到一些原创 2013-06-16 18:09:23 · 5788 阅读 · 1 评论 -
Aliasing vs Noise
Aliasing is a *specific* kind of error; it's when high frequencies show up as low frequencies. It's like information from high frequency content "masquerades" as low frequency content, which is why a原创 2013-11-28 12:35:57 · 4199 阅读 · 0 评论 -
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 评论 -
三维模型的网格细化
三维模型的网格细化是基于网格离散曲面的一种表示方法,它可以从任意拓扑网格构造光滑曲面。细化方法的基本思想是:定义一个网格序列的极限,网格序列是采用一定的细分规则(一般是加权平均),在给定的初始网格中插入新的顶点,从而不断细化出新的网格,重复运用细分规则,在极限时,该网格即收敛于一个光滑的曲线或者曲面。三维模型网格的细化是图形学算法以及游戏领域中一个较为常用且有代价值的算法。网络细分是由细分规则原创 2011-03-14 22:11:00 · 19563 阅读 · 30 评论 -
3D模型的姿态单位化
三维模型姿态单位化在模型的处理与分析领域中是一个很重要的操作。目前常用的对于三维模型进行姿态单位化的方法一般有两咱,即基于主成分分析的对齐方法(PCA)和基于优化算法的最优模型对齐(OA)。PCA方法是使用组成三维模型的网格中的顶点、法向量或其它的一些信息来分析三维模型几何体元的分布特性,进而使用PCA方法计算出一个全局对齐下交坐标系,从而将三维模型对齐到该坐标系中。这种方法的操作对象为单个模原创 2011-02-25 20:41:00 · 4466 阅读 · 2 评论 -
计算三角网格的顶点法向量
前段时间基本上完成了场景编辑器的大部分工作,现在已经可以用它生成自己需要的网格模型了。目前,在编辑器中对生成的网格是指定面的法向量,这对于用场景生成BSP等相关操作已经足够了。不过为了测试BSP的健壮性,准备实现一下基于BSP的光线跟踪算法来看看效果,于是只是指定面的法向量就显得不太够用,因为在逐像素作着色时就需要对面上各个点的法向量进行插值,因此就需要各个顶点的法向量。查了下相关的资料,找到了一原创 2010-02-11 21:16:00 · 12029 阅读 · 1 评论 -
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 评论 -
GLSL实现ShadowMap及阴影软化
Shadow Map是一种成熟的实时阴影生成技术,由于其实现较为简单、方便,而且因为是基于图像空间的,故而与场景的空间复杂度关联度不大,故而在游戏中广为使用。原理:1. 生成深度纹理。将场景的深度值在光源所在的投影坐标系下进行生成并存储,进而得到深度纹理。 2. 正常渲染场景并查询深度纹理进行阴影判断。在片断着色器中将当前片段变换到光源矩阵中,得到该片段在此坐标原创 2010-03-27 19:25:00 · 8931 阅读 · 4 评论 -
非真实渲染(一)
轮廓和边界的提取是非真实渲染中一个常用的表现方法,由于它的卡通描述风格,尽管结构简单但却对整体效果的表现有极大的增强效果。基本的轮廓边界提取方法有基于图像空间和基于3D空间的方法:基于图像空间的方法利用传统渲染管线来得到当前模型投影的辅助信息,然后用这些信息来提取模型的轮廓和边界。这种方法速度较快,效率较高,但是提取的轮廓可能会不连贯,而且得到的轮廓是基于像素而非几何的,因此一般不可控,不太原创 2010-03-30 23:04:00 · 7876 阅读 · 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 评论 -
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 评论 -
SouTek Engine(一)之UI
引擎的第一个主部分是UI系统,而UI的主要原则就是尽可能地简约。最典型的例子就是Source引擎下的半条命中的UI系统,其尽管简单却令人印象深刻且操作方便。其实,现在想来觉得不使用第三方库,转而来做自己的UI系统是一个不太好的想法,毕竟这部分也需要很大的工程量,而且做出来之后有没有美感、效果如何等还是很重要的问题。不过由于最初已经决定了实现自己的UI系统,而且此前已经实现了大部分的工作,那就将它彻底完成得了。在目前的情况看来对ST的UI系统还是比较满意的。原创 2010-06-09 21:32:00 · 2582 阅读 · 0 评论 -
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 评论 -
Screen Space Ambient Occlusion(SSAO)
1. 简介AO(Ambient Occlusion)是全局光照中(Global Illumination)中一个很重要的概念,主要用来描述物体间的相互遮挡关系 以及漫射光线之间相互作用的效果。AO的主要方法是在每个采样点上计算它被其它几何体元遮挡的程度,进而得到在一个统一的光照强度下场景中的软阴影效果的图形算法。一般的3D处理软件中均有该算法提供,但是所有这些都是基于离线的渲染,直到在CryT原创 2011-12-25 19:04:22 · 19125 阅读 · 11 评论 -
LightMap的创建与生成
为了增加场景的表现力,在渲染中添加光照效果必不可少。首先用某种算法对整个场景生成光照渲染效果,然后再将光照渲染效果以纹理的方式来存储,将场景中各个多边形所对应的光照效果存于光照贴图中,这样的话在实时渲染时,只需要对场景在原有纹理渲染的基础上添加多纹理的融合即可渲染出光照效果。然而这样得到的光照贴图是和场景中每个单一多边形相对应的,因此若场景中有N个多边形就需要对应N个光照贴图,这样在渲染时就需要对原创 2010-03-17 17:50:00 · 6136 阅读 · 6 评论 -
光照贴图生成中的精度问题
使用全局光照贴图对场景进行渲染,首先就需要对场景进行光照贴图的生成,同时计算出场景中各个多边形的顶点所对应的纹理坐标,然后再对多边形列表的光照贴图进行合并,并进行纹理坐标的重新定位,这样就可以生成整个场景的一张光照贴图,从而实现带有光照效果的高效率渲染。理论上,在渲染时各个多边形根据它所对应的纹理坐标来访问场景光照贴图就能得到正确的显示效果,但在实际中却由于浮点运算的精度误差而使得到的纹理坐标原创 2010-03-20 23:28:00 · 5532 阅读 · 0 评论 -
OpenGL多线程多视图的实现
OpenGL在MFC下的多视图显示在很多场合都能用到,而且表现力够强。前段时间自己需要做一个类似于MAX之类的场景编辑工具,用来编辑自己正在做的FPS游戏中所需要的场景。由于自己不懂美工、不会用MAX,所以在学习MAX与做一个自己更容易操作的编辑器两者间,就一直很纠结,最终还是选择做一个自己的编辑器。现在看来这个选择是明智的,因为用自己的编辑器来处理自己胡思乱想出来的场景时能更方便地与自己的游戏进原创 2010-01-26 20:39:00 · 10919 阅读 · 31 评论 -
碰撞检测之分离轴测试(Separate Axis Testing)
分离轴测试(Separate Axis Testing)是空间碰撞检测中一个很常用、很有效的判断方法。它的原理来源于集合分析中的“分离超平面定理”(separating hyper-plane theorem):如果两个集合A和B不相交,那么必定存在一个分离超平面P,并使得A和B分别位于P的不相同的两侧。此定理对于空间数据中的凸集合和凹集合均适用。当数据集是凸集时这里的分离超平面就是一个空间的原创 2010-07-11 17:29:00 · 6718 阅读 · 6 评论 -
BSP创建中的一些问题
用BSP来对游戏中的室内场景进行分割是一个传统但却有效的手段,BSP创建的质量决定了BSP在使用时的健壮性,因为之后要使用BSP进行渲染、物理交互等操作。创建一个BSP的过程即简单又烦琐,虽然逻辑简单,但是在分割结点的过程中也会产生不少问题,以下是本人创建BSP时的一些简单经验总结。 BSP树创建流程:1. 得到场景的多边形列表(多边形何种方式组织无关紧要,只要含有足够信息即原创 2010-01-26 20:49:00 · 3230 阅读 · 0 评论 -
基于CUDA的光线跟踪算法
光线跟踪是目前常用的主流绘制技术之一,由于它能方便地模拟生成复杂的光照效果,生成高质量的图像,在很多领域得到了广泛的应用,如真实感绘制,虚拟现实,可视化,计算机动画等。但光线跟踪算法的计算开销较大,妨碍了其应用效率。光线跟踪渲染的主要运算操作耗费在光线与场景求交的过程中,为此,为了加快这一计算过程,人们研究了大量的技术来加快求交操作。其中,通过建立一定的空间组织结构来加速求交计算机取得了很大的进展原创 2010-09-16 20:51:00 · 12215 阅读 · 6 评论 -
辐射度算法的CUDA实现
1. 简介辐射度算法是一种经典的全局光照算法,它可以解决光线跟踪等直接照明方法中所不能表现的真实世界中的照明现象问题。虽然渲染的结果表现力强,但是问题之一就是算法的耗费较大,由于其原理就是对各个多边形面片进行着色,而且常常需要较多的迭代次数才能达到比较理想的效果,因此算法原理虽然比较简单,但效率就成为一个重要的瓶颈。 2. 辐射度算法原理辐射度算法的原理就是模拟真实世界中的光照原理原创 2010-03-10 22:29:00 · 7071 阅读 · 1 评论