您的位置:首页 > Web前端

使用directx11实现高质量图形效果@CGDC4

2011-08-07 13:12 483 查看
High Quality Graphic Effects using DX11@CGDC4
这个文章是让我感觉到nv诚意的一个文章,巨多的到中国来做presentation的都是把gdc上的文章再讲一遍,nv则讲了不少新的东西。
主力也都到场,也分享了很多知识。
-----------------------------------------------------------------------------------------------------------------------------------------------------
DirectCompute
direct compute是dx11相比之前版本的最根本性的变化。

以更加接近cpu的方式来做运算:需要改变思维了,天空可以说变得更宽了做一些通用运算
可以运行在任意线程上(也就脱离了graphics pipeline的限制)
对d3d资源的访问也没有变少

访问buffer如同访问内存,不再像原来是sampling的方式,不过memory layout和访问地址的计算也要自己搞了
atomic operation支持,但是也是有额外消耗的
用来做thread之间的数据交互

memory的一些东东
Memory Space
Speed
Visibility
Global Memory(Buffers, Textures, Constants)
Longest Latency
All Threads
Shared Memory(groupshared)
Fast
SingleGroup
Local Memory(Registers)
Very Fast
Single Thread
内存的效率上和cpu上类似,也要关注cache效率等但是如果读取方式类似texture,那就用texture的方式读取内存是最好的

指令执行的时候遇到branch也会有mask,但不会像cpu做的那么好了
理论上thread是格子运行的,实际上硬件里是论组(叫warp)来执行的nv上warp size是32

context switch&dependency如果数据有dependency的话,会有一些stall来确保之前的数据有被完成写入,后面的会read到正确的数据。
compute mode和graphci mode的切换会造成context switch的开销

-----------------------------------------------------------------------------------------------------------------------------------------------------
HBAO也是一种screen space ambient occlusion,以前nv的ppt里面也介绍了。直接看direct compute的优势吧,graphics pipeline在做高斯blur这种卷积运算的时候texture的访问量是pixel_num*kernel_size但是在direct compute中因为有shared memory的存在,一个thread group中存在大量的可以共享的texture 访问,那么就可以通过shared memory进行共享,那么issue出去的实际sample量就会大大降少。实际做下来的数据是:
1280x720
CS
PS
CS/PS
Full-res AO
426 fps
255 fps
1.67x
Half-res AO
593 fps
496 fps
1.20x
1600x900
CS
PS
CS/PS
Full-res AO
311 fps
168 fps
1.85x
Half-res AO
461 fps
368 fps
1.25x
可以说优势还是很明显的,这个就是一个典型例子,硬件在频率没有发生变化,但是在算法级别上有提升,仍旧会带来巨大的不同,这个也是pc的硬件能力要超越console很多才会打平手的原因所在。
这样的计算不用经过rasterizer,所以很适合compute shader来做的。
-----------------------------------------------------------------------------------------------------------------------------------------------------

OpacityMapping


这样一个效果,很多particle在里面。
常用技术就略过吧,里面几个做法和思路挺好的:

low res buffer render这个是一个最常用的做high fill rate feature优化的方法,但是大家都受low res depth和high res depth不匹配的困扰,在uncharted2这样的游戏甚至都存在
nv的解决方法是:nearest depth up sampling,把high res depth和low res depth做比较,几个点中肯定会有matching的点,就用这个

使用GatherRed可以很快的sample 2x2的low res depth

-----------------------------------------------------------------------------------------------------------------------------------------------------
StochasticTransparency


主要讲一个order independent transparency算法,当然也是基于dx11 feature的。传统的一个做法是screen door transparency,但是噪点比较严重。stochastic transparency的思路是和screen door transparency一个方向,使用sub pixel来做transparency,但是实践上是使用8xmsaa buffer,使用coverage mask(也就是SV_Coverage)滤掉一部分sub pixel,剩下的比如3个pixel就sum_color*(3.0f/8)即可。效果效率都比较好,实现起来也简单。-----------------------------------------------------------------------------------------------------------------------------------------------------
FXAA&Nsight这个没有太多好说的,fxaa速度比mlaa快,但是实际用下来效果没有mlaa好nsight逐渐变成nv主打,即便有些问题解决也是时间问题,dx9永远不会支持了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息