SRBF的全称是Spherical
Radial Basis Function,笔者擅自翻译为球面放射基底函数。由于SRBF并不怎么出名,相对来说,SH(Spherical
Harmonic)球谐函数更为出名(出现的也更早)。并且网上关于SRBF的资料也非常少。这里写关于SRBF的文章,主要是针对对SRBF有兴趣的同学。一起探讨一下SRBF在渲染上的应用。

在网上找到的唯一比較详尽的资料是在这个网页上(http://www.cse.cuhk.edu.hk/~ttwong/papers/srbf/srbf.html)。里面能够下到一个PPT,关于SRBF的理论在这个PPT里写的比較明确。比較遗憾的是Demo代码原来是能够下载的,(网页上面写着2007年5月是开放下载的)可是如今已经下载不了。

由于SRBF和SH的理念非常相似,看过SH后,笔者琢磨着模仿SH的实现。SRBF的实现应该也能够写的出来,事实确实如此。SRBF里除了基函数那部分,其它的都能够借用SH的源码。

所以说学过SH再去看SRBF应该会比較easy理解。

推荐一篇CSDN上介绍SH的质量比較好的中文文章:http://blog.csdn.net/BugRunner/article/details/6994379。英文的推荐这篇:Spherical
Harmonic Lighting: The Gritty Details.另外SH的源码网上也有不少能够下载。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1b19wZW5nX3poYW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" style="width:356px; height:151px">

这篇文章会浅浅的介绍一下SRBF的理论,探讨下实现细节,还会把个人实现的代码发布一下。希望会对读者有帮助。

SRBF和SH都属于PRT(Precompute Radiance Transfer)的手法。和SH类似。SRBF光照处理步骤例如以下所述:

    连续的光照方程 -> 离散的光照方程 -> 分解后的光照方程 -> 投影到SRBF变换得到SRBF系数 -> 利用SRBF系数还原光照方程

这里把The Gritty Details 中介绍SH概念的图拿出来说明SRBF的处理过程,实质上两者在处理流程方面是一样的。

流程整体上说分两步,即预处理和绘制。

1) 预处理:连续的光照方程离散採样投影到SRBF。得到SRBF系数。

这一步是在预处理时进行的,Ri是第i个SRBF函数,E(L)是一个环境光的採样。L是採样方向。

考虑一下经常使用的skybox。能够把它理解为一个环境光照方程,由代表採样方向的变量L,能够得到一个颜色值(即一个像素)。

则上面公式能够理解为,系数Ci是全部环境光的採样值和Ri的乘积的累加。

环境光的採样数量能够自己定义。一般採取几百上千个,个人取4096个。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1b19wZW5nX3poYW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" style="width:229px; height:176px">

上图是天空盒环境光投影在两个SRBF上的示意图。

Ri即是SRBF基函数,能够採用一个中心对称的频率函数。文献里列举了Gaussian和Poisson两种,个人比較熟悉Gaussian函数,以下即是用Gaussian函数实现SRBF时的定义:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1b19wZW5nX3poYW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" style="width:315px; height:129px">

L为之前介绍的环境光照的採样方向。qi是SRBF的中心朝向(Center)。希腊字母delta(三角∆)是SRBF的范围(coverage)。Exp是以自然对数e为底指数函数。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1b19wZW5nX3poYW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" style="width:131px; height:81px">

參数delta(三角∆)的意义--控制单个SRBF影响区间。

全部的SRBF都有着同样的形状,不同的是朝向(Center)

怎样理解SRBF--SRBF就像一个势力分布,在球面上每一个点都受到某个SRBF或轻或重的影响。越靠近SRBF中心的点受影响最重(由于L和qi的夹角最小)。

2)绘制:利用SRBF系数还原光照方程

在预处理时,一般针对每一个顶点(Vertex)计算环境光照,得到了n个系数,实时绘制时。即把系数取出,再次与基函数相乘。得到的是近似的环境光照函数。

相对SH。SRBF有下面优势:

  • 数学上的表达更简单
  • 更easy旋转
  • 可用于全频率光照(SH趋于低频率)
  • 处理局部光照时更为有效
  • 环境光投影更为高速(能够仅仅需非常少量的採样点)

理论就讨论到此为止,实际编写代码(C++)时,须要做下面工作

  1. 实现一个类提供天空盒採样的函数
  2. 把天空盒投影为SRBF形式(一个SRBF数组代表简化了的环境光照)
  3. 把网格上每一个顶点的几何信息投影为SRBF形式

    除了光照影响外。网格自我遮挡信息也能够存在SRBF系数中,渲染时就可以实现软阴影。笔者编写网格自我遮挡的处理时全然抄袭了SH的代码。

    (这里笔者自身有个疑问,SH的Diffuse光照处理实现时是取法线和光照方向的点积。可是SRBF的话本身就有方向值存在,在还原环境光照步骤时,能够直接拿来和法线做点积。那把是否不须要预处理法线和光照方向的点积也能够?假设能够的话,即能降低非常多预处理时间。)
  4. 以上都在预处理时进行,实际渲染时。把顶点的SRBF再次投影到环境光的SRBF上(这里有些难以理解,个人也没理解透彻。只是代码上是这么实现的,代码中顶点的SRBF存了网格的自我遮挡信息。须要和天空盒光照强度交互才干得到最后收到的光照值)

