Posts Tagged ‘DirectX’

实时局部反射(Real-time Local Reflection with Bisection Method)

Friday, May 24th, 2013

很长一段时间没发博客了。前一段时间忙着考试。最近才终于又有时间集中开发了。

画了几周时间(确切的说是两周)学了一下DirectX11,感想是API还是比较简单易懂的。以前没有系统学过D3D,这次算是补上了。删掉固定管线以后微软只留下了必要的东西,本来就没有多少使用固定功能管线的经历,刚开始学3D的时候就是从shader开始学的,意外的快速理解了新的API。以前把DirectX10的代码升级到过10.1,能体会到即使是同一级别的API也有或多或少的功能追加。之前从NormalMap开始,从头做起,然后花了不少时间理解Tessellation,回头也发文好好讲讲使用心得。

废话扯完,下面介绍一下才做出来的局部反射,名字是Crytek起的,听起来挺糊涂,更喜欢屏幕空间反射SSR(Screen space reflection)这么叫,通俗易懂。

原理倒是非常简单,通俗点将就是从相机位置开始,与空间内每个点连线,向量和该点法线求个反射,沿线追踪,碰到深度小的就返回颜色信息。关键就看个人自己想怎么实现了。根本也没用到SM4.0以上的功能。

你要是Google搜索RLR出来的八成是gamedev上那小伙的声明,代码也发了。我先没看,自己写了下。结果回头看哪小伙的代码,都要哭出来了。我是标准的在worldspace上作的反射,这小伙在viewspace上,咱开始就很奇怪,难道就为了减少一次View变换?(后来发现其实也没减少),原来他是为了计算步长,希望逐像素进行采样,咱当时也困惑了好久,简单的声明确实能出结果,但是步长不准结果做不到平滑,消耗也很大。咋办?后来想起RefractionMap,是对Parallaxmap的一种改进,步长比较大不要紧。搜索出结果后继续进行进一步二分搜索。这样的话开销少了很多。前面那家伙就是死脑筋迭代了整个反射方向的像素,而且做法比较繁琐。要知道这个不是做镜子,比较极端的状况下,比如步长正好离开屏幕(可以手动纠正,而且往往这种情况下纠正了也没用,很大几率这些点没有反射到物体)。下图是直接通过物体Normal反射的结果(未使用NormalMap),这种情况也只有在实验中会使用到,实际应用中一定是NormalMap结束的反射。

该图是使用NormalMap后的结果进行的局部反射。

暂时今天就完成到这里,在第一张图中很明显反射边缘有锯齿,毕竟是屏幕空间,超出范围就反射不到了。接下来只要把边缘淡出就可以了。但是下图中看来实际使用中由于环境比较复杂,即使不处理也不会有很大的违和感,甚至是减小渲染尺寸也不会有问题。实验室的GTX680台式和家里的GTX670笔记本都还是能达到比较理想的帧数。

更新:进行了fadeout的添加,修正了一些提前跳出计算的失误。现在更精确了。第一幅图更新了一下,挂了FRAPS,下面一张图本身就看不出区别。不过添加法线反射以后明显帧数低了些。

3D游戏引擎RedEngine介绍( Introduction of 3d game engine RedEngine)

Saturday, August 18th, 2012

支持技术(Features):

Graphics:

Phong Shader(Normal,Specular)

Emissive Map

Environment Map

HDR(High Dynamic Range)

Deferred Lighting

Motion Blur

Volume Light

PCF Soft Shadow

SSAO(Screen Space Ambient Occlusion)

DOF(Depth Of Field)

SSS(Subsurface Scattering)

Octree/Frustum Occlusion Culling

Model & Animation:

Billboard

Instance Model

Height Field

Particle System

Skeletal animation

Physics(supported by Nvidia PhysX wrapped by StillDesign):

Rigid Body

Cloth simulation

Fluid simulation

Ragdolls simulation

……

Script:

LUA Script language support

Audio:

Fmod support

Misc:

Camera Track

Game Script Manager

Particle Editor

User Interface

 

简介(Introduction)

开发于2009~2011,最初是学习用小程序,经过多次的重构以后,变得结构清晰,方便扩展,添加了一些基本游戏引擎应该有的组件,包括物理,脚本,声音的支持与管理。

引擎使用的API是微软的XNA。关于API,由于是在.NET Framework上运行的,所以语法的问题不再成为困扰,可以专心来学习图形学和引擎运作的算法,但弊端也十分显著,XNA很难成为开发大型游戏的工具,运行环境严重被限制,只能支持DirectX9.0c,shade model 3.0,所谓次世代的技术几乎都不支持。于是转战OpenGL(RedEngine GL),目前也正在学习DirectX 11,以适应新时代的变化。

注:引擎所使用的技术都是过时的技术,在此仅做介绍。

diffuse wit HDR

 这些都是早期的开发中的截图,上图是普通的albedo/diffuse输出+HDR,blur filter。此处已经有骨骼动画(skeletal animation)、骨骼绑定(bone attach)等动画功能,其他的渲染输出(normal map/depth map/etc…)在此就不贴出来了。

deferred light

这张是延迟照明(Deferred Light)的色彩输出,能支持大量光源的渲染技术,此处有平行光与点光源,可以看到地上的光源数量非常多,通过法线贴图(normal),高光贴图(specular)实现的Phong shade。

 

soft shadow

 这是阴影(shadow)的截图,PCF的软阴影,当然咱得承认这里没有PSSM、CSM之类的大规模阴影技术,虽然现在有了,当时没做真是个败笔。

motion blur

动态模糊(Motion Blur),这里是Object Motion Blur,从DirectX SDK和别人的一些例子里找的参考,这里没有Cryengine里的Camera Blur的技术,还是传统的逐帧模糊。效果是最好的。 

Depth of field

 景深(Depth of field),同样是传统的做法,gl里会简单很多,NV的例子里做的更漂亮,不过这里就用最原始的做法好了,支持远景和近景模糊。

ssao

这张是SSAO,当然这张是很早以前的截图了,尝试了很多的方法,包括Game Programming Gems,Blizzard的SSAO,Crytek,Gamedev上面外国人讨论的好几个做法。这张的SSAO并不是最终敲定的AO,在我的游戏Castle Quest里面可以看到最终确定的AO版本。

subface scattering

 次表面散射(Subface Scattering),这里使用的是GPU Gems上给出的算法。虽然公式中全部都是简化模型,但最终做出来的效果非常漂亮。

Volume Light

 容积光(Volume Light),同样是参照GPU Gems上的原始方程计算出来的,效果看起来很棒。

ragdoll

 布娃娃(Ragdoll),在Nvidia PhysX SDK中看到这么一个例子,就试着在引擎中实现了一下,图是引擎连接至PhysX Visual Debugger以后的截图,全场景都是在附加物理引擎的情况下运行的。

还有其他的一些功能和引擎的具体实现技术在这里不作介绍,一是限于篇幅,一是这些技术我想网上的参考资料与书上的内容会介绍的更详细吧。这个引擎也不准备继续再进行开发了,这也是没有截新图的原因,另一个原因是我来这边以后带过来的只有已经成为游戏的Castle Quest,也不会再加载以前的场景专门为一篇博文截个图。本文存档,记录下开发过的一些程序。