上一篇重现了UE4的环境BRDF渲染框架。本篇会把GGX换成更常见的Blinn-Phong BRDF。在这个过程中,整个框架仍然保持不变,从importance sampling得到的ground truth开始,逐步推出用prefiltered环境光和预计算的LUT完成基于物理的环境光渲染。只是把BRDF换掉。
采样的细节
上一篇我只是简略地说了ground truth来自于采样1024次,但并没有给出如何计算采样点。这里会有具体的做法。
生成2D空间的随机点$\xi_{\theta}$和$\xi_{\phi}$
根据BRDF的概率密度函数pdf,从$\xi_{\theta}$和$\xi_{\phi}$计算importance sampling需要的球面坐标系$s_{\theta}$和$s_{\phi}$
把球面坐标系的$s_{\theta}$和$s_{\phi}$转换成直角坐标系的halfway
-re ...
本系列源自于对Real Shading in Unreal Engine 4和Getting More Physical in Call of Duty: Black Ops II的理解。打算按照以前游戏中基于物理的渲染的思路,介绍一下如何在游戏这样的实时应用中使用基于物理的环境光。
回顾
在游戏中基于物理的渲染中列出了渲染方程的简化版,这是整个基于物理的体系的源头。
$L_0(\mathbf{v})=\int_{\Omega} \rho(\mathbf{l},\mathbf{v}) \otimes {L}_{i}(\mathbf{l}) (\mathbf{n} \cdot \mathbf{l}) d \omega_{i}$
其中,根据microfacet理论,BRDF可以表达成:
$\rho(\mathbf{l}, \mathbf{v})=\frac{F(\mathbf{l},\mathbf{h})G(\mathbf{l},\mathbf{v},\mathbf{h})D(\mathbf{h})}{4(\mathbf{n} \cdot \mathb ...
KlayGE 4.5刚刚发布,KlayGE 4.6就进入了开发阶段。这里公开一下我对KlayGE 4.6的一些规划。和以前一样,欢迎有兴趣、有时间加入KlayGE 4.6开发阵营的朋友们继续参加。
KlayGE 4.6将会支持更复杂的场景,以及更好的移动平台支持。另外,从4.6开始,发布的Windows二进制文件将采用x64,并且不在采用v120_xp等支持WinXP的toolset。如果需要x86版或支持XP的版本,请自行从源代码编译出来。
时间线
这里列出几个重要的时间点,以供进度参考。
2014年11月31日,feature complete:所有功能都已经完成,没完成的推迟到下一个版本。
2014年12月15日,code complete:完成所有代码,除非特殊情况,否则不能在改变接口。
2014年12月31 ...
在2010年字体生成工具经历了一次提速,通过只填充边缘、SSE2、Danielsson distance transform后,速度已经较快,而且很难再提升了。前不久一个朋友周赫发现了一篇paper Anti-aliased Euclidean distance transform[1]。该文提供了一个新的生成距离场的算法,只需要较小的灰度图,就能估算出叫高精度的距离场,该算法已经用于freetype-gl。这给KlayGE的字体生成工具提供了一个再次大幅度提速的机会,所以在KlayGE 4.5中,我尝试实现了这个算法。
原算法回顾
原算法的完整描述可以在这里找到。总的来说,可以把距离场的生成概括成这几个步骤。
通过freetype生成光栅化的4096x4096的灰度图,转成二值位图。
轮廓提取,得到4096x4096的轮 ...
上一篇讲了低端硬件上如何运行deferred框架。本文是这系列的最后一篇,将会介绍KlayGE 4.5中对虚拟现实设备Oculus Rift的支持。
Oculus Rift是Oculus VR公司推出的虚拟现实头盔。它几乎是市面上同等设备中价格最便宜同时效果最好的一款VR头盔。在硬件上,它分为输入和输出两个系统。输入系统是个9轴sensor(陀螺仪、罗盘、加速度计),采样率高达1000Hz。能精确提供头盔的朝向。第二代设备甚至能提供局部移动信息。输出系统是一个7寸的屏幕,因为和眼睛的距离很近,可以覆盖整个视域。
Oculus同时还提供了个Oculus SDK,可以通过它得到sensor的输入,和输出的参数。但渲染之后的后处理等,需要程序自己处理。
输入系统
KlayGE中 ...
[zh]
又到了KlayGE的发布周期。今天,KlayGE 4.5正式发布了!这个版本除了KlayGE传统上在图形方面的发展之外,在工程方面和移动平台上也有较大的改进。这个趋势还会持续下去。在这个版本的开发中,多个大的组件是由团队成员完成的,同时也有很多朋友提供了宝贵意见和bug报告,在此表示感谢。KlayGE 4.5的主要更新如下:
新子项目
DXBC2GLSL。组员林胜华完成的一个库和工具,可以把D3D compiler生成的字节码转换成OpenGL 2.0-4.4和OpenGL ES 2.0-3.1的GLSL。
引擎方面的改进
G-Buffer中更好的normal表达。
Compute shader的TBDR实现。把4.4中基于PS的light indexed deferred进一步发展成compute shader的实现,一次处理1024 ...
上一篇探讨了G-Buffer里如何紧凑并高质量地存储normal。长期以来,deferred一直被认为只能用于高端显卡,低端卡由于功能和带宽的限制,不适合使用deferred。虽然现今移动设备大行其道,但所有移动设备和桌面相比,都只能算低端。所以OpenGL ES上也一直都被forward渲染占领。一个引擎维护两套流水线是非常麻烦的事情,尤其对于KlayGE这样的开源轻量引擎。所以,如果能在低端设备上也能用同一条deferred流水线,能给维护和扩展提供巨大的方便。
经过一定的改进,deferred流水线已经可以在中上等级的OpenGL ES 2设备和D3D11 feature level 9.3设备上跑了。这样的硬件涵盖了NV GeforceFX 6000以上(2004年)、ATI Radeon X1000以上(2005年) ...
上一篇讲了基于CS的TBDR,目前KlayGE中一共有三条deferred的code path,传统的DR,基于PS的TBDR和基于CS的TBDR。但不论是什么样的deferred,都不可避免需要在G-Buffer上存normal。对G-Buffer优化的重要议题之一也是如何尽量紧凑地存储normal。
原先的做法
在KlayGE 4.0之前,G-Buffer是2张64bpp的纹理,normal用spheremap transform的方式存在2个fp16的通道里,共32bit。这样的G-Buffer占用空间相当大。在4.0的时候,G-Buffer改成了2张32bpp的纹理,normal用best fit的方法存在3个8bit通道里,共24bit。Best fit的有效位数是23bit,两个fp16的总有效位数是22bit,所以这么做反而有助于质量提升。
Normal压缩
Normal的压缩其实应该分为两 ...
KlayGE 4.4中的Tile-based Deferred Rendering(TBDR)是个基于pixel shader的算法,每个batch最多32个光源。这个方法适合于不支持compute shader的设备。因为在compute shader里,可以利用group memory把更多光源打包到同一个batch里,进一步提高效率并减少带宽。
改进的算法
CS可以通过group memory在thread之间共享数据,只要利用得好这部分,就能极大提升性能。在TBDR中,group memory主要用在两部分。第一部分是tiling阶段,用的是常见的reduce方法。先让所有thread读满32x32个depth,reduce得到1x1,再写入目标纹理。
第二部分是shading阶段。每个group会对所有光源做一次求交测试,把有效的光源写入group memory。接着在同一个sh ...
上个月底,我第一次尝试用Clang来编译KlayGE,遇到了很多麻烦,而且最终卡在了mangling的bug上。昨天更新了svn上的LLVM和Clang,惊奇地发现那个bug已经被修正了。这么一来,编译dll不再是问题,可以生成正确的binary。
新麻烦1
自己编译出clang 3.5.0的svn版之后,再次试图编译boost。原先boost并不支持Windows版的clang,所以我改了tools下的工具链,加入了clang-win.jam。结果说不认识-mthreads。去掉这个编译选项之后,编译链接通过,能生成boost的dll。但是文件名不对。首先是MinGW的情况下,首选的dll名应该以lib起头。其次,生成的文件名都是boost_*-35-mt-1_55.dll这样的形式,缺了toolset名,正确的应该是libboost_*-clang35-mt-1_ ...