Specular Aliasing与Specular Leaking

上面两个问题是最近做高质量实时HDR PBR渲染中面临的最主要问题。若干思考如下:

问题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缺失而导致漏光这个问题只会更加严重。实际上这个问题与Specular Aliasing是源自不同的缘故,但其二者呈现出来的异常现状却是类似的,那就是异常的反射高光。

先说第一个问题,从已有手段来看,基于屏幕空间的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了,但还是能够带来部分的改善,尤其是跟其他屏幕空间AA技术结合使用的情况下,细节与高光走样改善极佳,唯一缺陷就是对性能的负面影响太大。最后,还有一个因素,就是模型精度问题,良好的模型预处理(如法线计算、顶点拆分/合并、tangent/bi-tangent计算等)是解决高光走样的基础前提,这个基础前提达不到,后面的AA、贴图filter等效果一概不会达到良好的效果。

然后再说第二个问题,针对occlusion信息缺失所导致的漏光,在实时+准GI的游戏等场合下,目前业界真正提出的简单办法并不多,基本上只有基于AO信息的specular occlusion比较实用,尽管这种直接利用ambient occlusion因子来推导得出高光遮蔽因子的方式并不科学,本质上只是个hack,而且其效果不仅取决于AO质量、同时也取决于模型质量(因为模型精度能在一定程度上决定AO质量),但简单易行,性能代价也极低,聊胜于无,如果采用tri-Ace那种以视觉效果为导向的光照分量合成hack,用下来也能够起到不错的改善效果。另外还有一类方法,就是基于SH/H3等球谐基的baking方法,比如1886,在baking阶段把visility信息用ray tracing求取出来然后存入顶点或贴图,用于在运行时进行occlusion query,这种高级手段当然效果是最好、最精确的,但工作代价也是最大的,需要工作流的全面配套梳理;最后,还有一类方法,就是基于sphere set approximation等proxy的occlusion近似计算方式,比如last of us,这种方法在相对低动态范围的画面环境下,能够得到不错的遮蔽效果。

综上,上述两个问题,都是目前实时渲染领域monste级别的高阶问题,暂时都还没有一劳永逸的golden standard,只能应地制宜,根据情况灵活调整,本质上还是取决于经验。以上描述,是为一阶段性小结。

时间: 2024-10-01 05:12:59

Specular Aliasing与Specular Leaking的相关文章

VR是TAA的终结者吗?

在刚刚发布的Unreal Engine 4.14中,其第一个重要的特性就是增加了在VR开发中对Forward Shading的支持.我们都知道在很多方面Deferred Shading都优于Forward Shading,它也是时下主流游戏引擎使用的渲染架构,而仅有在移动等设备中由于缺乏MRT的支持时才不得不选择Forward Shading,那么为什么Unreal Engine 4会在VR开发中选择使用Forward Shading? “The forward renderer support

走进VR游戏开发的世界

注: 原文2016年2月发表于公司内部社区, 最近才由同事转载出来, 删去了文中引用的一些内部文章和视频. 在这里我也只是把外网版本转过来, 留做备份. 背景介绍 我们组在2014年下半年尝试开发了一款 XboxOne 平台的体感游戏, 2015年上半年进行收尾工作的同时, 结合之前积累的体感交互经验, 开始进行 VR 游戏的预研工作. 在这近一年的时间里, 一方面从外界感受到了一股虚拟现实快速发展的潮流, 另一方面也体会到身边很多人对 VR 游戏的了解非常有限. 现在我们自己的VR游戏Demo

[sig14&gdc14]crytek的《罗马之子》的渲染技术

crytek关于son of rome在gdc和siggraph都做了presentation,两者有些地方一样的,干脆一勺烩了吧: http://advances.realtimerendering.com/s2014/crytek/Sigg14_Schulz_Mader_Ryse_Rendering_Techniques.pptx http://www.crytek.com/download/2014_03_25_CRYENGINE_GDC_Schultz.pdf 看到一直推动行业水准前进的

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

UE4目前版本(4.15)在PS平台上并不支持MSAA,在未来的版本会加入.也就是说目前没有办法在PS平台上使用Forward Rendering + MSAA的组合 FXAA效率最高,但效果最差,只做了最后的图像边缘锐化 MSAA的优点是物体边缘和贴图分开处理,边缘会比较清晰.缺点是开销会比TAA稍大(即使有硬件支持),另外会有Specular aliasing.在使用MSAA时,可以在材质中打开normal to roughness,这样会使normal上突出的部分更加粗糙,减少高光闪烁.

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

西川善司的[WITCH CHAPTER 0  cry]讲座 ~绝密开发中的史克威尔艾尼克斯的DX12技术演示全貌 注:日文原文地址: http://pc.watch.impress.co.jp/docs/topic/feature/20150529_704317.html 视频引用自youtube 今年4月末,微软的开发者大会[Build 2015]在美国的旧金山举行,在这次大会的主题演讲中,[DirectX 12世代实现的次世代图实时游戏图形,[WITCH CHAPTER 0 cry](后面简

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

继上一篇:次世代基于物理渲染的反射模型,本篇是Tri-Ace 在cedec2014上最近发布的, 主要内容如名称所示,解释了他们在实现基于物理渲染时,对shader的渲染公式所做的近似工作. 因为本身就是会议上的PPT,还是必须配合演讲看效果才好,所以如果有错误或不理解的地方,还希望留言或联系我 另外3A在官网上说会提供英文版,那家公司或个人希望可以分享下吧. 大致做下简介,如果有兴趣的可以下载看看 在本篇ppt中,3A先是花了一些篇幅介绍了渲染公式积分所引发的问题,随后是介绍本文中主要运用的正

LearnOpenGL

---------------------------------------------- LearnOpenGL ---------------------------------------------- OpenGL基础知识: https://www.opengl.org/:OpenGL官方网站. https://www.opengl.org/registry/:包含OpenGL各版本的规范和扩展. https://learnopengl-cn.github.io https://khr

OpenGL 阴影之Shadow Mapping和Shadow Volumes

先说下开发环境.VS2013,C++空项目,引用glut,glew.glut包含基本窗口操作,免去我们自己新建win32窗口一些操作.glew使我们能使用最新opengl的API,因winodw本身只包含opengl 1.1版本的API,根本是不能用的. 其中矩阵计算采用gitHub项目openvr中的三份文件, Vectors.h ,Matrices.h, Matrices.cpp,分别是矢量与点类,矩阵类,我们需要的一些操作,矢量的叉乘和点乘,矩阵转置,矩阵的逆,矩阵与矢量相剩等. 这里主要

GLSL下几个简单的Shader

在ShaderDesigner下编Shader是最为方便的,但这里先用OpenGL下的编程来举例 转载请注明http://blog.csdn.net/boksic 如有疑问欢迎留言 这几个Shader的实际效果: 1.最简单的固定单色Shader Vertex Shader 坐标经过投影矩阵变换:vTrans = projection * modelview * incomingVertex void main() { gl_Position = gl_ProjectionMatrix * gl