在即将发布的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 ...
按照先前的计划,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,总会返回两块 ...