转载请注明出处为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. Linq-分组统计

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  2. iOS开发之AppIcon及LaunchScreen设置

    一.AppIcon设置 具体设置步骤如下图: 二.LaunchScreen设置与停留时间设置 具体设置步骤如下图: 通过程序可以增加背景的停留时间:

  3. iOS开发零基础--Swift篇 元组

    元组的介绍 元组是Swift中特有的,OC中并没有相关类型 它是什么呢? 它是一种数据结构,在数学中应用广泛 类似于数组或者字典 可以用于定义一组数据 组成元组类型的数据可以称为“元素” 元组的定义 ...

  4. 企业搜索引擎开发之连接器connector(二十九)

    在哪里调用监控器管理对象snapshotRepositoryMonitorManager的start方法及stop方法,然后又在哪里调用CheckpointAndChangeQueue对象的resum ...

  5. DedeCMS织梦系统head.htm里无法调用栏目描述

    {dede:channel type='top'} [field:description/] {/dede:channel} channel 这个标签没有description属性你需要自己把这个属性 ...

  6. iOS 标题内容待定

    UITableView: UITableViewCell的声明文件.所包含的: UIView控件(contentView,作为其它元素的父控件) -- 容器 两个UILabel控件( textLabe ...

  7. MYSQL删除表的记录后如何使ID从1开始

    MYSQL删除表的记录后如何使ID从1开始 MYSQL删除表的记录后如何使ID从1开始 http://hi.baidu.com/289766516/blog/item/a3f85500556e2c09 ...

  8. FUND

    The Shaanxi Natural Science Plan Project of China Grant NO.: 2014JM8322

  9. Tableau:数据可视化之急速BI

    1.我们通过数据可视化,是为了从数据中寻找什么呢?三个方面:模式.关系和异常.不管图形表现的是什么,我们都要留心观察这三者.

  10. 如何在ASP.NET 5上搭建基于TypeScript的Angular2项目

    一.前言 就在上月,公司的一个同事建议当前的前端全面改用AngularJs进行开发,而我们采用的就是ASP.NET 5项目,原本我的计划是采用TypeScript直接进行Angular2开发.所以借用 ...