在KlayGE中的延迟渲染(一)里,我们推出了lighting pass里的计算,本篇将讲解G-Buffer阶段和Shading pass阶段。
G-Buffer分配
在Deferred Rendering的框架中,不管是Deferred Shading还是Deferred Lighting,G-Buffer的分配都是非常关键的。上一篇得出的lighting pass公式如下:
[latex]float4(1, 1, 1, (\mathbf{n} \cdot \mathbf{h_n})^{\alpha} F(c_{spec}, \mathbf{l_{cn}},\mathbf{h_n})) \times \mathbf{c}_{lightn} (\mathbf{n} \cdot \mathbf{l_{cn}})[/latex]
从公式可以看出,在light pass里需要的量有n,h,alpha,cspec,lc。因为h = (v + lc) / 2(见游戏中基于物理的渲染系列文章),而lc = normalize(l - p)(l是光源位 ...
老早就想写这篇了,但一直没空,现在抽个空写写吧。
Motivation
编译期字符串Hash的想法源于一个常见做法,字符串比较。比如在KlayGE的effect系统中,有很多if ("cull_mode" == state_name)这样的比较。加速这个操作的方法之一就是hash。但是如果改成if (0x8F1E5E5F == state_name_hash)又非常不直观。如果能有一个编译期的hash方法,先称之为CT_HASH,就可以if(CT_HASH("cull_mode") == state_name_hash),既保证直观,又保证开发效率。
尝试
要在编译期做事情首先都会想到template,但是C++的template没法提供字符串的操作,就算boost::mpl::string,也必须把一个一个字符分开塞给它才行,就像这样:
boost::mpl::string<'c', 'u', 'l', ...
KlayGE中的延迟渲染系列文章将讲述在KlayGE 3.11的Deferred Rendering例子中使用的延迟渲染方法,由5篇文章组成。
Deferred Lighting的框架
KlayGE 3.11的例子已经从Deferred Shading改成了更节省带宽的Deferred Lighting。这里先对Deferred Lighting作一个简要的介绍,并假设读者已经了解了Deferred Shading。
Deferred Lighting的渲染架构可以分为三个阶段:
G-Buffer的生成
for each light
{
Lighting pass
}
Shading pass
与Deferred Shading不同的是,shading(也就是和材质相关)的计算仅仅发生在最后一个阶段。所以,G-Buffer中需要保存的信息得到极大地减小,甚至不再需要MRT。
Lighting pass
Lighting pass ...
[zh]
在WinXP下,即使GPU支持D3D10+,也只能用D3D9的API。但实际上各个厂商都对D3D9做了一些扩展,把部分D3D10+的特性暴露给了D3D9 API。以下是一些特殊的纹理格式,通过FOURCC的方式来使用。通过CheckDeviceFormat可以检测是否支持该格式,在CreateTexture的时候传入即可。下表的源头是各厂商的GPU文档,经过Unity的Aras整理而来:
Usage列:DS=DepthStencil,RT=RenderTarget;Resource列:tex=texture,surf=surface。越绿表示越多硬件支持。
[/zh]
[en]
In WinXP, even a GPU supports D3D10+ can only uses D3D9 API. Actually, most GPU vendors have their extensions, some D3D10+'s features are exposed to D3D9 AP ...
[zh]前一阵子连载的“游戏中基于物理的渲染”系列文章经过整理,现在有一个完整的版本放在wiki网站:http://www.klayge.org/wiki/index.php?title=%E5%9F%BA%E4%BA%8E%E7%89%A9%E7%90%86%E7%9A%84BRDF。这个版本把字里行间的公式替换成了文本,而不是图片的表达方式,载入速度和连贯性有所提高。[/zh]
[en]The "Physically-based Rendering in Game" serial have a cleaned version now at KlayGE's wiki website: http://www.klayge.org/wiki/index.php?title=Physically-based_BRDF.[/en]
[zh]
上文推出了本系列最重要的方程,本片篇作为这个系列的完结篇,我会提一些未来的工作,并展示一些基于物理的渲染结果。
未来的工作
一个没有解决的问题是specular的power很高,而且非常光滑的表面。这样的材料对于渲染湿的表面这样的东西很重要。但是,精确光源的近似在这种情况下会挂掉,结果就是产生subpixel大小的极端强烈的高光,很不自然。实际上这种情况需要的是反射出光源的形状,这需要快到适合在游戏中使用的面光源近似。
另一个问题是有很多中geometry项,有没有能比$G_{implicit}$提供更好的视觉效果,同时开销很小的函数?候选之一是Kelemen et. al提出的,是对Cook-Torrance的geometry项的近似,但计算开销很小:
[/zh]
...
[zh]
上一篇“游戏中基于物理的渲染(三)”中详细讲解了microfacet BRDF,本篇将解释目前大部分游戏中所用的BRDF和基于物理的BRDF之间的区别。
这里先回顾一下第二篇中推导出来的公式:
[/zh]
[en]
In my last article "Physically-based Rendering in Game, Part 3", I explained microfacet BRDF. Here I will talk about the difference between BRDF in most current game and physically-based BRDF.
Firstly we review the equation from my second article:
[/en]
$L_0(\mathbf{v})=\pi \rho(\mathbf{l_c}, \mathbf{v}) \otimes \mathbf{c}_{light} (\mathbf{n} \cdot \mathbf{l_c})$
[zh]
对比
游戏中常用的的反射方程是这样的 ...
[zh]
上一篇“游戏中基于物理的渲染(二)”中介绍了光照的推导,本篇将讲解基于物理的BRDF。
[/zh]
[en]
In last article "Physically-based Rendering in Game, Part 2", I introduce lighting equations. In this one, I will explain you physically-based BRDF.
[/en]
Microfacet BRDF
[zh]
大多数基于物理的specular BRDF的基础是microfacet理论。这个理论是用来描述来自于一般表面(不是光学平滑的)的反射。Microfacet理论的基本假设是,表面是由很多微平面(microfacet)组成,这些微平面都太小了,没有办法一个一个地看到;并假设每个microfacet都是光学平滑的。
每个microfacet把一个入射方向的光反射到单独的一个出射方向, ...
[zh]
上一篇“游戏中基于物理的渲染(一)”中介绍了反射方程和Lambert,本篇将介绍基于物理的光源部分。
[/zh]
[en]
In my last article, "Physically-Based Rendering in Game, Part 1", I introduce reflectance equation and Lambert. In this article, we mainly focus on physically-based lighting.
[/en]
[zh]
精确光源
[/zh]
[en]
Punctual Light Sources
[/en]
[zh]
游戏中经典的光源有point, directional和spot,这些局部光源都可以抽象成“精确光源”的概念,表示一个方向确定、大小为无穷小的光源。由于要计算的是到达表面点时的光照,所以不考虑从光源到表面之间的衰减。因此,精确光源都可以用颜色$\mathbf{c}_{light}$ ...
[zh]
“游戏中基于物理的渲染”系列由4-5篇文章组成,介绍了如何在实时渲染中使用基于物理的方法。内容主要来自于SIGGRAPH 2010的course:Physically-Based Shading Models in Film and Game Production。本系列文章讲述的渲染技术用在了KlayGE中。
[/zh]
[en]
"Physically-Based Rendering in Game" serial, which contains 4-5 articals, introduces how to use physically based method in realtime rendering. The main idea comes from a course of SIGGRAPH 2010: Physically-Based Shading Models in Film and Game Production. The rendering technique in this serial is used in KlayGE 3.11.
[/en]
[zh]
引言
[/zh]
[en]
Int ...