Skip to content
昨天比较完各编译器对C++11的支持,决定一蹴而就,继续引入几个不影响接口的C++11语言核心特性。于是选了type traits、static assert、range-based for和decltype。前三个都好办,用个宏包起来,在不支持C++11的编译器上切换回Boost的实现。只有decltype是需要特别注意的。 BOOST_TYPEOF也能实现类似decltype的功能,比如有一个vector<int> v,typedef BOOST_TYPEOF(v) VType;,那么VType就是vector<int>了。但如果v是vector<int>&,BOOST_TYPEOF(v)得到的是vector<int>,而decltype(v)得到的是vector<int>&。如果要接着把VType用作别的用途,比如通过VType::reference得到int&,这两者就会有 ...
在KlayGE首次引入C++11特性之后,我顺便调研了一下个主流编译器对C++11的支持度,以便在下个版本中加入更多的C++11元素。这里还列出了在不支持的时候,可以采用的替代方案。主要参考了C++11 Features in Visual C++ 11,Status of Experimental C++0x Support in GCC 4.6,Status of Experimental C++0x Support in GCC 4.7,Boost。 C++11 Core Language Features   VC 10 VC 11 GCC 4.6 GCC 4.7 替代方案 Rvalue references Yes Yes Yes Yes Boost.Move Rvalue references for *this No No No No Non-static data member initializers No No No Yes Variadic templates No No Yes Y ...
在即将发布的KlayGE 4.2里,工具链得到了扩充。新增的几个小工具涵盖了一般内容创建工具不提供,但游戏开发中常常需要用到的功能。这些工具包括: Bump2Normal:把早期表示纹理坐标扰动的bump map转成尽量接近的normal map。 Mipmapper:对任意纹理建立mipmap。 PlatformDeployer:把纹理和模型对不同平台转成不同格式。 Tex2JTML:把多张纹理拼到一个Juda texture中,由Honyeung Lau提供。 TexCompressor:BC1-5纹理压缩器。 加上原有的几个相关的工具: ForceTexSRGB:强制转换成sRGB格式。 HDRCompressor:压缩HDR纹理。 Normal2Height:normal map转成height map。 NormalMapCompressor:normal map专用压缩器 ...
KlayGE 4.1支持由王清源提供的屏幕空间反射,但由于只是屏幕空间,反射方向就被局限到跟视线相同的方向。在即将发布的KlayGE 4.2中,这个功能被扩展到了支持多个方向,成为了实时的全方向非平面反射。(虽然7月底就已经实现了这个功能,但到现在才有时间整理出demo...) 多方向反射必然需要往不同方向渲染多次场景,而且每一次都必须是带lighting和shading的效果。因此,Deferred rendering layer引入了multi-viewport的功能,只要定义几个不同的viewport,就能同时得到不同视点的场景渲染结果,包括当前帧的RGB/depth,和上一帧的RGB/depth。这个功能不但能用在反射,还能用于分屏显示、多视角显示、缩略图等游戏常见的情景。这样相当于 ...
VS2012 Update 1的安装程序是个web installer的,如果有多台机器都需要update 1,重复下载就很麻烦。今天偶然在这里看到了一个离线安装的方法,经过测试十分有效。方法非常简单,先把web installer下下来,在命令行里用vsupdate_KB2707250.exe /layout即可,数据包会全部下载到指定的目录。接着就可以离线安装了。 这个方法的缺点是,所有的补丁包都会一股脑全部下载,包括所有语言的。所以最终会占用将近1G的空间。
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 ...