转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2774

本系列的上一篇提到了KlayGE 4.4将会出现的高质量地形渲染。本篇仍讲一个新功能,Screen Space Sub Surface Scattering(SSSSS)和Translucency。这两个效果都是由团队成员石裕隆实现的。

Sub Surface Scattering(SSS)对渲染效果的提升有很明显的左右,尤其是皮肤和植被之类物体。早在GPU Gems 1里就有在texture space作的近似SSSGPU Gems 3里的方法更是大张旗鼓地用了多次Gaussian来逼近Dipole,在texture space作6次blur后线性叠加,得到非常真实的皮肤效果。但这么做的开销实在太大了。

首先看看直接用Blinn Phong BRDF渲染的结果,皮肤本身看起来很塑料。

SSSSS

到了GPU Pro里,Jorge Jimenez等人提出了SSSSS的方法。在screen space而不是texture space做blur和叠加,以小得多的开销很好地逼近了原有的效果。顾名思义,SSSSS的好处来自于它是screen space的,所以只需要对全屏做一次,不管有多少物体。这一点比texture space的方法就强得多了。所以这个方法迅速被UE3、CE3等主流引擎使用。

在核心思想上,SSSSS的和原先的texture space方法一样,仍是把shading后的结果多次blur并叠加的方式,来得到SSS的效果。不同的是,每一次blur可以乘上一定的权重,累加到目标texture,而不用把多次blur的结果都保存下来,最终才累加。这样时间和空间都省了。GPU Pro里还进一步把6次blur减少到了4次,每次的权重也相应调整。由于第一次blur的kernel小于1个pixel,并且权重为1,所以第一次blur直接变成了一个copy。真正需要做Gaussian blur的只有3次了。累加的权重随着物体的不同有所不同,GPU Pro里列出了皮肤和大理石两种物体的权重取值。另外,由于是screen space,在blur的时候需要根据depth信息忽略一些pixel,否则会全部糊在一起。

最终SSSSS可以整理成一系列post process,并可以用stencil把需要处理的pixel标记出来,以减少浪费。这些都是比较平常的图像操作而已。有个特别之处在于他们的alpha workflow,那里用了两种平常很少用到的alpha blending操作手法。这里详细描述一下。

流程图

这里的流程如图所示。Gaussian blur被分解成x和y两个方向的两次操作。原texture经过x方向的blur后,进入RT2。RT2进一步经过y方向的blur,同时输出到2张texture。第一个就是平常的写入RT1。第二个需要做blending到RTF,而这个blend的系数不是来自于PS输出的alpha,而是RGB三个通道分别指定一个常数。

Independent blending

MRT如果开启了alpha blending,那么默认情况下会让所有的RT都用同样的方式。在DX10+以上的GPU上,支持independent blending,可以给不同的RT不同的alpha blending方式。在这里,RT0是关闭alpha blending的,RT1打开alpha blending,但blend op等其他参数都一样。

Blend factor

最常用的alpha blending是SrcRGB * SrcAlpha + DstRGB * (1 – SrcAlpha)这样的方式。而这里需要的是RGB分别用不同的系数(但全屏都用那组系数),来模拟不同频率的光有不同的穿透力。所以这里SrcBlend需要设置为BLEND_FACTOR,DestBlend设置为INV_BLEND_FACTOR。并且在设置alpha blending状态的时候提供一个float4的factor,分别代表RGBA的系数。

最终我们可以得到一个更有皮肤质感的结果。输入仅仅是shading的结果,以及一个调节皮肤细嫩程度的系数。

Translucency

即便加上了SSSSS,皮肤可以逼真很多。但对于薄的地方,比如耳朵,除了SSS的贡献,还有很大一部分其实来自于光线的透射,也就是translucency的贡献。只有SSSSS也无法表达出耳朵的透光,需要另一个方法来做这件事情。幸运的是,Jorge Jimenez也开发出了这样的方法,并且也可以整理成一个screen space的post process。更有意思的是,translucency的结果只要直接叠加到原先shading上就可以了。可以单独使用,也可以和前面的SSSSS联合使用。

这个screen space translucency的输入是normal、diffuse、shading和shadow map,都是deferred rendering里现成的东西。所以可以很容易集成到现有pipeline。

本篇讲了新的SSS的方法,下一篇是本系列的终结篇,将OpenGL和OpenGLES方面的改进。

