max用ffd晶格unity修改器器unity修改器的物体,导入unity不识别怎么办?

&img src=&/v2-bd7299d39e_b.jpg& data-rawwidth=&1200& data-rawheight=&675& class=&origin_image zh-lightbox-thumb& width=&1200& data-original=&/v2-bd7299d39e_r.jpg&&&p&题图为基于Deferred Rendering技术的渲染效果图。&/p&&p&在计算机图形学中,延迟渲染( Deferred Rendering) ,即延迟着色(Deferred Shading),是将着色计算延迟到深度测试之后进行处理的一种渲染方法。延迟着色技术的最大的优势就是将光源的数目和场景中物体的数目在复杂度层面上完全分开,能够在渲染拥有成百上千光源的场景的同时依然保持很高的帧率,给我们渲染拥有大量光源的场景提供了很多可能性。&/p&&img src=&/v2-eed8ec9bbde_b.jpg& data-rawwidth=&1024& data-rawheight=&576& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&/v2-eed8ec9bbde_r.jpg&&&p&图1 使用Deferred Rendering方法渲染的多光源场景&/p&&p&&br&&/p&&p&在《Real-Time Rendering 3rd》(实时渲染图形学第三版)的第七章“Advanced Shading · 高级着色”中,除了上篇文章中我们聊到的BRDF,还有Deferred Shading(延迟着色)这个重要概念我们没有聊到。这篇文章,就主要和大家一起聊一聊Deferred Shading和它的“前生今世”,以及文末简单提一提第八章“区域和环境光照 Area and Environmental Lighting”中的Environment Mapping(环境映射)相关的内容。下篇文章,预计直接开始全局光照(Global Illumination)的内容。&/p&&p&&br&&/p&&p&简而言之,通过阅读这篇文章,你将对以下要点有所了解:&/p&&ul&&li&延迟着色/延迟渲染的概念 Deferred Shading / Deferred Rendering&/li&&li&几何缓冲区 G-buffer&/li&&li&延迟渲染的渲染过程&/li&&li&延迟渲染 vs 正向渲染&/li&&li&延迟渲染的优缺点&/li&&li&延迟光照
Light Pre-Pass / Deferred Lighting&/li&&li&分块延迟渲染 Tile-Based Deferred Rendering&/li&&li&延迟渲染 vs 延迟光照 &/li&&li&实时渲染中常见的Rendering Path总结&/li&&li&环境映射 Environment Mapping&/li&&/ul&&p&&br&&/p&&p&&br&&/p&&h2&一、延迟渲染 Deferred Rendering&/h2&&p&&br&&/p&&p&延迟渲染( Deferred Rendering),即延迟着色(Deferred Shading),顾名思义,是将着色计算延后进行处理的一种渲染方法,在2004年的GDC上被正式提出&a href=&/?target=http%3A///gdc_2004_deferred_shading.ppt& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/g&/span&&span class=&invisible&&dc_2004_deferred_shading.ppt&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&。&/p&&p&&br&&/p&&p&我们知道,正向渲染(Forward Rendering),或称正向着色(Forward Shading),是渲染物体的一种非常直接的方式,在场景中我们根据所有光源照亮一个物体,之后再渲染下一个物体,以此类推。&/p&&p&传统的正向渲染思路是,先进行着色,再进行深度测试。其的主要缺点就是光照计算跟场景复杂度和光源个数有很大关系。假设有n个物体,m个光源,且每个每个物体受所有光源的影响,那么复杂度就是O(m*n)。&/p&&p&正向渲染简单直接,也很容易实现,但是同时它对程序性能的影响也很大,因为对每一个需要渲染的物体,程序都要对每个光源下每一个需要渲染的片段进行迭代,如果旧的片段完全被一些新的片段覆盖,最终无需显示出来,那么其着色计算花费的时间就完全浪费掉了。&/p&&p&&br&&/p&&p&而延迟渲染的提出,就是为了解决上述问题而诞生了(尤其是在场景中存在大量光源的情况下)。延迟着色给我们优化拥有大量光源的场景提供了很多可能性,因为它能够在渲染拥有成百上千光源的场景的同时还能够保持能让人接受的帧率。下面这张图展示了一个基于延迟着色渲染出的场景,这个场景中包含了1000个点光源,对于目前的硬件设备而言,用传统的正向渲染来实现几乎是不可能的。&/p&&img src=&/v2-3d9fc9c58abbda0761f8_b.jpg& data-rawwidth=&1204& data-rawheight=&816& class=&origin_image zh-lightbox-thumb& width=&1204& data-original=&/v2-3d9fc9c58abbda0761f8_r.jpg&&&p&图2 基于Deferred Rendering 渲染的含1000个点光源的场景 [J. Andersson, SIGGRAPH 2009 Beyond Programmable shading course talk] @ Frostbite 2引擎&/p&&p&&br&&/p&&p&可以将延迟渲染( Deferred Rendering)理解为先将所有物体都先绘制到屏幕空间的缓冲(即G-buffer,Geometric Buffer,几何缓冲区)中,再逐光源对该缓冲进行着色的过程,从而避免了因计算被深度测试丢弃的?元的着色而产?的不必要的开销。也就是说延迟渲染基本思想是,先执行深度测试,再进行着色计算,将本来在物空 间(三维空间)进行光照计算放到了像空间(二维空间)进行处理。&/p&&p&对应于正向渲染O(m*n)的 复杂度,经典的延迟渲染复杂度为O(n+m)。&/p&&img src=&/v2-c478c0a09c3a830e6078_b.jpg& data-rawwidth=&900& data-rawheight=&489& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&/v2-c478c0a09c3a830e6078_r.jpg&&&p&图3 Unreal Engine 3中实现的Deferred Shading
@GDC 2011&/p&&p&&br&&/p&&p&Jimmikaelkael在日发了一条推文(&a href=&/?target=https%3A///jimmikaelkael/status/273280& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/jimmikaelka&/span&&span class=&invisible&&el/status/273280&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&),分享了一组在Unity3D中基于Deferred Shading渲染的SpeedTree场景,非常逼真:&/p&&img src=&/v2-dde87252c54_b.jpg& data-rawwidth=&1200& data-rawheight=&675& class=&origin_image zh-lightbox-thumb& width=&1200& data-original=&/v2-dde87252c54_r.jpg&&&p&图4 SpeedTree deferred shading with translucency @Unity3D引擎
by jimmikaelkael&/p&&p&&br&&/p&&img src=&/v2-5caba4fdde1d568f303c21e_b.jpg& data-rawwidth=&1200& data-rawheight=&675& class=&origin_image zh-lightbox-thumb& width=&1200& data-original=&/v2-5caba4fdde1d568f303c21e_r.jpg&&&p&图5 SpeedTree deferred shading with translucency @Unity3D引擎
by jimmikaelkael&/p&&p&&br&&/p&&img src=&/v2-77ed414a5e876d1a5f5ba_b.jpg& data-rawwidth=&1200& data-rawheight=&674& class=&origin_image zh-lightbox-thumb& width=&1200& data-original=&/v2-77ed414a5e876d1a5f5ba_r.jpg&&&p&图6 SpeedTree deferred shading with translucency @Unity3D引擎
by jimmikaelkael&/p&&p&&br&&/p&&img src=&/v2-df8bd9deabd83ee2a8aa73_b.jpg& data-rawwidth=&1200& data-rawheight=&675& class=&origin_image zh-lightbox-thumb& width=&1200& data-original=&/v2-df8bd9deabd83ee2a8aa73_r.jpg&&&p&图7 SpeedTree deferred shading with translucency @Unity3D引擎
by jimmikaelkael&/p&&p&&br&&/p&&p&延迟着色中一个非常重要的概念就是G-Buffer,下面先聊一下G-Buffer。&/p&&p&&br&&/p&&h2&二、几何缓冲区 G-buffer&/h2&&p&&br&&/p&&p&G-Buffer,全称Geometric Buffer ,译作几何缓冲区,它主要用于存储每个像素对应的位置(Position),法线(Normal),漫反射颜色(Diffuse Color)以及其他有用材质参数。根据这些信息,就可以在像空间(二维空间)中对每个像素进行光照处理。&/p&&img src=&/v2-47c9fef61aa3228471bec68ce3f7cf0d_b.jpg& data-rawwidth=&828& data-rawheight=&221& class=&origin_image zh-lightbox-thumb& width=&828& data-original=&/v2-47c9fef61aa3228471bec68ce3f7cf0d_r.jpg&&&p&图8 一个典型的G-buffer layout。Source: W. Engel, “Light-Prepass Renderer Mark III” @SIGGRAPH 2009Talks&/p&&p&&br&&/p&&p&下图是一帧中G-buffer中存储的内容:&/p&&img src=&/v2-658ea16d18_b.jpg& data-rawwidth=&600& data-rawheight=&450& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-658ea16d18_r.jpg&&&p&图9 G-buffer存储的信息&/p&&p&&br&&/p&&p&&br&&/p&&h2&三、延迟渲染的过程分析&/h2&&p&&br&&/p&&p&可以将延迟渲染理解为两个Pass的过程:&/p&&p&1、几何处理阶段(Geometry Pass)。这个阶段中,我们获取对象的各种几何信息,并将第二步所需的各种数据储存(也就是渲染)到多个G-buffer中;&/p&&p&2、光照处理阶段(Lighting Pass)。在这个pass中,我们只需渲染出一个屏幕大小的二维矩形,使用第一步在G-buffer中存储的数据对此矩阵的每一个片段计算场景的光照;光照计算的过程还是和正向渲染以前一样,只是现在我们需要从对应的G-buffer而不是顶点着色器(和一些uniform变量)那里获取输入变量了。&/p&&p&下面这幅图片很好地展示了延迟着色的整个过程:&/p&&img src=&/v2-ffe0c053c00fcf_b.jpg& data-rawwidth=&800& data-rawheight=&354& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/v2-ffe0c053c00fcf_r.jpg&&&p&图10 延迟着色的过程&/p&&p&&br&&/p&&p&延迟渲染方法一个很大的好处就是能保证在G-buffer中的片段和在屏幕上呈现的像素所包含的片段信息是一样的,因为深度测试已经最终将这里的片段信息作为最顶层的片段。这样保证了对于在光照处理阶段中处理的每一个像素都只处理一次,所以我们能够省下很多无用的渲染调用。除此之外,延迟渲染还允许我们做更多的优化,从而渲染更多的光源。&/p&&p&在几何处理阶段中填充G-buffer非常高效,因为我们直接储存位置,颜色,法线等对象信息到帧缓冲中,这个过程几乎不消耗处理时间。&/p&&p&而在此基础上使用多渲染目标(Multiple Render Targets, MRT)技术,我们可以在一个Pass之内完成所有渲染工作。&/p&&p&&br&&/p&&p&总结一下,典型的Deferred Rendering 的渲染流程有两步:&/p&&p&1. 几何处理阶段:渲染所有的几何/颜色数据到G-buffer&/p&&p&2. 光照处理阶段:使用G-buffer计算场景的光照。&/p&&p&&br&&/p&&p&&br&&/p&&h2&四、延迟渲染的伪代码&/h2&&p&&br&&/p&&p&为了便于理解,这里贴出一些各种描述版本的延迟渲染算法的伪代码:&/p&&p&&br&&/p&&p&1、通用版本的延迟着色算法伪代码:&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&n&&For&/span& &span class=&n&&each&/span& &span class=&nl&&object&/span&&span class=&p&&:&/span&
&span class=&n&&Render&/span& &span class=&n&&to&/span& &span class=&n&&multiple&/span& &span class=&n&&targets&/span&
&span class=&n&&For&/span& &span class=&n&&each&/span& &span class=&nl&&light&/span&&span class=&p&&:&/span&
&span class=&n&&Apply&/span& &span class=&n&&light&/span& &span class=&n&&as&/span& &span class=&n&&a&/span& &span class=&mi&&2&/span&&span class=&n&&D&/span& &span class=&n&&postprocess&/span&
&/code&&/pre&&/div&&p&2、一个通用版本的deferred shading过程描述:&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&err&&“&/span&&span class=&n&&Standard&/span&&span class=&err&&”&/span& &span class=&n&&deferred&/span& &span class=&n&&shading&/span& &span class=&n&&is&/span& &span class=&n&&a&/span& &span class=&mi&&2&/span&&span class=&o&&-&/span&&span class=&n&&stage&/span& &span class=&nl&&process&/span&&span class=&p&&:&/span&
&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span& &span class=&n&&draw&/span& &span class=&p&&(&/span&&span class=&n&&opaque&/span&&span class=&p&&)&/span& &span class=&n&&geometry&/span& &span class=&n&&storing&/span& &span class=&n&&its&/span& &span class=&n&&attributes&/span& &span class=&p&&(&/span&&span class=&n&&i&/span&&span class=&p&&.&/span&&span class=&n&&e&/span&&span class=&p&&.&/span& &span class=&n&&position&/span& &span class=&n&&as&/span& &span class=&n&&depth&/span&&span class=&p&&,&/span& &span class=&n&&normals&/span&&span class=&p&&,&/span& &span class=&n&&albedo&/span& &span class=&n&&color&/span&&span class=&p&&,&/span& &span class=&n&&specular&/span& &span class=&n&&color&/span& &span class=&n&&and&/span& &span class=&n&&other&/span& &span class=&n&&material&/span& &span class=&n&&properties&/span&&span class=&p&&)&/span& &span class=&n&&in&/span& &span class=&n&&a&/span& &span class=&n&&number&/span& &span class=&n&&of&/span& &span class=&n&&full&/span& &span class=&n&&screen&/span& &span class=&n&&buffers&/span& &span class=&p&&(&/span&&span class=&n&&typically&/span& &span class=&mi&&3&/span& &span class=&n&&or&/span& &span class=&mi&&4&/span&&span class=&p&&)&/span&
&span class=&p&&(&/span&&span class=&mi&&2&/span&&span class=&p&&)&/span& &span class=&k&&for&/span& &span class=&n&&each&/span& &span class=&n&&light&/span& &span class=&n&&source&/span&&span class=&p&&,&/span& &span class=&n&&draw&/span& &span class=&n&&its&/span& &span class=&n&&volume&/span& &span class=&n&&and&/span& &span class=&n&&accumulate&/span& &span class=&n&&lit&/span& &span class=&n&&surface&/span& &span class=&n&&color&/span& &span class=&n&&into&/span& &span class=&k&&final&/span& &span class=&n&&render&/span& &span class=&n&&target&/span&
&/code&&/pre&&/div&&p&3、两个Pass的延迟着色算法伪代码:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&Two-pass deferred shading algorithm
Pass 1: geometry pass
- Write visible geometry information to G-buffer
Pass 2: shading pass
For each G-buffer sample, compute shading
- Read G-buffer data for current sample
- Accumulate contribution of all lights
- Output final surface color
&/code&&/pre&&/div&&p&4、多光源的延迟渲染的伪代码:&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&n&&Many&/span&&span class=&o&&-&/span&&span class=&n&&light&/span& &span class=&n&&deferred&/span& &span class=&n&&shading&/span& &span class=&n&&algorithm&/span&
&span class=&n&&For&/span& &span class=&n&&each&/span& &span class=&nl&&light&/span&&span class=&p&&:&/span&
&span class=&o&&-&/span&&span class=&n&&Generate&/span&&span class=&o&&/&/span&&span class=&n&&bind&/span& &span class=&n&&shadow&/span&&span class=&o&&/&/span&&span class=&n&&environment&/span& &span class=&n&&maps&/span&
&span class=&o&&-&/span&&span class=&n&&Compute&/span& &span class=&n&&light&/span&&span class=&err&&’&/span&&span class=&n&&s&/span& &span class=&n&&contribution&/span& &span class=&k&&for&/span& &span class=&n&&each&/span& &span class=&n&&G&/span&&span class=&o&&-&/span&&span class=&n&&buffer&/span& &span class=&nl&&sample&/span&&span class=&p&&:&/span&
&span class=&n&&For&/span& &span class=&n&&each&/span& &span class=&n&&G&/span&&span class=&o&&-&/span&&span class=&n&&buffer&/span& &span class=&n&&sample&/span&
&span class=&o&&-&/span&&span class=&n&&Load&/span& &span class=&n&&G&/span&&span class=&o&&-&/span&&span class=&n&&buffer&/span& &span class=&n&&data&/span&
&span class=&o&&-&/span&&span class=&n&&Evaluate&/span& &span class=&n&&light&/span& &span class=&n&&contribution&/span& &span class=&p&&(&/span&&span class=&n&&may&/span& &span class=&n&&be&/span& &span class=&n&&zero&/span&&span class=&p&&)&/span&
&span class=&o&&-&/span&&span class=&n&&Accumulate&/span& &span class=&n&&contribution&/span& &span class=&n&&into&/span& &span class=&n&&frame&/span&&span class=&o&&-&/span&&span class=&n&&buffer&/span&
&/code&&/pre&&/div&&p&可以将这里的多光源计算过程理解为,对每个光源创建一个屏幕空间包围矩形,然后用光照shader渲染这个矩形。&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&h2&五、延迟渲染
vs 正向渲染 &/h2&&p&&br&&/p&&p&这边对正向渲染和延迟渲染的特性做一个对照列举:&/p&&p&&br&&/p&&h2&5.1
正向渲染&/h2&&ul&&li&正向渲染(Forward Rendering),先执行着色计算,再执行深度测试。&/li&&li&正向渲染渲染n个物体在m个光源下的着色,复杂度为O(n*m)次。&/li&&li&Forward Rendering,光源数量对计算复杂度影响巨大,所以比较适合户外这种光源较少的场景。&/li&&li&Forward Rendering的核心伪代码可以表示为:&/li&&/ul&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&n&&For&/span& &span class=&n&&each&/span& &span class=&nl&&light&/span&&span class=&p&&:&/span&
&span class=&n&&For&/span& &span class=&n&&each&/span& &span class=&n&&object&/span& &span class=&n&&affected&/span& &span class=&n&&by&/span& &span class=&n&&the&/span& &span class=&nl&&light&/span&&span class=&p&&:&/span&
&span class=&n&&framebuffer&/span& &span class=&o&&+=&/span& &span class=&n&&object&/span& &span class=&o&&*&/span& &span class=&n&&light&/span&
&/code&&/pre&&/div&&p&Forward Rendering的管线流程如下:&/p&&img src=&/v2-bb3e0def65d_b.jpg& data-rawwidth=&691& data-rawheight=&777& class=&origin_image zh-lightbox-thumb& width=&691& data-original=&/v2-bb3e0def65d_r.jpg&&&p&图11 正向渲染(Forward Rendering)管线流程&/p&&p&&br&&/p&&h2&5.2 延迟渲染&/h2&&ul&&li&延迟渲染( Deferred Rendering),先执行深度测试,再执行着色计算。&/li&&li&延迟渲染渲染n个物体在m个光源下的着色,复杂度为O(n+m)次。&/li&&li&Deferred Rendering 的最大的优势就是将光源的数目和场景中物体的数目在复杂度层面上完全分开。也就是说场景中不管是一个三角形还是一百万个三角形,最后的复杂度不会随 光源数目变化而产生巨大变化。&/li&&li&Deferred Rendering的核心伪代码可以表示如下,上文已经贴出过,这边再次贴出,方便对比:&/li&&/ul&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&n&&For&/span& &span class=&n&&each&/span& &span class=&nl&&object&/span&&span class=&p&&:&/span&
&span class=&n&&Render&/span& &span class=&n&&to&/span& &span class=&n&&multiple&/span& &span class=&n&&targets&/span&
&span class=&n&&For&/span& &span class=&n&&each&/span& &span class=&nl&&light&/span&&span class=&p&&:&/span&
&span class=&n&&Apply&/span& &span class=&n&&light&/span& &span class=&n&&as&/span& &span class=&n&&a&/span& &span class=&mi&&2&/span&&span class=&n&&D&/span& &span class=&n&&postprocess&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&Deferred Rendering的管线流程如下:&/p&&img src=&/v2-fcf2b24826baa59ac7c2c833f7b167e7_b.jpg& data-rawwidth=&1122& data-rawheight=&779& class=&origin_image zh-lightbox-thumb& width=&1122& data-original=&/v2-fcf2b24826baa59ac7c2c833f7b167e7_r.jpg&&&p&图12 延迟渲染( Deferred Rendering)管线流程&/p&&p&&br&&/p&&p&&br&&/p&&h2&六、延迟渲染的优缺点分析&/h2&&p&&br&&/p&&p&这里列举一下经典版本的延迟渲染的优缺点。&/p&&p&&br&&/p&&h2&6.1 延迟渲染的优点&/h2&&p&Deferred Rendering 的最大的优势就是将光源的数目和场景中物体的数目在复杂度层面上完全分开。也就是说场景中不管是一个三角形还是一百万个三角形,最后的复杂度不会随光源数目变化而产生巨大变化。&/p&&p&一些要点:&/p&&ul&&li&复杂度仅O(n+m)。&/li&&li&只渲染可见的像素,节省计算量。&/li&&li&用更少的shader。&/li&&li&对后处理支持良好。&/li&&li&在大量光源的场景优势尤其明显。&/li&&/ul&&p&&br&&/p&&h2&6.2 延迟渲染的缺点&/h2&&p&一些要点:&/p&&ul&&li&内存开销较大。&/li&&li&读写G-buffer的内存带宽用量是性能瓶颈。&/li&&li&对透明物体的渲染存在问题。在这点上需要结合正向渲染进行渲染。&/li&&li&对多重采样抗锯齿(MultiSampling Anti-Aliasing, MSAA)的支持不友好,主要因为需开启MRT。&/li&&/ul&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&h2&七、延迟渲染的改进&/h2&&p&&br&&/p&&p&针对延迟渲染上述提到的缺点,下面简单列举一些降低 Deferred Rendering 存取带宽的改进方案。最简单也是最容易想到的就是将存取的 G-Buffer 数据结构最小化,这也就衍生出了 Light Pre-Pass(即Deferred Lighting) 方法。另一种方式是将多个光照组成一组,然后一起处理,这种方法衍生了 Tile-Based Deferred Rendering。&/p&&p&&br&&/p&&p&也就是说,常见的两种Deferred Rendering的改进是:&/p&&ul&&li&延迟光照 Light Pre-Pass(即Deferred Lighting)&/li&&li&分块延迟渲染 Tile-BasedDeferred Rendering&/li&&/ul&&p&下面分别进行说明。&/p&&p&&br&&/p&&p&&br&&/p&&h2&八、延迟光照 LightPre-Pass / Deferred Lighting&/h2&&p&&br&&/p&&p&Light Pre-Pass即Deferred Lighting(延迟光照),旨在减少传统Defferred Rendering使用G-buffer 时占用的过多开销(reduce G-buffer overhead),最早由 Wolfgang Engel于2008年在他的博客(&a href=&/?target=http%3A///2008/03/light-pre-pass-renderer.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&&/span&&span class=&invisible&&/2008/03/light-pre-pass-renderer.html&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&)中提到。&/p&&p&&br&&/p&&p&延迟光照的具体的思路是: &/p&&p&1、渲染场景中不透明(opaque )的几何体。将法线向量n和镜面扩展因子(specular spread factor)m 写入缓冲区。这个n/m-buffer 缓冲区是一个类似 G-Buffer的缓冲区,但包含的信息更少,更轻量,适合于单个输出颜色缓冲区,因此不需要MRT支持。&/p&&p&2、渲染光照。计算漫反射和镜面着色方程,并将结果写入不同的漫反射和镜面反射累积缓冲区。这个过程可以在一个单独的pass中完成(使用MRT),或者用两个单独的pass。环境光照明可以在这个阶段使用一个 full-screen pass进行计算。&/p&&p&3、对场景中的不透明几何体进行第二次渲染。从纹理中读取漫反射和镜面反射值,对前面步骤中漫反射和镜面反射累积缓冲区的值进行调制,并将最终结果写入最终的颜色缓冲区。若在上一阶段没有处理环境光照明,则在此阶段应用环境光照明。&/p&&p&4、使用非延迟着色方法渲染半透明几何体。&/p&&p&&br&&/p&&p&具体的流程图可以展示如下:&/p&&img src=&/v2-6aaa83f311c4_b.jpg& data-rawwidth=&1346& data-rawheight=&323& class=&origin_image zh-lightbox-thumb& width=&1346& data-original=&/v2-6aaa83f311c4_r.jpg&&&p&图13 Deferred Lighting流程图&/p&&p&&br&&/p&&p&相对于传统的 Deferred Render,使用 Light Pre-Pass 可以对每个不同的几何体使用不同 的 shader 进行渲染,所以每个物体的 material properties 将有更多变化。&/p&&p&这里我们可以看出对于传统的 Deferred Render,它的第二步是遍历每个光源,这样就增加了光源设置的灵活性,而 Light
Pre-Pass第三步使用的其实是 forward rendering,所以可以对每mesh 设置其材质,这两者是相辅相成的,有利有弊。&/p&&p&另一个 Light Pre-Pass 的优点是在使用 MSAA 上很有利。虽然并不是 100%使用上了 MSAA(除非使用 DX10/11 的特性),但是由于使用了Z 值和 Normal 值,就可以很容易找到边缘,并进行采样。&/p&&p&&br&&/p&&p&&br&&/p&&h2&九、分块延迟渲染 Tile-BasedDeferred Rendering&/h2&&p&&br&&/p&&p&作为传统Defferred Rendering的另一种主要改进,分块延迟渲染(Tile-Based Deferred Rendering,TBDR)旨在合理分摊开销(amortize overhead),自SIGGRAPH 2010上提出以来逐渐为业界所了解。&/p&&p&实验数据表明TBDR在大量光源存在的情况下明显优于上文提到的Light Pre-Pass。&/p&&p&&br&&/p&&p&我们知道,延迟渲染的瓶颈在于读写 G-buffer,在大量光源下,具体瓶颈将位于每个光源对 G-buffer的读取及与颜色缓冲区(color buffer)混合。这里的问题是,每个光源,即使它们的影响范围在屏幕空间上有重疉,因为每个光源是在不同的绘制中进行,所以会重复读取G-buffer中相同位置的数据,计算后以相加混合方式写入颜色缓冲。光源越多,内存带宽用量越大。&/p&&p&而分块延迟渲染的主要思想则是把屏幕分拆成细小的栅格,例如每 32 × 32 象素作为一个分块(tile)。然后,计算每个分块会受到哪些光源影响,把那些光源的索引储存在分块的光源列表里。最后,逐个分块进行着色,对每像素读取 G-buffer 和光源列表及相关的光源信息。因此,G-buffer的数据只会被读取1次且仅1次,写入 color buffer也是1次且仅1次,大幅降低内存带宽用量。不过,这种方法需要计算光源会影响哪些分块,这个计算又称为光源剔除(light culling),可以在 CPU 或 GPU(通常以 compute shader 实现)中进行。用GPU计算的好处是,GPU 计算这类工作比 CPU 更快,也减少 CPU/GPU 数据传输。而且,可以计算每个分块的深度范围(depth range),作更有效的剔除。&/p&&img src=&/v2-4f8520cdcc9aa80ec2212ddbf918a231_b.jpg& data-rawwidth=&930& data-rawheight=&298& class=&origin_image zh-lightbox-thumb& width=&930& data-original=&/v2-4f8520cdcc9aa80ec2212ddbf918a231_r.jpg&&&p&图14 Tile-Based Deferred Rendering 图示 @GDC2011,SPU-based deferred shading for Battlefield 3 onPlaystation 3.&/p&&p&&br&&/p&&p&也就是说,TBDR 主要思想就是将屏幕分成一个个小块 tile。然后根据这些 Depth 求得每个 tile 的 bounding box。对每个 tile 的 bounding box 和 light 进行求交,这样就得到了对该 tile 有作用 的 light 的序列。最后根据得到的序列计算所在 tile 的光照效果。&/p&&p&对比 Deferred Rendering,之前是对每个光源求取其作用区域 light volume,然后决定其作用的的 pixel,也就是说每个光源要求取一次。而使用 TBDR,只要遍历每个 pixel,让其所属 tile 与光线求交,来计算作用其上的 light,并利用 G-Buffer 进行 Shading。一方面这样做减少 了所需考虑的光源个数,另一方面与传统的 Deferred Rendering 相比,减少了存取的带宽。&/p&&img src=&/v2-f037e5a6fef70c0fb69f5_b.jpg& data-rawwidth=&1136& data-rawheight=&542& class=&origin_image zh-lightbox-thumb& width=&1136& data-original=&/v2-f037e5a6fef70c0fb69f5_r.jpg&&&p&图15 在分辨率下,Tile-Based vs. 传统 deferred shading&/p&&p&&br&&/p&&img src=&/v2-544fb296a43e4e852fecc1_b.jpg& data-rawwidth=&1334& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1334& data-original=&/v2-544fb296a43e4e852fecc1_r.jpg&&&p&图16 使用Tile-Based Deferred Rendering思路渲染的场景,场景含4096个点光源&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&h2&十、延迟渲染 vs 延迟光照 &/h2&&p&&br&&/p&&p&关于延迟着色和延迟光照,经常会被弄混,这边简单区分一下。&/p&&ul&&li&延迟渲染(Deferred Rendering)又称延迟着色(Deferred Shading),在2004年的GDC上被提出。&/li&&li&延迟光照(Deferred Lighting)又称Light Pre-Pass,是延迟着色的一种改进,在2008年被提出。&/li&&/ul&&p&Deferred Rendering与Deferred Lighting在思想上的主要异同:&/p&&ul&&li&DeferredShading需要更大的G-Buffer来完成对Deferred阶段的前期准备,而且一般需要硬件有MRT的支持,可以说是硬件要求更高。&/li&&li&DeferredLighting需要两个几何体元的绘制过程来来完成整个渲染操作:G-Pass与Shading pass。这个既是劣势也是优势:由于Deferred Shading中的Deffered阶段是在完全基于G-Buffer的屏幕空间进行,这也导致了物体材质信息的缺失,这样在处理多变的渲染风格时就需要额外的操作;而Deferred Lighting却可以在Shading阶段得到物体的材质信息进而使这一问题的处理变得较简单。&/li&&li&两种方法的上述操作均是只能完成对不透明物体的渲染,而透明或半透明的物体则需额外的传统Pass来完成。&/li&&/ul&&p&两者流程图的对比:&/p&&img src=&/v2-a2b21ebcfdcdca0937cc73_b.jpg& data-rawwidth=&656& data-rawheight=&305& class=&origin_image zh-lightbox-thumb& width=&656& data-original=&/v2-a2b21ebcfdcdca0937cc73_r.jpg&&&p&图17
Deferred Shading流程图&/p&&p&&br&&/p&&img src=&/v2-6aaa83f311c4_b.jpg& data-rawwidth=&1346& data-rawheight=&323& class=&origin_image zh-lightbox-thumb& width=&1346& data-original=&/v2-6aaa83f311c4_r.jpg&&&p&图18
Deferred Lighting流程图&/p&&p&&br&&/p&&p&&br&&/p&&h2&十一、实时渲染中常见的Rendering Path总结&/h2&&p&&br&&/p&&p&这一节对常见实时渲染中常见的几种 Rendering Path进行一个简单小节。&/p&&p&&br&&/p&&p&本文目前已经提到的Rendering Path有:&/p&&ul&&li&正向渲染 (Forward Rendering)&/li&&li&延迟渲染 (Deferred Rendering)&/li&&li&延迟光照 (Light Pre-Pass / Deferred Lighting)&/li&&li&分块延迟渲染(Tile-Based Deferred Rendering)&/li&&/ul&&p&除此之外,还有如下一些后来提出的Rendering Path比较有趣:&/p&&ul&&li&Forward+(即Tiled Forward Rendering,分块正向渲染)&/li&&li&群组渲染 Clustered Rendering&/li&&/ul&&p&&br&&/p&&p&篇幅原因,这边就不展开了,有兴趣的朋友不妨去查阅相关资料进行了解。&/p&&p&&br&&/p&&p&&br&&/p&&h2&十二、环境映射 Environment Mapping&/h2&&p&&br&&/p&&p&最后简单聊一聊《Real-Time Rendering 3rd》第八章“区域和环境光照 Area and Environmental Lighting”中的EnvironmentMapping环境映射。下一篇文章,就直接开始提炼第九章“Global Illumination 全局光照”的内容。&/p&&p&Environment mapping(环境映射),又称Reflection Mapping(反射映射),是计算机图形学领域中使用基于图像的光照(Image-Based Lighting,IBL)技术,用预先计算的纹理图像模拟复杂镜面的一种高效方法。由Blinn 和 Newell 在1976首次提出。&/p&&p&由于是事先准备好的数据,这种实现方法比传统的光线跟踪算法效率更高,但是需要注意的是这种方法是实际反射的一种近似,有时甚至是非常粗糙的近似。这种技术的一个典型的缺点是没有考虑自反射,即无法看到物体反射的物体自身的某一部分。&/p&&img src=&/v2-a39ac847f66e444da223d24bbd7ebf53_b.jpg& data-rawwidth=&1024& data-rawheight=&512& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&/v2-a39ac847f66e444da223d24bbd7ebf53_r.jpg&&&p&图19 Image Based Lighting Environment Mapping 环境映射效果图&/p&&p&&br&&/p&&p&环境映射的常见类型有:&/p&&ul&&li&球型环境映射 Sphere Environment Mapping&/li&&li&立方体环境映射 Cubic Environment Mapping&/li&&li&抛物线环境映射 Parabolic Environment Mapping&/li&&/ul&&p&环境映射的一些引申:&/p&&ul&&li&光泽反射环境映射(Glossy Reflections from Environment Maps)&/li&&li&基于视角的反射映射(View-Dependent Reflection Maps)&/li&&li&辐照度环境映射 (Irradiance Environment Mapping)&/li&&/ul&&p&&br&&/p&&p&另外,推荐一个下载CubeMap资源的站点:&/p&&p&&a href=&/?target=http%3A//www.humus.name/index.php%3Fpage%3DTextures& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&humus.name/index.php?&/span&&span class=&invisible&&page=Textures&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&&br&&/p&&p&&br&&/p&&h2&Reference&/h2&&p&&br&&/p&&p&[1] Lauritzen, Andrew. &Deferredrendering for current and future rendering pipelines.& SIGGRAPH Course:Beyond Programmable Shading (2010): 1-34.&/p&&p&[2] Coffin, Christina. &SPU-based deferredshading for Battlefield 3 on Playstation 3.& Game Developer ConferencePresentation. Vol. 8. 2011.&/p&&p&[3] Lee M. Pre-lighting in Resistance 2[J].GDC San Francisco, 2009.&/p&&p&[4] Valient M. Deferred rendering inKillzone 2[C]//The Develop Conference and Expo. 2007.&/p&&p&[5]Andersson, Johan. &Directx 11rendering in battlefield 3.& Game Developers Conference. Vol. 2. 2011.&/p&&p&[6] &a href=&/?target=http%3A///ghl_carmack/p/4150232.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/ghl_carmack&/span&&span class=&invisible&&/p/4150232.html&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&[7] &a href=&/?target=https%3A///jimmikaelkael/status/273280& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/jimmikaelka&/span&&span class=&invisible&&el/status/273280&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&[8] &a href=&/?target=http%3A///blog/deferred-lighting-approaches/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/b&/span&&span class=&invisible&&log/deferred-lighting-approaches/&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&[9] &a href=&/?target=http%3A///2014/many-lights/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/2014/many-l&/span&&span class=&invisible&&ights/&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&[10] &a href=&/?target=http%3A///polobymulberry/p/5126892.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/polobymulbe&/span&&span class=&invisible&&rry/p/5126892.html&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&[11] &a href=&/?target=http%3A//blog.csdn.net/bugrunner/article/details/7436600& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&blog.csdn.net/bugrunner&/span&&span class=&invisible&&/article/details/7436600&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&[12] &a href=&/?target=https%3A//learnopengl-cn.readthedocs.io/zh/latest/05%2520Advanced%2520Lighting/08%2520Deferred%2520Shading/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&learnopengl-cn.readthedocs.io&/span&&span class=&invisible&&/zh/latest/05%20Advanced%20Lighting/08%20Deferred%20Shading/&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&[13] &a href=&/?target=http%3A///ghl_carmack/p/4150232.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/ghl_carmack&/span&&span class=&invisible&&/p/4150232.html&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&[14] &a href=&/?target=http%3A///%3Fp%3D141& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/?&/span&&span class=&invisible&&p=141&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&[15] &a href=&/?target=https%3A///photos/mylaboratory//in/photostream/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&/photos/mylab&/span&&span class=&invisible&&oratory//in/photostream/&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&[16] &a href=&/?target=https%3A////light-pre-pass-vs-deferred-renderer-part-1/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&&/span&&span class=&invisible&&//light-pre-pass-vs-deferred-renderer-part-1/&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&[17] CMU 15869 lecture 12 Slides:&/p&&p&&a href=&/?target=http%3A//www.cs.cmu.edu/afs/cs/academic/class/15869-f11/www/lectures/12_deferred_shading.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&cs.cmu.edu/afs/cs/acade&/span&&span class=&invisible&&mic/class/15869-f11/www/lectures/12_deferred_shading.pdf&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&[18] Lauritzen A. Deferred rendering forcurrent and future rendering pipelines[J]. SIGGRAPH Course: Beyond ProgrammableShading, . &a href=&/?target=https%3A///sites/default/files/m/d/4/1/d/8/lauritzen_deferred_shading_siggraph_2010.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/site&/span&&span class=&invisible&&s/default/files/m/d/4/1/d/8/lauritzen_deferred_shading_siggraph_2010.pdf&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&[19] Nguyen, Hubert. GPU Gems 3. Chapter 19. Addison-Wesley Professional, 2007.&/p&&p&&/p&
题图为基于Deferred Rendering技术的渲染效果图。在计算机图形学中,延迟渲染( Deferred Rendering) ,即延迟着色(Deferred Shading),是将着色计算延迟到深度测试之后进行处理的一种渲染方法。延迟着色技术的最大的优势就是将光源的数目和场景中物体的数…
&img src=&/v2-ac7950dccd36e8d0c10f3cb47d3afda0_b.jpg& data-rawwidth=&1920& data-rawheight=&807& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/v2-ac7950dccd36e8d0c10f3cb47d3afda0_r.jpg&&&p&在最近举办的High Performance Graphics 2017上我们发表了一篇关于光线追踪降噪的论文,并且有幸拿了个最佳Paper。链接在此:&a href=&/?target=http%3A//behindthepixels.io/assets/files/hpg17_svgf.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Spatiotemporal Variance-Guided Filtering: Real-Time Reconstruction for Path-Traced Global Illumination&i class=&icon-external&&&/i&&/a&。&/p&&p&近年来光线追踪渲染降噪算是一个蛮流行的研究方向,也正是得益于各种层出不穷的降噪算法,使用光线追踪计算全局光照才在电影特效中变的实际,大大加快了基于路径追踪(Path Tracing)渲染的收敛速度。然而之前绝大部分的渲染降噪算法所接受的输入图像的噪点大小都相对有限:通常是一副每个像素有几十个甚至几百个光线样本所渲染的图像。这些算法通过处理可以将这些带有噪点的图像还原到和已经收敛的最终渲染结果非常接近的程度。&/p&&p&然而对于每一帧都最多只能用时16毫秒以下的实时游戏渲染来说,假设要在游戏中使用光线追踪求解全局光照,那么每个像素的光线求交和着色的预算都不可能达到“数十个”样本的级别。所以Spatiotemporal Variance-Guided Filter (SVGF)的设计初衷和之前大部分的降噪算法不同,我们的目标就是针对输入的图像每个像素的样本非常非常少,甚至只有一个样本的情况下也能将图像还原到至少看起来比较自然、舒适的程度。&/p&&p&然而在每像素只有一个样本(1 Sample per PIxel, 1SPP)的时候,图像的噪点会大到基本不能看。下面是一个1SPP渲染的例图。可以看出来,经过我们在渲染阶段已经用了各种减少噪点的小trick,但是噪点仍然非常非常严重。尤其在只被间接光照照亮的区域,基本上每数十个像素中只有非常少量的像素不是黑色的。要从这样的输入中重建出收敛过后的图像,挑战还是很大的。&/p&&img data-rawheight=&648& src=&/v2-ab0feedba2a3a8_b.png& data-rawwidth=&1152& class=&origin_image zh-lightbox-thumb& width=&1152& data-original=&/v2-ab0feedba2a3a8_r.png&&&p&下图则是完全收敛后的参考结果。经过对比,1SPP的图片不仅噪点巨大,和参考结果对比时,图片的明暗都有些差别。&/p&&img data-rawheight=&648& src=&/v2-01a525b1e096efaed6134f6_b.png& data-rawwidth=&1152& class=&origin_image zh-lightbox-thumb& width=&1152& data-original=&/v2-01a525b1e096efaed6134f6_r.png&&&p&下面这张图则是将1SPP的图片输入给SVGF得到的结果。虽然和参考结果相比丢失了一些细节,但是整体还原的质量还是非常高的。&/p&&img data-rawheight=&648& src=&/v2-812aa3d9098b8bdb57c5_b.png& data-rawwidth=&1152& class=&origin_image zh-lightbox-thumb& width=&1152& data-original=&/v2-812aa3d9098b8bdb57c5_r.png&&&h2&算法目标和需求&/h2&&p&我们的目的主要是探索在实时渲染的程序中使用光线追踪去达到动态的全局光照,模糊反射,区域光软阴影等效果。所以我们需要做到以下几点:&/p&&ul&&li&Filter的结果在时间维度上稳定,没有帧间抖动等问题。&/li&&li&Filter的输入图片采样率可能极度稀疏,对于1SPP的1输入也必须输出感官上好看的结果。&/li&&li&并不拘泥于一定要收敛到无偏(Unbiased)的参考结果,因为要去除大量的噪点所以可以过度Filter,但同时尽可能的保留着色的细节(纹理,阴影等)。&/li&&li&Filter的速度一定要满足实时渲染的时间预算,通常是十几毫秒,并且要留出足够的预算做着色。这基本上排除了使用许多比较高级的Filter的可能性(例如Non-Local Mean,甚至是半径比较大的Cross-Bilateral都可能超出预算)&/li&&li&Filter本身和光线传递的模拟无关,应该适用于各种单向、双向路径追踪以及基于Density Estimation的方法。&/li&&/ul&&p&听起来以上都是非常“严苛”的需求。但实时程序带来的一个优势是,我们假设屏幕空间的GBuffer数据是完全没有噪点的,因为实时渲染中的GBuffer都由光栅化生成,不会像离线渲染那样因为要支持景深或者动态模糊这样的特效而连GBuffer都是需要大量的样本才能收敛。GBuffer中的信息常常被用来作为Filter的辅助,所以没有噪点的GBuffer会带来不少便利。&/p&&p&&br&&/p&&h2&算法概括&/h2&&p&SVGF处理极低样本数量的核心思想就是结合时间和空间上的信息一起做Filter。因为每一帧每个像素都只有一个着色样本,我们只能把每个像素的样本在时间上均匀分布开来,并且尝试在将过去帧的信息用在当前帧的Filter中,类似现在流行的Temporal Anti-Aliasing。同时,过去数帧的信息还可以提供一个当前像素区域样本分布的Variance(方差)大小的估计,这个Variance的信息则会影响空间上Filter。&/p&&p&算法的流程图如下:&/p&&img data-rawheight=&393& src=&/v2-c72fdcf93c8f0a33d9a0_b.png& data-rawwidth=&754& class=&origin_image zh-lightbox-thumb& width=&754& data-original=&/v2-c72fdcf93c8f0a33d9a0_r.png&&&p&&br&&/p&&p&大致流程其实很简单。每个像素的颜色首先被分解成直接光照和间接光照两部分。然后我们通过除以像素上的纹理信息(Demodulate Albedo)得到像素的Irradiance(照度),接着对分别对直接光照和间接光照的Irradiance信息进行时间和空间上的混合Filter来重建因为样本极度稀疏所丢失的信息。对Irradiance进行Filter之后,再把纹理信息叠加回来。这样做的好处是,纹理的细节并不会因为Filter的强度过于大而丢失掉。在Pipeline的最后,我们采用现在引擎里非常流行的Temporal AA,更进一步的消除画面上残留的抖动,保证结果序列帧间的稳定。&/p&&h2&Filter详细介绍&/h2&&p&下面更具深入的介绍上文流程图中的Reconstruction Filter这一部分,也就是上文中提到过的时间空间混合Filter。&/p&&p&&b&Temporal Filter&/b&&/p&&p&首先,Temporal Filter其实非常简单粗暴,用的就是在TAA里同样也使用的Exponential Moving
Average混合当前帧像素 &img src=&/equation?tex=C_i& alt=&C_i& eeimg=&1&& 和经过motion vector reprojection之后的历史帧像素 &img src=&/equation?tex=C_%7Bi-1%7D& alt=&C_{i-1}& eeimg=&1&& 。&/p&&p&&img src=&/equation?tex=C_i%3D%5Calpha+C_i%2B%281-%5Calpha%29+C_%7Bi-1%7D& alt=&C_i=\alpha C_i+(1-\alpha) C_{i-1}& eeimg=&1&&&/p&&p&Temporal Filter和Temporal AA的一个重要差别在于,为了尽可能多的囊括历史帧里的样本信息,Temporal Filter并不像TAA那样通过Color Clamping来防止Ghosting这种问题。所以我们在做Sample Reprojection的时候需要check当前帧的纹理颜色,世界坐标位置,法线,模型索引,屏幕空间深度等,去尽可能的丢弃无效的历史样本。关于Temporal Filter可能有的Ghosting问题,可以参考我之前的这一篇文章:&a href=&/p/& class=&internal&&Temporal Anti-Aliasing&/a&。&/p&&p&&b&Variance Estimation(方差估计)&/b&&/p&&p&通过在时间上积累Luminance的First和Second Moment, &img src=&/equation?tex=%5Cmu_1%27& alt=&\mu_1'& eeimg=&1&& 和 &img src=&/equation?tex=%5Cmu_2%27& alt=&\mu_2'& eeimg=&1&& ,则可以通过公式&/p&&p&&img src=&/equation?tex=%5Csigma_i%27%5E%7B2%7D+%3D%5Cmu%27_%7B2i%7D+-+%7B%5Cmu%27_%7B1i%7D%7D%5E%7B2%7D+& alt=&\sigma_i'^{2} =\mu'_{2i} - {\mu'_{1i}}^{2} & eeimg=&1&&&/p&&p&来计算出Luminance的Variance &img src=&/equation?tex=%5Csigma_i%27%5E%7B2%7D& alt=&\sigma_i'^{2}& eeimg=&1&&。当然,并不是每个像素都有有效的历史信息,例如运动的物体可以造成某写像素在前一帧被遮挡住,只有当前帧才出现。所以针对所有有效历史样本数量小于4的情况,我们则使用一个7x7像素大小的Cross Bilateral Filter去在空间上估计Luminance方差,指导有效样本数量大于等于4才采用在时间上积累的估计量。&/p&&p&&b&Spatial Filter&/b&&/p&&p&对于Spatial Filter我们选择了使用&a href=&/?target=https%3A//jo.dreggn.org/home/2010_atrous.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Edge-Avoiding ?-Trous Wavelet Transform for fast Global Illumination Filtering&i class=&icon-external&&&/i&&/a&这篇文章中的方法,基本上可以把他当成是一个对Cross Bilateral Filter的在小波分解频域上的空间快速近似。具体的理论和实现的伪代码可以直接戳上面论文的链接。&/p&&p&类似Cross Bilateral Filter, A-Trous Wavelet也需要提供一个Edge Stopping函数去避免把边缘给模糊掉。我们采用的Edge Stopping函数除了常用的屏幕空间深度以及像素法线意外,还采用了之前估计的像素的方差大小。&br&&/p&&p&直观的理解就是,对于方差,也就是噪点很小的区域,例如完全在阴影里的区域,我们则在减小在空间上Filter的力度。具体的Edge Stopping权重的计算可以参考paper的4.4章节。&/p&&p&总结一下,Filter的整体Pipeline如下:&/p&&p&&br&&/p&&img data-rawheight=&330& src=&/v2-ba3ddbbfbc51_b.png& data-rawwidth=&1106& class=&origin_image zh-lightbox-thumb& width=&1106& data-original=&/v2-ba3ddbbfbc51_r.png&&&p&&br&&/p&&p&基本流程就是,现在时间上用Exponential Moving Average积累像素的Irrdiance颜色信息用来增加每像素在1SPP情况下的有效样本数量,同时在时间上积累Luminance的First & Second Moment去估计每像素的方差大小。方差大小又作为后续Spatial Filter中Edge Stopping函数的输入去更好的指引Spatial Filter在不同噪点区域的力度。&/p&&h2&结果&/h2&&p&下面放出针对几个不同场景和光照环境的降噪结果以及和之前一些算法的对比。首先时Sponza:&/p&&img data-rawheight=&586& src=&/v2-69d7faaa8d462_b.png& data-rawwidth=&1153& class=&origin_image zh-lightbox-thumb& width=&1153& data-original=&/v2-69d7faaa8d462_r.png&&&p&&br&&/p&&p&还有另一个教室场景:&/p&&p&&br&&/p&&img data-rawheight=&585& src=&/v2-ed227cf29df3b4b7311d9_b.png& data-rawwidth=&1151& class=&origin_image zh-lightbox-thumb& width=&1151& data-original=&/v2-ed227cf29df3b4b7311d9_r.png&&&p&&br&&/p&&p&可以看出我们的SVGF在针对1SPP输入的情况下,比之前的算法效果都要好不少。&/p&&p&下图是算法时间预算在720p分辨率下的分解图:大概稳定在4毫秒左右,比较符合实时渲染的预算要求。可以看出大部分时间都花在Spatial Filter上。后续还会做更多的优化工作去更进一步的加速这个步骤。&/p&&p&&br&&/p&&img data-rawheight=&313& src=&/v2-8fac28f53e908194dabc_b.png& data-rawwidth=&872& class=&origin_image zh-lightbox-thumb& width=&872& data-original=&/v2-8fac28f53e908194dabc_r.png&&&p&&br&&/p&&p&最后再贴一个视频链接:&a href=&/?target=http%3A//cwyman.org/videos/hpg17_variancedGuidedFiltering.mp4& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&cwyman.org/videos/hpg17&/span&&span class=&invisible&&_variancedGuidedFiltering.mp4&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&&br&&/p&&h2&限制&/h2&&p&SVGF在大部分静态场景下能达到感官上非常舒服的效果,使得基于光线追踪的全局光照效果在实时渲染中变的可能。但是一个很大的限制是它对于时间上历史信息的依赖。所以对于动态场景,要非常健壮的检测无效历史样本还是意见不那么简单的事情,如果这个问题没有做好,就还是会有所以基于Temporal Filter的各种问题存在,例如Ghosting。&/p&&p&另一个问题是,场景中的许多渲染特征是无法精确的计算Motion Vector的。例如阴影,无论是Occluder的移动还是光源的移动都会造成Shadow的移动,但是Shadow的移动方向并无法简单像屏幕空间的物体一样用一个线性的投影矩阵变化来求得。由于没有正确的Motion Vector,Shadow这一类Filter结果会有时间上的滞后(Temporal Lag),如下图。尝试解决这些问题将会是后续工作。&/p&&img data-rawheight=&393& src=&/v2-b0ef5ea3380efe61cf046_b.png& data-rawwidth=&698& class=&origin_image zh-lightbox-thumb& width=&698& data-original=&/v2-b0ef5ea3380efe61cf046_r.png&&&p&&br&&/p&&p&另一个限制是,Filter中的许多步骤都依赖于一个没有噪点的GBuffer。这种情况对于想要通过光线追踪模拟景深或者动态模糊等Stochastic效果的渲染来说,就无法满足了。&/p&&h2&总结&/h2&&p&即使在输入图片的样本数量极度少的情况下,SVGF在大部分静态场景下能通过利用时间和空间上的信息重建出非常接近于参考结果的图片,使得基于光线追踪的全局光照效果在实时渲染中变的可能。&/p&
在最近举办的High Performance Graphics 2017上我们发表了一篇关于光线追踪降噪的论文,并且有幸拿了个最佳Paper。链接在此:。近年来光线追踪渲…
&p&中国幅员辽阔,地区差异明显,国内三大运营商,每家情况都可能不同。对联通友好的不一定对电信友好,移动宽带虽然国内网速渣,但国际出口却很牛逼。而且以国人一贯所为必上多倍发包加速软件,锐速、kcptun哪个不暴力?最后肯定被玩坏(&b&建议配合使用谷歌BBR加速,&/b&&a href=&///?target=http%3A///12.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CentOS 6/7 x86_64更换4.9版本内核,支持Google BBR拥塞控制算法&i class=&icon-external&&&/i&&/a&)。&/p&&p&所谓授人与鱼不如授人与渔,我来介绍下自己常用的测试方法,拿digitalocean立一个反面教材,现在已经变残!&/p&&p&&b&测试方式:&/b&ping延迟、路由跟踪、丢包率测试和100M文件下载测速
(不必全部采用)&/p&&p&&b&测试对象:&/b&&a href=&///?target=https%3A//m.do.co/c/e3bf65eb23e7& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&DigitalOcean&i class=&icon-external&&&/i&&/a&&b&旧金山机房&/b&&/p&&p&&b&测速ip: &/b&&a href=&///?target=http%3A//speedtest-/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&http://speedtest-&i class=&icon-external&&&/i&&/a&&/p&&p&&b&100 M 下载测速&/b&: &a href=&///?target=http%3A//speedtest-/100mb.test& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&speedtest-&/span&&span class=&invisible&&/100mb.test&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&(&b&如何寻找测试ip和测速文件?关键字 “厂商 + Speedtest/Looking Glass”&/b&)&/p&&p&&b&一、ping测速 :&/b&低延迟是一个很好的开端,网络游戏对这个要求高。据我经验延迟超过220ms的VPS,不仅用putty操作时很可能出现无响应导致软件安装进程中断,在线网页操作速度也慢。我给的建议是延迟最好在170ms以下。&/p&&p&个人:直接 ping -t 命令即可。&/p&&p&站长: &a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&多个地点Ping服务器,网站测速 - 站长工具&i class=&icon-external&&&/i&&/a&&/p&&p&DO旧金山机房平均延迟已经250ms,不少超过300ms的,这怎么用?&/p&&p&&br&&/p&&img src=&/v2-ac6a66b24e12fd5b252225_b.png& data-rawwidth=&600& data-rawheight=&379& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-ac6a66b24e12fd5b252225_r.png&&&p&&br&&/p&&p&&b&二、路由跟踪 :&/b&主要看走什么线路,是否直连!如果绕来绕去的话,我肯定是不买的。在这里提个醒,不要想当然地以为香港的VPS肯定就是直连,大家可以测试下香港SoftPlayer是不是绕了全中国了?当然即使是香港直连延迟低,也不见得它速度就快,怕就怕它技术不行,丢包率高或者偷偷限速,香港gigsgigscloud就是如此.&/p&&p&针对企业的优质线路有电信CN2,ip开头是59.43.x.x. 联通有精品网 AS9929 ,不过一般很少见到。&/p&&p&个人:使用ipip出品的本地可视化跟踪工具Best trace ,地图显示ip对应地点。&/p&&p&下载地址:&a href=&///?target=http%3A//cdn.ipip.net/17mon/besttrace.exe& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&cdn.ipip.net/17mon/best&/span&&span class=&invisible&&trace.exe&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&站长:使用ipip的在线traceroute工具,可以全国各地任选机房,跟踪完毕后同样可以生成地图。&a href=&///?target=http%3A//www.ipip.net/traceroute.php& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&链接: TraceRoute查询_最专业的 IP 地址库_IPIP.NET&i class=&icon-external&&&/i&&/a&&/p&&p&上海联通用户到美国旧金山机房居然绕广州!明明可以直连,延迟都300ms了。&/p&&p&&br&&/p&&img src=&/v2-d0b24abaf0c_b.png& data-rawwidth=&600& data-rawheight=&396& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-d0b24abaf0c_r.png&&&p&下面是生成的地图&/p&&p&&br&&/p&&img src=&/v2-988edccb61a47f739885ec_b.png& data-rawwidth=&600& data-rawheight=&349& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-988edccb61a47f739885ec_r.png&&&p&&br&&/p&&p&&br&&/p&&p&三、&b&丢包率测试&/b&&/p&&p&测试工具:MTR ,其实是将ping命令与traceroute结合起来的一个工具 ,可以查看每个路由结点的丢包率,问题是出在自己这一方的运营商呢还是对方呢?丢包率高,网络不稳定,一会快一会慢是不行的。如果你觉得网络不好,可以将MTR测试报告给服务商,让他们负责优化。&/p&&p&个人:使用WinMTR ,下载地址:&a href=&///?target=http%3A//winmtr.net/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&WinMTR - Free Network Diagnostic Tool&i class=&icon-external&&&/i&&/a&&/p&&p&站长:推荐&a href=&///?target=http%3A///mtr& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MTR测试 网站速度测试 17CE&i class=&icon-external&&&/i&&/a& ,机房不多可以做参考。&/p&&p&我选取了一个安徽联通机房做测试,结果发现居然绕欧洲了,而且接口处丢包率达到50%&/p&&p&&br&&/p&&p&&br&&/p&&img src=&/v2-de74ecaa16b6a3651a1faa_b.png& data-rawwidth=&967& data-rawheight=&696& class=&origin_image zh-lightbox-thumb& width=&967& data-original=&/v2-de74ecaa16b6a3651a1faa_r.png&&&p&&br&&/p&&p&&br&&/p&&p&&b&四、 100 M 文件下载测速:&/b&下载速度建议&b&至少200K/S&/b&,这个不单与服务器有关,与自家宽带也有关系。自家带宽越大,干扰越强,请务必结合其他因素考虑。&/p&&p&个人下载100M测速文件:&a href=&///?target=http%3A//speedtest-/100mb.test& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&speedtest-&/span&&span class=&invisible&&/100mb.test&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&站长:推荐网站测速| &a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&&i class=&icon-external&&&/i&&/a& ,使用get指令来执行全国各地下载测速,下面的图只贴了一部分,我观察全部的检测结果电信速度确实很不错。&/p&&p&之前测过安徽联通的丢包率,这回测试下载速度,结果却是没反应。并且不少下载速度&/p&&p&在200K/S以下的 ,我只截取部分,感兴趣可以自己测试。&/p&&p&&br&&/p&&img src=&/v2-a08c8a0c054bcad4d3a959_b.png& data-rawwidth=&967& data-rawheight=&629& class=&origin_image zh-lightbox-thumb& width=&967& data-original=&/v2-a08c8a0c054bcad4d3a959_r.png&&&p&&br&&/p&&p&&br&&/p&&p&以上工具可以起到基本的辅助作用,但也要去别的论坛探探底,推荐V2EX 。有些商家很缺德,给你测试的ip和测速文件就是个幌子!&/p&&p&&b&购买前的测试方式讲完了,那我就推荐一些便宜但是性价比很高的VPS,速度是不错的,事先说明:没准以后也会被玩烂&/b&&/p&&p&&br&&/p&&p&1、&b&樱花免费docker
&/b&&/p&&p&&b&测速ip:153.125.238.209&/b&&/p&&p&大名鼎鼎的樱花VPS,口碑一直很好,以前一直想买买不到,现在出了docker,敬请期待吧!延迟在100ms左右,免费申请地址:&a href=&///?target=https%3A//app.arukas.io/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Arukas Control Panel&i class=&icon-external&&&/i&&/a&
.&/p&&p&建议使用&b&github账户&/b&申请,审核速度更快!如果个人新注册账户申请,没准不会通过。&/p&&p&更新:官方邮件通知免费至今年6月30日 。目前已停止申请,等待通知。&/p&&p&&br&&/p&&p&&b&2、 &a href=&///?target=http%3A///promo25b/%3Fref%3D6879912& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Vultr:High Performance Cloud Servers&i class=&icon-external&&&/i&&/a&&/b& &/p&&p&东京机房测速: (移动用户请选择新加坡机房) &/p&&p&测速ip: &a href=&///?target=http%3A//hnd-jp-/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&http://hnd-jp-&i class=&icon-external&&&/i&&/a&&/p&&p&100 M下载文件: &a href=&///?target=https%3A//hnd-jp-/.100MB.bin& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&hnd-jp-/v&/span&&span class=&invisible&&.100MB.bin&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&&b&vultr每月2.5美元,512M内存&/b&!&b& 按小时付费。有免费快照,不想用直接快照备份然后删除服务器是不收费的,特别适合那啥。&/b&&/p&&p&对我自己来说速度还是不错的,下面是我之前东京机房个人测速截图,不过现在东京机房被玩烂了,有些地区比不上洛杉矶了.东京的延迟不错,100ms左右,感兴趣的也可以测试下:&/p&&p&&br&&/p&&p&&br&&/p&&img src=&/v2-823bc1b5ac48c28c178a50b7aa48a238_b.png& data-rawwidth=&600& data-rawheight=&133& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-823bc1b5ac48c28c178a50b7aa48a238_r.png&&&p&&br&&/p&&p&&b&3、&/b&&a href=&///?target=https%3A//bwh1.net/aff.php%3Faff%3D13153%26pid%3D43& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Bandwagon Host &i class=&icon-external&&&/i&&/a&&/p&&p&官方测速ip:107.182.184.6 &/p&&p&100M 下载测速:&a href=&///?target=http%3A//107.182.184.6/100mb.bin& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&107.182.184.6/100mb.bin&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&搬瓦工以前推出过年付3.99刀的openvz套餐,引来抢购狂潮,我以前也跟很多人一样觉得超售如此厉害,网络一定很糟糕。怀着迟疑的态度买了一款,后来测试速度还不错,而且没有什么丢包,可见其技术实力。&/p&&p&现在洛杉矶机房对移动联通很友好,月付2.99美元(年付19.99美元),512 M 内存,500 GB流量 ,KVM架构 。KVM架构可以安装加速软件,不容易超售。&/p&
中国幅员辽阔,地区差异明显,国内三大运营商,每家情况都可能不同。对联通友好的不一定对电信友好,移动宽带虽然国内网速渣,但国际出口却很牛逼。而且以国人一贯所为必上多倍发包加速软件,锐速、kcptun哪个不暴力?最后肯定被玩坏(建议配合使用谷歌BBR加…
&p&正好我们也在做相应的尝试 移动端做PBR 主要做好分级 应为对于高端机来说 其实全套PBR也能承受 但是对于低端机来说,增加一次采样都会增加好多压力。&/p&&p&主要压力来于IBL,至于使用phong还是GGX 感觉没有很大区别,看你们美术更喜欢哪个了。&/p&&p&移动端用PBR主要就解决IBL的fallBack,低端机型如何仿出效果。还有最难的就是推动工作流。&/p&&p&unity上的优化方向主要有用 IBL用了SH+Fresnel模拟。还有直接光给了三挡用来简化计算。&/p&&p&参考文章:&/p&&p&&a href=&///?target=http%3A///blog/optimizing-ggx-shaders-with-dotlh/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Optimizing GGX Shaders with dot(L,H)&i class=&icon-external&&&/i&&/a&&/p&&p&&/p&
正好我们也在做相应的尝试 移动端做PBR 主要做好分级 应为对于高端机来说 其实全套PBR也能承受 但是对于低端机来说,增加一次采样都会增加好多压力。主要压力来于IBL,至于使用phong还是GGX 感觉没有很大区别,看你们美术更喜欢哪个了。移动端用PBR主要就解…
&img src=&/v2-1ce745e4fce5fb_b.jpg& data-rawwidth=&1000& data-rawheight=&419& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&/v2-1ce745e4fce5fb_r.jpg&&&p&在计算机图形学中,BRDF(Bidirectional Reflectance Distribution Function,双向反射分布函数)是真实感图形学中最核心的概念之一,它描述的是物体表面将光能从任何一个入射方向反射到任何一个视点方向的反射特性,即入射光线经过某个表面反射后如何在各个出射方向上分布。BRDF模型是绝大多数图形学算法中用于描述光反射现象的基本模型。&/p&&p&&br&&/p&&p&这篇文章,将专注于总结和提炼《Real-Time Rendering 3rd》(实时渲染图形学第三版)中第七章“Advanced Shading · 高级着色”的内容,并对这章中介绍BRDF的内容进行适当补充和引申,构成全文,成为一个对BRDF进行近乎系统式总结的文章。&/p&&img src=&/v2-f6fc209fbe014c13553b65d_b.jpg& data-rawwidth=&860& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&860& data-original=&/v2-f6fc209fbe014c13553b65d_r.jpg&&&p&
图1 基于BRDF渲染的场景图 (C)Disney 2014.《超能陆战队》&/p&&p&&br&&/p&&p&&br&&/p&&h2&一、导读&/h2&&p&&br&&/p&&p&简而言之,通过阅读这篇总结式文章,你将对BRDF的以下要点有所了解:&/p&&ul&&li&一、BRDF的前置知识 · 数学篇&/li&&ul&&li&球面坐标 Spherical Coordinate&/li&&li&立体角 Solid Angle&/li&&li&投影面积 Foreshortened Area&/li&&/ul&&li&二、BRDF前置知识 · 辐射度量学篇&/li&&ul&&li&辐射度量学基本参数表格&/li&&li&辐射通量/光通量 Radiant Flux&/li&&li&辐射强度/发光强度 Radiant Intensity&/li&&li&辐射率/光亮度 Radiance&/li&&li&辐照度/辉度 Irradiance &/li&&/ul&&li&三、BRDF的定义与理解&/li&&ul&&li&BRDF的定义式&/li&&li&BRDF的非微分形式&/li&&li&BRDF与着色方程&/li&&li&BRDF的可视化表示 &/li&&/ul&&li&四、BRDF的性质&/li&&ul&&li&亥姆霍兹光路可逆性&/li&&li&能量守恒性质&/li&&li&线性特征&/li&&/ul&&li&五、BRDF模型的分类&/li&&ul&&li&BRDF经验模型&/li&&li&数据驱动的BRDF模型&/li&&li&基于物理的BRDF模型&/li&&/ul&&li&六、基于物理的BRDF · 前置知识&/li&&ul&&li&次表面散射 Subsurface Scattering&/li&&li&菲涅尔反射 Fresnel Reflectance&/li&&li&微平面理论 Microfacet Theory&/li&&/ul&&li&七、基于物理的BRDF · 常见模型&/li&&ul&&li&Cook-Torrance BRDF模型&/li&&li&Ward BRDF模型&/li&&/ul&&li&八、BRDF与其引申&/li&&ul&&li&BSSRDF&/li&&li&SBRDF(SVBRDF)&/li&&li&BTDF与BSDF&/li&&/ul&&/ul&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&h2&二 、BRDF前置知识· 数学篇&/h2&&p&&br&&/p&&p&&br&&/p&&p&在正式了解BRDF的概念之前,有必要先了解数学和辐射度量学相关的前置基础知识。&/p&&p&&br&&/p&&h2&2.1 球面坐标 SphericalCoordinate&/h2&&p&由于光线主要是通过方向来表达,通常用球面坐标表达它们比用笛卡尔坐标系更方便。&/p&&p&如图,球面坐标中的向量用三个元素来指定:&/p&&p&&br&&/p&&p&&br&&/p&&img src=&/v2-3a9d90a8c08cb97dd163cf57e03cdb82_b.png& data-rawwidth=&558& data-rawheight=&516& class=&origin_image zh-lightbox-thumb& width=&558& data-original=&/v2-3a9d90a8c08cb97dd163cf57e03cdb82_r.png&&&p&
图2 球面坐标&/p&&p&其中:&/p&&p&&br&&/p&&ul&&li&r表示向量的长度&/li&&li&θ表示向量和Z轴的夹角&/li&&li&Φ表示向量在x-y平面上的投影和x轴的逆时针夹角。&/li&&/ul&&p&&br&&/p&&p&&br&&/p&&h2&2.2 立体角 Solid Angle&/h2&&p&立体角描述了从原点向一个球面区域张成的视野大小,可以看成是弧度的三维扩展。&/p&&p&&br&&/p&&img src=&/v2-bec5d6cf7f8ef_b.jpg& data-rawwidth=&336& data-rawheight=&304& class=&content_image& width=&336&&&p&
图3 立体角&/p&&p&我们知道弧度是度量二维角度的量,等于角度在单位圆上对应的弧长,单位圆的周长是2π,所以整个圆对应的弧度也是2π 。立体角则是度量三维角度的量,用符号Ω表示,单位为立体弧度(也叫球面度,Steradian,简写为sr),等于立体角在单位球上对应的区域的面积(实际上也就是在任意半径的球上的面积除以半径的平方ω= s/r2 ),单位球的表面积是4π ,所以整个球面的立体角也是4π 。&/p&&p&&br&&/p&&img src=&/v2-aa49a4bd7b4_b.jpg& data-rawwidth=&245& data-rawheight=&203& class=&content_image& width=&245&&&p&
图4 立体角&/p&&p&&br&&/p&&p&立体角ω有如下微分形式:&/p&&p&&img src=&/equation?tex=d%5Comega+%3D%5Cfrac%7BdA%7D%7Br%5E%7B2%7D%7D& alt=&d\omega =\frac{dA}{r^{2}}& eeimg=&1&&&/p&&p&其中&i&dA&/i&为面积微元。而面积微元&i&dA&/i&在球面坐标系下可以写成:&/p&&p&&img src=&/equation?tex=dA%3D%28rd%5Ctheta+%29%28rsin%5Ctheta+d%5Cvarphi+%29%3Dr%5E%7B2%7Dsin%5Ctheta+d%5Ctheta+d%5Cvarphi+& alt=&dA=(rd\theta )(rsin\theta d\varphi )=r^{2}sin\theta d\theta d\varphi & eeimg=&1&&&/p&&p&&br&&/p&&p&因此:&/p&&p&&img src=&/equation?tex=d%5Comega+%3D%5Cfrac%7BdA%7D%7Br%5E%7B2%7D%7D%3Dsin%5Ctheta+d%5Ctheta+d%5Cvarphi+& alt=&d\omega =\frac{dA}{r^{2}}=sin\theta d\theta d\varphi & eeimg=&1&&&/p&&p&&br&&/p&&p&&br&&/p&&h2&2.3 投影面积 Foreshortened Area&/h2&&p&投影面积描述了一个物体表面的微小区域在某个视线方向上的可见面积。&/p&&p&对于面积微元A,则沿着与法向夹角为θ方向的A的可见面积为:&/p&&p&&img src=&/equation?tex=Area%3DAcos%5Ctheta+& alt=&Area=Acos\theta & eeimg=&1&&&/p&&p&&br&&/p&&p&&br&&/p&&img src=&/v2-ffacb5b147db_b.jpg& data-rawwidth=&828& data-rawheight=&534& class=&origin_image zh-lightbox-thumb& width=&828& data-original=&/v2-ffacb5b147db_r.jpg&&&p&
图5 投影面积&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&h2&三、BRDF前置知识· 辐射度量学篇&/h2&&p&&br&&/p&&h2&3.1 辐射度量学基本参数表格&/h2&&p&如下是截取的wiki(&a href=&/?target=https%3A//en.wikipedia.org/wiki/Radiometry& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&en.wikipedia.org/wiki/R&/span&&span class=&invisible&&adiometry&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&))上的辐射度量学国际单位制的辐射量参数表格:&/p&&img src=&/v2-cc666acd2eecbdc81d5ceff6cda67917_b.jpg& data-rawwidth=&1232& data-rawheight=&731& class=&origin_image zh-lightbox-thumb& width=&1232& data-original=&/v2-cc666acd2eecbdc81d5ceff6cda67917_r.jpg&&&p&&br&&/p&&p&下面对几个核心的基本量进行分别介绍。&/p&&p&&br&&/p&&p&&br&&/p&&h2&3.2 辐射通量/光通量 Radiant Flux&/h2&&p&辐射通量(Radiant Flux,又译作光通量,辐射功率)描述的是在单位时间穿过截面的光能,或每单位时间的辐射能量,通常用Φ来表示,单位是W,瓦特。&/p&&p&&img src=&/equation?tex=%5CPhi+%3D%5Cfrac%7BdQ%7D%7Bdt%7D& alt=&\Phi =\frac{dQ}{dt}& eeimg=&1&&&/p&&p&其中的Q表示辐射能(Radiant energy),单位是J,焦耳。&/p&&p&&br&&/p&&p&&br&&/p&&h2&3.3 辐射强度/发光强度 Radiant Intensity&/h2&&p&对一个点(比如说点光源)来说,辐射强度表示每单位立体角的辐射通量,用符号I表示,单位 &img src=&/equation?tex=W%5Ccdot+sr%5E%7B-1%7D& alt=&W\cdot sr^{-1}& eeimg=&1&& :&/p&&p&&img src=&/equation?tex=I%3D%5Cfrac%7Bd%5CPhi+%7D%7Bd%5Comega+%7D& alt=&I=\frac{d\Phi }{d\omega }& eeimg=&1&&&/p&&p&概括一下:辐射强度(Radiant intensity,又译作发光强度),表示每单位立体角的辐射通量,通常用符号I表示,单位 &img src=&/equation?tex=W%5Ccdot+sr%5E%7B-1%7D& alt=&W\cdot sr^{-1}& eeimg=&1&& ,瓦特每球面度。&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&h2&3.4 辐射率/光亮度 Radiance&/h2&&p&辐射率(Radiance,又译作光亮度,用符号L表示),表示物体表面沿某一方向的明亮程度,它等于每单位投影面积和单位立体角上的辐射通量,单位是W·sr-1·m-2,瓦特每球面度每平方米。在光学中,光源的辐射率,是描述非点光源时光源单位面积强度的物理量,定义为在指定方向上的单位立体角和垂直此方向的单位面积上的辐射通量。光亮度L也可以理解为发光程度I在表面dA上的积分。&/p&&p&一种直观的辐射率的理解方法是:将辐射率理解为物体表面的微面元所接收的来自于某方向光源的单位面积的光通量,因此截面选用垂直于该方向的截面,其面积按阴影面积技术计算。&/p&&p&&br&&/p&&p&辐射率的微分形式:&/p&&p&&img src=&/equation?tex=L%3D%5Cfrac%7Bd%5E%7B2%7D%5CPhi+%7D%7BdAcos%5Ctheta+d%5Comega+%7D& alt=&L=\frac{d^{2}\Phi }{dAcos\theta d\omega }& eeimg=&1&&&/p&&p&其中:Φ是辐射通量,单位瓦特(W);Ω是立体角,单位球面度(sr)。&/p&&p&另外需要注意的是,辐射率使用物体表面沿目标方向上的投影面积,而不是面积。&/p&&p&&br&&/p&&p&概括一下:辐射率(Radiance,又译作光亮度),表示每单位立体角每单位投影面积的辐射通量,通常用符号L表示,单位是 &img src=&/equation?tex=W%5Ccdot+sr%5E%7B-1%7D%C2%B7m%5E%7B-2%7D& alt=&W\cdot sr^{-1}·m^{-2}& eeimg=&1&& ,瓦特每球面度每平方米。&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&h2&3.5 辐照度/辉度 Irradiance&/h2&&p&辐照度(Irradiance,又译作辉度,辐射照度,用符号E表示),指入射表面的辐射通量,即单位时间内到达单位面积的辐射通量,或到达单位面积的辐射通量,也就是辐射通量对于面积的密度,&/p&&p&用符号E表示,单位 &img src=&/equation?tex=W%2Fm%5E%7B2%7D& alt=&W/m^{2}& eeimg=&1&& ,瓦特每平方米。&/p&&p&辐照度可以写成辐射率(Radiance)在入射光所形成的半球上的积分:&/p&&p&&img src=&/equation?tex=%5Cfrac%7Bd%5CPhi+%7D%7BdA%7D%3DE%3D%5Cint_%7B%5COmega%7D+%5E%7B%7D+L%28%5Comega+%29cos+%5Ctheta+d%5Comega+& alt=&\frac{d\Phi }{dA}=E=\int_{\Omega} ^{} L(\omega )cos \theta d\omega & eeimg=&1&&&/p&&p&其中,Ω是入射光所形成的半球。L(ω)是沿ω方向的光亮度。&/p&&p&&br&&/p&&p&概括一下:辐照度(Irradiance,又译作辉度,辐射照度),表示单位时间内到达单位面积的辐射通量,也就是辐射通量对于面积的密度,通常用符号E表示,单位 &img src=&/equation?tex=W+%2Fm%5E%7B2%7D& alt=&W /m^{2}& eeimg=&1&& ,瓦特每平方米。&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&h2&四、BRDF的定义与理解&/h2&&p&&br&&/p&&p&&br&&/p&&h2&4.1 BRDF的定义式&/h2&&p&可以将给一个表面着色的过程,理解为给定入射的光线数量和方向,计算出指定方向的出射光亮度(radiance)。,在计算机图形学领域,BRDF (Bidirectional Reflectance Distribution Function,译作双向反射分布函数 )是一个用来描述表面如何反射光线的方程。顾名思义,BRDF就是一个描述光如何从给定的两个方向(入射光方向l和出射方向v)在表面进行反射的函数。&/p&&p&BRDF的精确定义是出射辐射率的微分(differential outgoing radiance)和入射辐照度的微分(differential incoming irradiance)之比:&/p&&p&&img src=&/equation?tex=f%28l%2C+v%29+%3D+%5Cfrac%7Bd+L_%7Bo%7D+%28v%29+%7D%7Bd+E%28l%29%7D+& alt=&f(l, v) = \frac{d L_{o} (v) }{d E(l)} & eeimg=&1&&&/p&&p&要理解这个方程的含义,可以想象一个表面被一个来自围绕着角度&b&l&/b&的微立体角的入射光照亮,而这个光照效果由表面的辉度dE来决定。&/p&&p&表面会反射此入射光到很多不同的方向,在给定的任意出射方向v,光亮度dLo与辐照度dE成一个比例。而两者之间的这个取决于l和v的比例,就是BRDF。&/p&&p&&br&&/p&&img src=&/v2-93f33bc09230b59aadc38d40faaa94cf_b.jpg& data-rawwidth=&1330& data-rawheight=&635& class=&origin_image zh-lightbox-thumb& width=&1330& data-original=&/v2-93f33bc09230b59aadc38d40faaa94cf_r.jpg&&&p&
图6 BRDF图示&/p&&p&&br&&/p&&p&一个最常见的疑问是,BRDF为什么要取这样的定义。BRDF为什么被定义为辐射率(radiance)和辐照度(irradiance)之比,而不是radiance和radiance之比,或者irradiance和irradiance之比呢?&/p&&p&&br&&/p&&p&首先,我们分别重温它们的定义:&/p&&ul&&li&辐照度(Irradiance,又译作辉度,辐射照度),表示单位时间内到达单位面积的辐射通量,也就是辐射通量对于面积的密度,通常用符号E表示,单位 &img src=&/equation?tex=W%5Ccdot+m%5E%7B-2%7D& alt=&W\cdot m^{-2}& eeimg=&1&& ,瓦特每平方米。&/li&&li&辐射率(Radiance,又译作光亮度),表示每单位立体角每单位投影面积的辐射通量,通常用符号L表示,单位是 &img src=&/equation?tex=W%5Ccdot+sr%5E%7B-1%7D%C2%B7m%5E%7B-2%7D& alt=&W\cdot sr^{-1}·m^{-2}& eeimg=&1&& ,瓦特每球面度每平方米。&/li&&/ul&&p&那么,关于这个问题,我们可以这样理解:因为照射到入射点的不同方向的光,都可能从指定的反射方向出射,所以当考虑入射时,需要对面积进行积分。而辐照度irradiance正好表示单位时间内到达单位面积的辐射通量。所以BRDF函数,选取入射时的辐照度Irradiance,和出射时的辐射率Radiance,可以简单明了地描述出入射光线经过某个表面反射后如何在各个出射方向上分布。而直观来说,BRDF的值给定了入射方向和出射方向能量的相对量。&/p&&p&&br&&/p&&p&概括一下:BRDF(Bidirectional Reflectance Distribution Function,译作双向反射分布函数 ),定义为出射辐射率的微分(differential outgoing radiance)和入射辐照度的微分(differential incoming irradiance)之比,描述了入射光线经过某个表面反射后如何在各个出射方向上分布,给定了入射方向和出射方向能量的相对量,单位是 &img src=&/equation?tex=sr%5E%7B-1%7D& alt=&sr^{-1}& eeimg=&1&& ,每球面度。&/p&&p&&br&&/p&&p&&br&&/p&&h2&4.2 BRDF的非微分形式&/h2&&p&这里的讨论仅限于非区域光源,如点光源或方向光源。在这种情况下,BRDF定义可以用非微分形式表示: &/p&&p&&img src=&/equation?tex=f%28l%2C+v%29+%3D+%5Cfrac%7BL_%7Bo%7D%28v%29%7D%7B+E%28l%29%5Coverline%7Bcos%7D+%5Ctheta+_i%7D& alt=&f(l, v) = \frac{L_{o}(v)}{ E(l)\overline{cos} \theta _i}& eeimg=&1&&&/p&&p&其中:&/p&&ul&&li&EL是光源在垂直于光的方向向量L平面测量的辐照度(irradiance)。&/li&&li&Lo(v)是在视图矢量v的方向上产生的出射辐射率(radiance)。&/li&&/ul&&p&&br&&/p&&p&&br&&/p&&h2&4.3 BRDF与着色方程&/h2&&p&根据上文所了解了BRDF的定义,现在,就很容易得到BRDF是如何用n个非区域光来拟合一般的着色方程的: &/p&&p&&img src=&/equation?tex=L_o%28v%29+%3D+%5Csum_%7Bk+%3D+1%7D%5E%7Bn%7D%7Bf%28l_k%2C+v%29+%5Cotimes+E_%7BL_k%7D+cos+%5Ctheta_%7Bi_k%7D%7D+& alt=&L_o(v) = \sum_{k = 1}^{n}{f(l_k, v) \otimes E_{L_k} cos \theta_{i_k}} & eeimg=&1&&&/p&&p&其中k是每个光源的索引。使用?符号(分段向量乘法),是因为BRDF和辉度(irradiance)都是RGB向量。考虑到入射和出射方向都拥有两个自由度(通常参数化是使用两个角度:相对于表面法线的仰角θ和关于法线的旋转角度&i&φ&/i&),一般情况下,BRDF是拥有四个标量变量的函数。&/p&&p&另外,各向同性BRDFs(Isotropic BRDFs)是一个重要的特殊情况。这样的BRDF在输入和输入方向围绕表面法线变化(保持相同的相对夹角)时保持不变。所以,各向同性BRDF是关于三个标量的函数。}

我要回帖

更多关于 unity3d修改器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信