Skip to content
Metro是Win8的一个重要组成部分。对用户来说,Metro给移动和桌面(尤其是触摸设备)带来了全新的体验;对开发者来说,可以把Metro当作一个基于WinRT的新平台。传统程序在Win8上只能以desktop方式执行,可以访问所有传统Win32 API;Metro程序则只能访问一部分通过WinRT暴露出来的API。从开发体验来看,Metro更类似于移动平台的方法,程序需要经过deploy、签名、打包,才能分发。 API的差异 有很多Win32 API在新的WinRT中已经消失了,需要绕开或者用WinRT的函数重写。和当年移植到Android的过程一样,首先需要解决Boost的移植问题。这里借用的是Ogre的Metro补丁,它原先是针对boost 1.50的,需要手动一个个修改才能应用于boost 1.51。大部分 ...
在KlayGE开发版中,C++11的部分特性第一次被采用。目前用到的有两处,nullptr和强类型enum。所有这些C++11 only的代码都被放入#ifdef /#endif,同时提供了非C++11的替代实现。 nullptr nullptr是C++11定义的强类型空指针,用来取代NULL。强类型的保证减少了bug的可能性,相关的介绍很容易找到,这里就不累赘了。在不支持C++11的编译器上,也可以实现一个同样功能的nullptr: const class nullptr_t { public: template operator T*() const { return reinterpret_cast(0); } template operator T C::*() const { return reinterpret_cast(0); } private: void operator&() const; } nullptr = {}; 强类型enum ...
在压缩tangent frame一文中,我们看到了把tangent frame压缩到4个字节的方法。现在让我们看看如何压缩其他属性,以达到减小顶点数据的目的。 顶点属性 首先看看完整的顶点都包含了哪些属性: 属性 类型 大小(字节) 备注 position float3 12 texcoord float2 8 tangent float3 12 binormal float3 12 normal float3 12 blend_index uint4 16 骨骼动画模型才有 blend_weight float4 16 骨骼动画模型才有 总共 88 经过tangent frame压缩,同时一般引擎都会把blend_index和blend_weight存入uint32,顶点格式就成了: 属性 类型 大小(字 ...
最近,在KlayGE的开发版中,正式加入了MeshMLLib这个独立子库。这也是在KlayGE 4.2的计划中。顾名思义,MeshMLLib是用来与KlayGE的模型格式MeshML打交道的库。去年在计划Maya的导出插件时,就想过把3DSMax和Maya的插件后端统一,以简化插件的开发。时至今日,该目标终于完成。 MeshMLLib简介 MeshMLLib目前可以编译成.lib的库,静态链接到别的程序中。它的目标就是让程序可以很简单地生成.meshml格式的文件,以供KlayGE载入。因此插件和转换器就不需要总写重复代码,开发和测试都更加方便。 MeshML简介 MeshML是KlayGE的模型格式,基于xml。在设计上,MeshML参考了idSoftware的MD5。支持静态模型、骨骼动画,在新版本中还增加了动画压缩 ...
现代3D游戏经常会需要用到decal,子弹孔、脚印……传统的decal渲染从Quake 2时代开始就没怎么变过,通过画一个紧贴着物体的四边形来实现。问题一直很多,比如光照的不一致,z-fighting造成的闪烁,渲染状态的来回切换,等等。那么到了deferred框架中,这种情况会有所好转吗? 有趣的是,deferred框架内实现decal不但非常容易:100行之内的代码量,不到20分钟就能完成,而且非常稳定,完全没有上述各种缺点。更有趣的是,deferred的decal被至少三组不同的人都提出过完全相同的算法,都在讨论会出现的相同问题,只是被分别叫成了不同的名字。现在看看这三组: Crytek的Jan Krassnigg在2010年于Game Engine Gems 1里的一篇文章A Deferred D ...
按照先前的计划,KlayGE 4.2中将加入volumetric light的效果,目前已经由Parsifal Wang实现并集成入引擎中。 这里的volumetric light,或者说light shaft,方法上类似于CE和3DMark的做法——把场景渲染得到的depth texture和color texture进行radial blur,得到的结果在通过alpha blend叠加回原先的结果。具体算法可以参考GPU Gems 3的文章。这个方法还是相当快的。在GTX 480上只要0.3ms,在NVS 4200M这种低端移动显卡上也只要2.5ms。目前仍存在一些优化的空间,以后速度还能更快。 打开volumetric light,静帧的效果没有动起来好看: 关闭volumetric light:
NVIDIA的Optimus技术可以在笔记本上兼顾耗电量和性能,并能做到自动无缝切换。但问题就在于,不想让它自动的时候,该怎么办?在ThinkPad T420s上,NV的独立显卡是NVS 4200M,feature level支持到D3D 11.0;Intel的集成显卡是HD 3000,feature level支持到D3D 10.1。(对feature level还不熟悉的朋友可以看这篇) 在BIOS中控制 支持Optimus的平台上,在BIOS中可以找到选项,可以选择使用NV、Intel或者自动切换。但这个是静态的,每次切换都得重启,肯定不是我们想要的。 在右键菜单中控制 在exe文件的图标上按右键,菜单里有一个“用图形处理器运行”的项,里面可以选择NV卡或者Intel卡。有趣的是,如果你在程序中枚举adapter,总会返回两块 ...
前言:对tangent frame的压缩,其实在2008年做All-frequency rendering of dynamic, spatially-varying reflectance这篇paper的过程中,就曾在茶余饭后讨论过这个事情。这其实是个很trivial的问题,但看到Crytek和Avalanche分别在两年的SIGGRAPH talk上都煞有介事地提到这个问题,才想写这篇blog介绍一下。 Avalanche Studios的Emil Persson,也就是Humus,在SIGGRAPH 2012上的talk Creating Vast Game Worlds中提到了他们在游戏中如何压缩顶点数据,其中对于tangent frame的压缩与去年Crytek的Spherical Skinning with Dual-Quaternions and QTangents的压缩方法极其相似。但在两者的介绍中,由于某些原因,总有一些细节的陷阱没有提到。 ...
SIGGRAPH这几年有个著名course叫Advances in Real-Time Rendering in Games,每次都能介绍很多最新而且实用的real time rendering方法。其内容的质量相当高。 今年的文档终于放出来了,大家可以在这里找到。
在刚刚结束的SIGGRAPH 2012上,Cyril Crassin提出的Sparse Voxel Octree(SVO)极其热门,几乎每个涉及到real time rendering的course和talk都免不了提及SVO。加上UE4将会采用SVO、idTech6早就说了将会采用SVO,更是起到了推波助澜的作用。那么SVO是什么,它能解决什么样的问题呢? SVO简介 Voxelization 传统的mesh都表示成以三角形和四边形为单位的图元。而在SVO里,图元是更为简单和离散的voxel。每个voxel有其中心位置、大小等信息,但不需要考虑相互之间的拓扑关系。各种求交计算也变得简单了。从mesh转成voxel表达的过程就称为voxelization。 Voxelization的方法也是逐步发展过来的。从基于CPU的方法,到NVIDIA基于一层一层渲染 ...