最近做高质量实时HDR PBR渲染中碰到了2个关键问题,若干思考如下:

问题1: 极高的动态范围HDR+高级BRDF+相对较低的采样率(比方说不考虑子像素的原始分辨率),在这3项因素的综合作用下,Specular Aliasing基本上不可避免。这已经不是存不存在Specular Aliasing的问题,而是如何去面对、何时面对的问题。模型精度越高、工作流越倾向于全PBR方式、光照计算精确程度越高,则反射高光走样越明显。

问题2: 另外还有个麻烦,就是在不引入前期baking机制的前提下使用IBL,会不可避免地导致occlusion信息缺失,从而产生异样的反射高光。occlusion是个挺麻烦的topic,无论是用SH+PRT、还是用Soft Shadows+AO,总是会产生这样那样的问题;曾一度尝试采用ScreenSpace Ray Marching的方式来动态生成occlusion,但感觉上这种做法产生的visibility是低质量的,且带来的性能损耗也不小。而且,在HDR+高级BRDF的环境使得因visibility缺失而导致漏光这个问题更加雪上加霜。

上面这2个问题呈现出来的异常现状是类似的,那就是异常的反射高光,但它们却是由于不同的原因所导致的,因此,在改善上述问题之前,首先必须对其进行合理的区分,后继改善方具备针对性。

先说第一个问题,从已有手段来看,基于屏幕空间的AA是实践中克服Specular Aliasing的最主要手段之一。Toksvig、LEAN、CLEAN等关注于优化Normalmap mipmap filter的做法并不是首选,因为它们不仅要大规模修改法线贴图资源,而且其理论依据中适用的BRDF也只是Blinn-phong这种大路货,效果不显著不说,而且还缺乏后期人为调整的灵活性,本质上来说,属于前期手段而非后期手段,调节手段与最终效果之间拉得太长,所以最终效果要是出了问题就会很麻烦,因此直接弃用。而使用FXAA、MLAA、TXAA等AA技术来解决这个问题的好处则在于,其把所有specular aliasing的问题集中在一个后处理环节上加以彻底解决,而且解决的程度(模糊一点?锐利一点?是否需要留一点aliasing以体现细节?等等)还可以灵活控制,这是基于贴图的反高光走样技术做不到的。AA有自己独到的优势,其工作在LDR空间,而不是HDR空间,本身就是基于人眼感知能力所进行的直接优化,因此不仅灵活,而且简单粗暴、直接有效。另外值得一提的还有超采样AA,作为一个简单的box filtering,实践证明,如果其运行在linear空间下,是不足以压制HDR PBR环境下的反射高光走样的,因为HDR+PBR BRDF导致的像素照度差异实在是太BT了,但还是能够带来部分的改善,尤其是跟其他基于LDR 的屏幕空间AA技术结合使用的情况下,细节与高光走样改善极佳,唯一缺陷就是对性能的负面影响太大。此外,还有一个因素,就是模型精度问题,良好的模型预处理(如法线计算、顶点拆分/合并、tangent/bi-tangent计算等)是解决高光走样的基础前提,因为法线是反射高光的决定性因素之一,这个基础前提达不到,后面的AA、贴图filter等效果均不会达到良好的效果。最后,提一提物理正确的问题,保持物理正确是一种情结,但是,Specular Aliasing这一问题其实本质上源于采样不足,而HDR+PBR光照计算以极其夸张的方式使得这一问题变得更加恶化,直至效果无法让人接受,所以,在采样数量达不到与HDR反射高光(高频detail)相匹配的惊人程度时(甚至HDR SSAAx8/x16都不够,在实时计算环境下无限制拔高采样率在性能方面几乎是无法接受的),Specular Aliasing在物理正确的光照计算框架范围内是无法解决的,因此,我们只能by all means,包括像AA这种非物理正确的后处理方式,实践证明这是有效的,所以此处实际上是有选择的暂时扬弃了“物理正确”原则,以获得有效的处理效果,但我想强调的是,这是合符情理的。

然后再说第二个问题,针对occlusion信息缺失所导致的漏光,在实时+准GI场合(如游戏等)下,目前业界真正提出来的简单、有效的办法并不多,基本上只有基于AO信息的specular occlusion比较实用,尽管这种直接利用ambient occlusion因子来推导得出高光遮蔽因子so的方式并不物理正确,本质上只是个hack,且其效果不仅取决于AO质量、同时也取决于模型质量(因为模型质量能在一定程度上决定AO质量),但简单易行,性能代价也极低,聊胜于无,如果采用tri-Ace那种以视觉效果为导向的光照分量合成hack,用下来也能起到不错的改善效果。除此之外,还有一类方法,就是基于SH/H3等球谐基的baking方法,比如1886,在baking阶段把visibility因子用QMC方式求取出来然后存入顶点或贴图,用于在运行时进行动态occlusion query,这种高大上的预处理手段当然效果是最好、最精确的,但工作代价也是最大的,需要工作流的全面配套梳理;最后,还有一类方法,就是基于sphere set approximation等proxy的occlusion近似计算方法,比如last of us,这种方法在相对低动态范围的画面环境下,也能够得到不错的阴影遮蔽效果。此外,还有一些宣称用Visibility预计算(其实是form factor,呵呵)+烘焙相结合能搞得定的系统级方案,如enlighten等radiosity system,那已经是属于准baking的重量级方案了。总体而言,考虑到Specular Leaking的实质问题在于为提升实时渲染效率而引入的遮蔽与光照分离,在存在预计算手段或者是不那么计较计算代价的前提下,其是有可能以近似物理正确的方式加以解决的,这个是其与Specular Aliasing的一个关键差异。