最后使用20个SRBF绘制得到的效果图(此Demo公开代码)

另外SRBF也能够被用作为一个非常好的光滑採样的技术,所以SRBF也能够用于环境光下头发的绘制。这里是笔者实现的绘制效果。

笔者SRBF软阴影网格绘制的代码能够在下面地址下载,欢迎阅读和交流。

http://dl.vmall.com/c0axu6r8ag

版权声明:本文博主原创文章,博客,未经同意不得转载。

SRBF Lighting的更多相关文章

  1. Vuforia结合Skyshop: Image-Based Lighting Tools & Shaders插件实现真实的光照效果

    Skyshop: Image-Based Lighting Tools & Shaders 插件地址:https://www.assetstore.unity3d.com/en/#!/cont ...

  2. 球谐光照(Spherical Harmonics Lighting)及其应用-实验篇

    简介 之前在一篇实时深度图优化的论文中看到球谐光照(Spherical Harmonics Lighting)的应用,在查阅了许许多多资料之后还是无法完全理解,我个人觉得如果之前对实时渲染技术不是很了 ...

  3. Direct3D学习笔记 - 浅析HDR Lighting Sample

    一.HDR简介 HDR(High Dynamic Range,高动态范围)是一种图像后处理技术,是一种表达超过了显示器所能表现的亮度范围的图像映射技术.高动态范围技术能够很好地再现现实生活中丰富的亮度 ...

  4. Unity Shader——Writing Surface Shaders(2)——Custom Lighting models in Surface Shaders

    Surface Shader中的自定义光照模型 当你在编写 Surface Shaders 时,是在描述一个表面的属性(反射颜色.法线……),而且光的交互过程是由一个光照模型来计算的.内建的光照模型有 ...

  5. 【Unity】13.2 通过Lighting Window设置相关参数

    分类:Unity.C#.VS2015 创建日期:2016-05-19 一.简介 Unity 5.3.4的Lighting Window有3个选项卡:Object.Scene.Lightmaps. 二. ...

  6. Nvidia Anisotropic Lighting

    http://http.download.nvidia.com/developer/SDK/Individual_Samples/DEMOS/Direct3D9/HLSL_Aniso.zip Anis ...

  7. [ZZ] 基于DirectX shader的Per-pixel lighting实现

    这个特效需要用到DX11 UAV吗? http://blog.tianya.cn/blogger/post_show.asp?BlogID=510979&PostID=5665974 Intr ...

  8. MATLAB light material lighting

    clf;[X,Y,Z]=sphere(40);colormap(jet)subplot(1,2,1),surf(X,Y,Z),axis off square,shading interplight(' ...

  9. 【线性结构上的动态规划】UVa 11400 - Lighting System Design

    Problem F Lighting System Design Input: Standard Input Output: Standard Output You are given the tas ...

随机推荐

  1. URAL 1081 Binary Lexicographic Sequence

    第13个位置第5个Bit :13>num[4] =>1 第四个bit 13-num[4]=5 :5<num[3] =>0 ,3-1 第三个Bit 5>num[2](3) ...

  2. Python 3 学习笔记

    教程地址: http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143161198 ...

  3. Java学习之equals和hashcode的关系

    两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 答:不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(has ...

  4. php基础知识(每天分享一些以前的笔记希望能帮助自学的朋友)

    php基础(第一天) php标签 1.  要知道php是一种嵌入html文档的脚本语言:php语法格式是:<?php 想要写的内容 ?>红色体就是php的标签,注意这些标签都要在英式输入法 ...

  5. 【转】VPN服务器配置详解

    参考博文: VPN服务器配置详解   等公司上服务器开始配置 vpn

  6. tomcat远程debug端口开启

    declare -x CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt ...

  7. cocos2dx ResolutionPolicy

    FrameSize 参数,在游戏运行时,我们可以通过 CCEGLView::sharedOpenGLView()->getFrameSize();如果在手机上运行,那么不同分辨率将会得到不同的值 ...

  8. TCP/IP笔记 三.运输层(4)——TCP链接管理与TCP状态机

    1. 建立连接 三次握手 (1)A 的 TCP 向 B 发出连接请求报文段,其首部中的同步比特 SYN 应置为 1,并选择序号 x,表明传送数据时的第一个数据字节的序号是 x. (2)B 的 TCP ...

  9. Azure 网站的新增功能:可配置的环境变量

     编辑人员注释:本文章由 WindowsAzure 网站团队的项目经理Erez Benari撰写. Azure最常用的强大功能之一是 XML文档转换 (XDT),通过此功能,您可以在Windows ...

  10. Windows Azure 社区新闻综述(#74 版)

    欢迎查看最新版本的每周综述,其中包含有关云计算和 Windows Azure 的社区推动新闻.内容和对话.以下是本周的亮点. 文章.视频和博客文章 ·   Azure CDN:吸取的宝贵经验(10 月 ...