Skip to content
在使用了CMakeMS之后,支持Windows Phone 8+平台就成了理所当然的一件事情了。Boost 1.56已经能支持store和phone,在进一步解决了Phyton和7z在WP下的编译之后,我就开始尝试编译KlayGE本身。 下面讨论的WP,特指VS2013支持的WP8.1。WP8.0还没时间测试。 事实上,因为原先已经可以编译成store版本,切换到WP非常顺利。只有一处需要修改:WP上没有VersionHelpers.h,而且WinRT上也用不到。所以只要#ifndef掉就可以了。除此之外,没有任何别的修改,WP版本就可以顺利编译出来了。 在用模拟器运行的时候,出现了一个异常,WP有声明但没有实现CoreCursor。WP上不需要鼠标指针。同样,这里只需要一个#ifndef跳过那句就可以了。于是,KlayGE的大 ...
几个月前KlayGE的WinRT工程就已经转到CMake的方式进行管理。但因为CMake本身不支持WinRT,当时的做法是修改CMake的代码,打上自己的补丁后才能使用。现今,CMake有了个微软的fork,从我的补丁出发,专攻WinRT等平台上的兼容问题。目前这个分支能很好地生成Windows Store和Windows Phone的工程。 使用方法 对于生成其他平台的工程,这个分支的CMake和原先完全一样。对于WinRT平台,需要通过这样的命令行参数来指定目标系统和版本号: -DCMAKE_SYSTEM_NAME=WindowsPhone(或WindowsStore) -DCMAKE_SYSTEM_VERSION=8.0(或8.1) 实际上这个做法相当于和WinCE一样,在platform generator级别生成WinRT的部分,比我原先用compiler gener ...
KlayGE 4.6的开发刚刚开始。在目前的开发版里,工程方面有了一定的改进,这里总结一下。 boost的CMake化 在之前boost升级的贴子里有提到,现在包括boost在内的所有第三方库,都已经用CMake进行管理了,bjam被完全删除。这样只要一套编译设置就能应用于KlayGE中的所有项目。修改和移植变得更容易。 编译器支持 在KlayGE 4.5里,我做了一系列的实验,试图用Clang来编译KlayGE。原先遇到了一些Clang的bug,使得编译一直不成功。现在Clang解决了部分问题,KlayGE本身的dll都能通过Clang编译产生了,但exe仍然不行。问题还是出在Clang在Windows上对类的导出,有些函数被遗漏了。 VS14已经发布了两个CTP,现在KlayGE里也增加了对VS14的支持 ...
传统上,KlayGE集成的是单数版本的boost。但这次1.56的开发周期实在太长了,原定2月份出来的,足足延期了6个月。原因应该是他们在往git上迁移,并且在做模块化的重构。现在每个boost库的头文件、源文件和帮助文件都在一个单独的git库里,通过submodule的方式加到boostorg这个上层git库中。 还好,对使用boost来说,差别不大,照样可以永远原先的方法编译和使用。所以和升级Python不同的是,把boost升级到1.56.0没有遭遇太大的麻烦。 补丁 在之前的版本里,为了在WinRT和Android上使用boost,需要打很多补丁,修改很多地方才行。这些修改在这几个版本的boost里被逐渐集成进去,所以补丁的数量减少了很多。尤其是,微软的OpenTech团队直接 ...
2011年初,KlayGE进行了第一次招募。一晃3年多过去了,在这段时间里,很多组员为KlayGE的开发做出了巨大的贡献,促成了7个版本的顺利发布。在此表示衷心地感谢。 然而,随着时间的推移,很多成员从学校毕业,进入工作岗位。或者从公司小兵变成了领军人物。能参与到KlayGE里的时间也越来越少。同时,随着越来越多的人开始研究和使用KlayGE,想为KlayGE添砖加瓦的人也逐日增加。因此,KlayGE开发团队开始了第二次招募。 招募计划 只要符合以下条件均有机会: 喜欢游戏和引擎开发 熟悉C++,有一定编程经验 有开源精神,耐心和毅力 需要注意的是,如果您只是想学习KlayGE,并不需要加入开发团队。开源的特点决定了任何人都可以拿 ...
自从2011年KlayGE在代码库中包含所有第三方库以来,Python一直都是基于3.2的版本,这几年来Python本身的发展都没跟上。最近打算把Python移植到WinRT平台,所以干脆先一鼓作气,更新到最新的3.4.1上。 升级3.4.1 把代码更新到3.4.1,虽然文件添加、删除、修改都很多,但cmake里只要做很少的修改,就能完成编译和执行。但原装的python仍然不支持android,所以还得把以前的补丁手工修改到新版本上。另外,默认情况下python用的是mbcs进行编译的,改成unicode之后有几个编译错误,也顺便修改了。纯unicode版本的好处是,Lib/encode目录下不再需要带着各种编码的.py文件,全都用utf-8就行了。 WinRT的支持 原装的python也不支持WinRT。如果直 ...
上一篇完成了specular的环境光渲染。当然,在实际效果中,diffuse也是不可缺少的。在这套基于物理的环境光渲染中,也必须要有diffuse才完整。 Irradiance map GPU Gems 2第10章详细描述了如何通过卷积cube map,得到irradiance map,并用于diffuse的环境光渲染。其基本原理就是,可以把cube map当作一个拥有无数方向光源的物体。场景中的任何一个点,都会受到cube map里所有方向光源的照射,累积起来得到最终结果。 从最基本的光照原理可以得出,对于一个点,只有normal方向的那个半球面会对这个点有影响。而且影响程度按照n dot l的大小来分布。各向同性的纯diffuse情况下,shading和视点方向无关。所以,这里可以用Spherical Harmonic ...
上一篇把BRDF换成了更为常见的blinn-phong,推出了在上面进行importance sampling的公式,以及如何把结果存到一张查找表LUT上。更进一步的做法是把这张LUT拟合成一个曲面,这样就可以在shader中直接计算,省去一次纹理采样。Black Ops II也做了拟合,但它的方法是把F=0和F=1的曲线用F=0.04来表达,最终用一个很粗糙的插值来得到整个曲面。这里我打算用暴力的方法直接拟合整个曲面。 曲线拟合 LUT有两个通道,x表达scale,y表达bias。对于这两个通道,可以表达为f(n_dot_v, roughness)这样的一个函数。原始的LUT大小为128x128,实验中发现LUT本身很平滑,即使缩小到16x16,也不容易从最终渲染结果上看区别。所以这里我们选择16x16的大小作为 ...
上一篇重现了UE4的环境BRDF渲染框架。本篇会把GGX换成更常见的Blinn-Phong BRDF。在这个过程中,整个框架仍然保持不变,从importance sampling得到的ground truth开始,逐步推出用prefiltered环境光和预计算的LUT完成基于物理的环境光渲染。只是把BRDF换掉。 采样的细节 上一篇我只是简略地说了ground truth来自于采样1024次,但并没有给出如何计算采样点。这里会有具体的做法。 生成2D空间的随机点[math]\xi_{\theta}[/math]和[math]\xi_{\phi}[/math] 根据BRDF的概率密度函数pdf,从[math]\xi_{\theta}[/math]和[math]\xi_{\phi}[/math]计算importance sampling需要的球面坐标系[math]s_{\theta}[/math]和[math]s_{\phi}[/math] ...
本系列源自于对Real Shading in Unreal Engine 4和Getting More Physical in Call of Duty: Black Ops II的理解。打算按照以前游戏中基于物理的渲染的思路,介绍一下如何在游戏这样的实时应用中使用基于物理的环境光。 回顾 在游戏中基于物理的渲染中列出了渲染方程的简化版,这是整个基于物理的体系的源头。 [math]L_0(\mathbf{v})=\int_{\Omega} \rho(\mathbf{l},\mathbf{v}) \otimes {L}_{i}(\mathbf{l}) (\mathbf{n} \cdot \mathbf{l}) d \omega_{i}[/math] 其中,根据microfacet理论,BRDF可以表达成: [math]\rho(\mathbf{l}, \mathbf{v})=\frac{F(\mathbf{l},\mathbf{h})G(\mathbf{l},\mathbf{v},\mathbf{h})D(\mathbf{h})}{4(\m ...