KlayGE 4.4中渲染的改进(四):SSSSS的更多相关文章

  1. KlayGE 4.4中渲染的改进(一):只需要SM3的TBDR

    转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2736 KlayGE从4.0开始引入deferred rendering层(DR),并且这几个 ...

  2. KlayGE 4.4中渲染的改进(三):高质量无限地形

    转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2761   本系列的上一篇讲了DR中的一些改进.本篇开始将描述这个版本加入的新功能,高质量地形 ...

  3. KlayGE 4.4中渲染的改进(五):OpenGL 4.4和OpenGLES 3

    转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2796 上一篇我们提到了SSSSS,作为本系列的最后一篇,本文将介绍KlayGE 4.4的Op ...

  4. KlayGE 4.4中渲染的改进(二):DR的其他改进

    转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2749   上一篇讲了TBDR的实现,本篇继续讲解deferred rendering层的一些 ...

  5. 在Unity中渲染一个黑洞

    在Unity中渲染一个黑洞 前言 N年前观看<星际穿越>时,被其中的"卡冈图雅"黑洞所震撼.制作团队表示这是一个最贴近实际的黑洞效果,因为它是通过各种科学理论实现的.当 ...

  6. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  7. ASP.NET Core 中文文档 第四章 MVC(4.6)Areas(区域)

    原文:Areas 作者:Dhananjay Kumar 和 Rick Anderson 翻译:耿晓亮(Blue) 校对:许登洋(Seay) Areas 是 ASP.NET MVC 用来将相关功能组织成 ...

  8. ASP.NET Core 中文文档 第四章 MVC(3.7 )局部视图(partial)

    原文:Partial Views 作者:Steve Smith 翻译:张海龙(jiechen).刘怡(AlexLEWIS) 校对:许登洋(Seay).何镇汐.魏美娟(初见) ASP.NET Core ...

  9. ASP.NET Core 中文文档 第四章 MVC(3.3)布局视图

    原文:Layout 作者:Steve Smith 翻译:娄宇(Lyrics) 校对:孟帅洋(书缘) 视图(View)经常共享视觉元素和编程元素.在本篇文章中,你将学习如何在你的 ASP.NET 应用程 ...

随机推荐

  1. [原] XAF 如何启用ListView Top N records 提升用户使用体验

    為了提升用戶使用體驗,特擴展此功能(來源與Xafari Framework).1.可在模型編輯器中設置是否啓用,默認啓用.2.DataAccessMode為Client模式才啓用.其它模式自動關閉.3 ...

  2. CAS 4.0.0RC编译环境

    CAS 4.0.0RC编译环境 Eclipse Java EE IDE for Web Developers. JDK1.7,注意用JDK1.8是会出现编译错误的. Maven 在编译出现test错误 ...

  3. 2016,Raym

    Hello,2016: 这是承上启下的一年! Raym

  4. Django如何搭建服务器

    建立django站点: 新建Django项目,我这里是使用命令创建项目的. django-admin startproject HelloDjango  创建HelloDjango项目 然后进入到He ...

  5. Java Spring AOP用法

    Java Spring AOP用法 Spring AOP Java web 环境搭建 Java web 项目搭建 Java Spring IOC用法 spring提供了两个核心功能,一个是IoC(控制 ...

  6. ILspy反编译工具

    简介 ILspy是一个开源的.net反编译软件,使用十分方便. 开发原因 之所以开发ILspy是因为Red Gate宣布免费版的.NET Reflector(同样是反编译软件)将会在2011年2月停止 ...

  7. 一个App完成入门篇(五)- 完成新闻页面

    本节教程将介绍如何用DeviceOne简单而高效的完成一个新闻页面. 导入项目 数据模板分离MVVM模型 自定义事件 展示新闻 九宫格展示 将要学习的demo效果图如下所示 1. 导入完整项目 本节示 ...

  8. VS开发中的代码编写小技巧——避免重复代码编写的几种方法

    上一篇文章中程序员的幸福生活--有你的日子,每天都是情人节,收到了大家的很多好评.鼓励和祝福,非常感动,真诚的谢谢大家.也希望每个朋友都能保持一个积极向上的心态,去迎接丰富多彩的人生. 在开发过程中, ...

  9. Atom

    http://blog.csdn.net/crper/article/details/45647459

  10. make file教程(转)

    最近在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是google到了以下这篇文章.通俗易懂.然后把它贴出 ...