KlayGE的输入系统从2003年完成之后,几乎就没有大的修改。谁想到在10年后的今天,输入系统几乎完全重写了。
DirectInput的缺点
原先KlayGE的输入系统只有DirectInput一个插件,基本就是简单地把DirectInput包一层,实现对键盘、鼠标和手柄的支持。在核心层,获取了设备的输入之后,经过action mapping系统,把输入转化成具体动作传给应用程序。这套系统就这么工作了很久,直到这两年触摸输入设备软硬件的发展,只支持传统输入就显得限制很大了。
即便是在键盘、鼠标上,DirectInput也不像它的名字那样direct了。根据Taking Advantage of High-Definition Mouse Movement,在系统内部,DirectInput会建立一个独立线程,读取WM_INPUT,所 ...
一年半之前,在开发KlayGE 4.0的时候,郭鹏就已经设计了一个资源载入系统,可以解决异步载入和重复载入的问题。但我只是实现了一个很粗略的异步载入。随着场景复杂度的需求越来越高,一个完善的资源载入系统也就成为必需。顺着之前的设计思路,我最近终于完成了实现。
目标
KlayGE的资源载入系统有几个设计要求:
至少支持Texture、Model、Effect、Font和Post Processor这五种资源,并能快速扩展支持新的资源。
可以选择同步或异步载入。
不重复载入资源,以减少浪费。
自动化管理,不需要手动指定资源ID,尽量不需要显式删除。
资源不需要单根继承。
异步无阻塞载入。
之前的ResLoader能支持2,4和5,部分支持1,并以很 ...
随着KlayGE的发展,逐渐出现了glloader、kfont、MeshMLLib等多个子库。这几个子库原本是完全独立的,但这样难免出现很多重复代码。受到Salvia的eflib和MFC的启发,在KlayGE的开发版本中加入了称为KlayGE Foundation Library的公共库,简称KFL。(不能叫KFC了,这个名字满大街都是)
KFL包括了一些平台/编译器检测的宏、类型定义、数学库、线程、Log记录、XML读写等常用代码,能用极大地减少几个子库之间的重复,减轻维护和开发的负担。KFL不依赖于KlayGE的其他任何部分,所以甚至别的项目也可以利用到它。
KFL目前存在于开发版本中,将会随着KlayGE 4.3一起发布。
经过多名成员几个月的努力,KlayGE 4.2在上周顺利发布!和上一个版本相同,在KlayGE 4.2的开发过程中,已经把一些ticket规划入KlayGE 4.3,并在十二月中旬已经提前进入了开发阶段。
时间线
这里列出几个重要的时间点,以供进度参考。
2013年5月31日,feature complete:所有功能都已经完成,没完成的推迟到下一个版本。
2013年6月15日,code complete:完成所有代码,除非特殊情况,否则不能在改变接口。
2013年6月30日,release:正式发布KlayGE 4.3。
必然出现
这些特性一定会出现在KlayGE 4.3中。其中有些需求来自于KlayMark。
Script plugin
LEAN mapping
Build by official Android NDK
Improved deferred rend ...
[zh]
经过KlayGE团队的努力,今天KlayGE 4.2正式发布了!这个版本不但提升了速度,提高了效果,还增强了工具链。KlayGE 4.2的主要更新如下:
一个新的子项目MeshML library
实验性支持WinRT平台
体积光(由王清源完成)
改进的DoF,并支持Bokeh
贴花渲染
JudaTex打包工具(由Honyeung Lau完成)
工具集增强
摄像机路径功能(王毅和胡勤协助完成)
多视口支持
优化的顶点结构
全方向SSR
更好地支持compute shader
改进的Juda texture
GPU排序
KlayGE 4.2仍然使用双协议:开放源代码的GPL和封闭的KlayGE Proprietary License(KPL)。详细情况请见Licensing。
从此处下载KlayGE 4.2。祝大家新年快乐!
...
昨天比较完各编译器对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 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。这个功能不但能用在反射,还能用于分屏显示、多视角显示、缩略图等游戏常见的情景。这样相当于 ...
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 ...