综上,一通思考下来,上述两个问题,其实都是目前物理真实向实时渲染管线的系统性问题,暂时都还没有一劳永逸的golden standard,只能应地制宜,根据情况灵活调整,本质上还是取决于经验与权衡。实际上,从经验来看,严格来讲,高光走样与漏光几乎涉及到pipeline的几乎每一个环节的细节,从贴图-模型处理、到AO/SO质量、到HDR pipleine平衡性、到PostFX、再到AA质量,每一个环节均需小心应对最终方可有效减轻。此篇blog,是为一阶段性小结。

Specular Aliasing与Specular Leaking的更多相关文章

  1. VR是TAA的终结者吗?

    在刚刚发布的Unreal Engine 4.14中,其第一个重要的特性就是增加了在VR开发中对Forward Shading的支持.我们都知道在很多方面Deferred Shading都优于Forwa ...

  2. WITCH CHAPTER 0 [cry] 绝密开发中的史克威尔艾尼克斯的DX12技术演示全貌

    西川善司的[WITCH CHAPTER 0  cry]讲座 ~绝密开发中的史克威尔艾尼克斯的DX12技术演示全貌   注:日文原文地址: http://pc.watch.impress.co.jp/d ...

  3. VR制作的规格分析

    因为UE4的演示资源更丰富一些,我这边把UE4的有代表性的演示都跑了一遍,同时也通过Rift确认效果,和里面的资源制作方式.   首先,UE4是基于物理渲染的引擎,大部分都是偏向图像真实的.使用的材质 ...

  4. 翻译 Tri-Ace:在Shader里近似渲染公式

    继上一篇:次世代基于物理渲染的反射模型,本篇是Tri-Ace 在cedec2014上最近发布的, 主要内容如名称所示,解释了他们在实现基于物理渲染时,对shader的渲染公式所做的近似工作.     ...

  5. LearnOpenGL

    ---------------------------------------------- LearnOpenGL ----------------------------------------- ...

  6. 走进VR游戏开发的世界

    http://geek.csdn.net/news/detail/76504 我们组在2014年下半年尝试开发了一款Xbox One平台的体感游戏,2015年上半年进行收尾工作的同时,结合之前积累的体 ...

  7. UE4在PSVR中的抗锯齿和优化相关知识

    UE4目前版本(4.15)在PS平台上并不支持MSAA,在未来的版本会加入.也就是说目前没有办法在PS平台上使用Forward Rendering + MSAA的组合 FXAA效率最高,但效果最差,只 ...

  8. Unity Shaders 第一个默认程序分析

    Unity Shaders 第一个默认程序 Shader "Custom/Shader" { Properties { _MainTex ("Base (RGB)&quo ...

  9. 初次学习shader

    Shader "Custom/Diffuse Texture" { //在shader中的位置 Properties { //着色器的属性 _MainTex ("Base ...

随机推荐

  1. Oracle常用存储过程写法

    写在前面 这段时间工作最长接触到的就是Oracle数据库,不论查数据,还是统计.运行job,都离不开PL/SQL 存储过程,下面就整理下经常用到的知识. 一.Function函数 函数是执行非查询语句 ...

  2. ios中LeveyPopListView 弹出view的用法

    下载地址https://github.com/levey/LeveyPopListView 是arc,  如果是非arc项目要设置一下 方法 选中工程->TARGETS->相应的targe ...

  3. Hopfield神经网络和TSP问题

    一.TSP问题 旅行商问题,又叫货郎担问题.它是指如下问题:在完全图中寻找一条最短的哈密尔顿回路. 哈密尔顿回路问题:给定一个图,判断图中是否存在哈密尔顿回路. 哈密尔顿回路:寻找一条回路,经过图中所 ...

  4. java struts2入门学习实例--使用struts2快速实现上传

    一.文件上传快速入门 1).关于上传表单三要素 >>尽量以POST请求方式上传,因为GET支持文件大小是有限制的. >>必须要加上enctype="multipart ...

  5. 在 iOS 中实现方法链调用

    编译:伯乐在线 - 林欣达 如有好文章投稿,请点击 → 这里了解详情 如需转载,发送「转载」二字查看说明 前言 链式调用(chained calls)是指在函数调用返回了一个对象的时候,使得这个调用链 ...

  6. 【C++】atoi与stoi

    stoi函数默认要求输入的参数字符串是符合int范围的[-2147483648, 2147483647],否则会runtime error.atoi函数则不做范围检查,若超过int范围,则显示-214 ...

  7. Nginx+FastCGI运行原理(一)

    1 实战Nginx与PHP(FastCGI)的安装.配置与优化 1.1 什么是 FastCGI FastCGI是一个可伸缩地.高速地在HTTP server和动态脚本语言间通信的接口.多数流行的HTT ...

  8. Python 文件 tell() 方法

    描述 Python 文件 tell() 方法返回文件的当前位置,即文件指针当前位置. 语法 tell() 方法语法如下: fileObject.tell() 参数 无 返回值 返回文件的当前位置. 实 ...

  9. FreeSWITCH快速录音

    一.背景 测试人员反映FreeSWITCH录音不及时,需要大约5秒的时间才能捕获到RTP流. 二.原因及解决 查了下资料,FreeSWITCH默认的录音参数配置是开启缓冲的, 即RTP流大小到达655 ...

  10. Java – How to convert String to Char Array

    Java – How to convert String to Char ArrayIn Java, you can use String.toCharArray() to convert a Str ...