在以前的一个帖子里,我还期待NV SDK 11早日到来。结果1月份快过去了,11没到,NV却偷偷摸摸地发布了NV SDK 10.6。更新如下:
An improved version of Instanced Tessellation. This sample implements 3 major schemes for Approximating Catmull-Clark Subdivision Surfaces using instanced tessellation in both DX9 and DX10. In the sample, these three schemes are also compared in terms of their visual quality and performance.
Bug fix for StencilRoutedKBuffer: the previous version would create a DX 10.1 device, resulting in corruption errors. A modification to DXUTCore prevents the DX 10.1 device from bei ...
KlayGE中的延迟渲染(三)介绍了lighting pass的优化技巧,本篇将讲解anti-alias。
Anti-Alias
从Deferred Shading发明的一天起,anti-alias的问题就一直困扰着所有Deferred的方法。虽然很多无良的游戏厂商直接在Deferred Rendering的游戏里不支持AA,但确实AA对提升画面质量很有帮助。
Edge AA
在Deferred的框架里,很自然会想到用Edge AA来处理AA。其过程不外乎:
边缘检测,得到每个像素“像边缘的程度”
在shader里根据“像边缘的程度”来控制采样坐标
这本身并不是个复杂的过程,尤其是第二步,非常直截了当了,所以这里集中讨论的是如何进行边缘检测。
GPU Gems 2的“Deferred Shading in STALKER”一文提供了一种边缘检测的 ...
昨天NVIDIA GTX 560 Ti发布了,还启用了当年红极一时的Ti名号。但是看它的规格:
GTX460
GTX560
GTX470
CUDA Cores
336
384
448
Graphics Clock (MHz)
675
822
607
Processor Clock (MHz)
1350
1645
1215
Texture Fill Rate (billion/sec)
37.8
52.5
34
价格(CNY)
1399
1999
1999
从规格上可以看出,GTX560的core只是介于上一代的GTX460和GTX470之间,频率变高了。但价格却定位在了和GTX470一样的位置(甚至比某些GTX470还贵)。我不认为GTX560 Ti会有很高的性价比,至少不如GTX460,令人失望啊。
在KlayGE中的延迟渲染(二)里,Deferred Lighting的3个阶段都已经得到解释,本篇将讲解如何更快地计算lighting pass。
Light volume
在Deferred Rendering中,表示一个光源最简单的方法就是一个全屏的四边形。它能让G-Buffer的每一个pixel都参与计算,在pixel shader中才过滤掉多余的像素。虽然可以保证结果正确,但毕竟多余计算太多,效率不高。这里常用的一个优化就是用一个凸的几何形状来表示光源。该几何 形状覆盖的pixel才计算该光源对它的贡献。显而易见的是,spot light用圆锥,point light用球或者立方体,directional light和ambient light用全屏四边形。下图画了一个spot light的volume:
这样的几何体类似于古老的shado ...
HPG2010上有一篇Parallel SAH k-D Tree Construction,论文和代码都公开了,分别在
http://denovo.cs.illinois.edu/Pubs/10-hpg-parkd.pdf
https://github.com/bchoi/ParKD
看结果还不错,32线程可以到8倍的速度提升。
在有些设备上只有float没有double,比如前几代GPU、部分移动设备等。当非得用到double精度的时候该怎么办?
我记得去年在某个地方见到过用2个float模拟double的作法,经过一番玩命地搜索,得来全不费功夫,就在CUDA SDK的Mandelbrot例子里找到了2个float模拟double乘法的函数。甚至,GTX280上的double也是类似的方法模拟出来的,所以慢的惊人,只有float八分之一的速度。(EDIT: Mandelbrot在GTX480上,float和double都可以到60-70 fps,模拟的话只有20-30 fps,Fermi的double速度上去了)
先show一下模拟乘法的函数dsmul:
// This function multiplies DS numbers A and B to yield the DS product C.
__device__ inline void dsmu ...
在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', ...
Here is a quick summary of it’s features :
- Create countless different explosions. Each explosion is randomized and all important parameters can be changed
- Exports to PNG complete with an alpha channel. No more black backgrounds and additive blending for your explosions anymore. The result texture inlcudes a full alpha channel
- Different texture sizes (from 256×256 up to 4096×4096, depending on wether your graphics card can manage that)
- Different grid sizes for setting the number of animation frames on a texture (4×4, 8×8, 16×16)
- Use your own particle textures. Either use the in ...
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 ...