摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文 名“GPU编程与CG语言之阳春白雪下里巴人”

BRDF 光照模型

10.2.1 什么是 BRDF 光照模型

1965 年, Nicodemus, Fred 在论文 Directional reflectance and emissivity of an opaque surface” 中提出了 BRDF 的概念。 BRDF , Bidirectional Reflectance Distribution Function ,中文翻译为 “ 双向反射分布函数 ” 。该函数描述了入射光线在非透明物体表面如何进行反射。

BRDF 的结果是一个没有单位的数值,表示在给定入射条件下,某个出射方向上反射光的相对能量,也可以理解为 “ 入射光以特定方向离开的概率 ” (实时计算机图形学第二版 111 页)。如 图 23 所示, Wi表示光线入射方向, Wo表示光线出射方向(入射点到视点),则该情况下的 BRDF 值 表示:光线以Wi 方向入射,然后以 Wo方向出射的概率,或者光强。 这些信息也可以用仪器进行测试记录,并存放在图片上,称为 polynomial texture map 

依据光学原理, BRDF 的计算公式为:

其中 Lr(Wo)表示从 Wo方向反射的光线的辐射亮度( Radiance ); Ei(Wi)表示从 Wi方向入射的光线在辐射照度( Irradiance )。辐射亮度和辐射照度是表示光照性质的光学量,辐射亮度是每单位 立体角在垂直于给定方向的平面上的单位正投影面积上的 功率。辐射照度则是整个入射表面的功率,等于投射在包括该点的一个面元上的辐射通量 dφ 除以该面元的面积 dA 。故而,从物理光学上我们可以将公式理解为: BRDF 函数计算的是 “ 特定反射方向的光强与入射光强的比例 ” 

所以给定一个具体的 BRDF 数学描述后,就可以放到 rendering equation 中使用(参阅 9.4 节)。

10.2.2 什么是各向异性

各向异性 (anisotropy) 与 均向性相反,是指在不同方向具有不同行为的性质,也就是其行为与方向有关。如在物理学上,沿着材料做不同方向的量测,若会出现不同行为,通常称该材料具有某种 “ 各向异性 ” ,这样的材料表面称为各向异性表面( anisotropic surface );

特殊的晶体结构会导致各向异性,材质表面上存在有组织的细小凹凸槽也会导致各向异性。各向异性反射是指:各向异性表面反射光的一种现象。在生活中我们经常见到各向异性光照效果,例如光滑的炊具上的扇面光斑( 图 24 所示)。

由于材质有组织的细微凹凸结构的不同,各向异性也分为基本的三种类型(如 图 25 所示):

1.      线性各向异性;

2.      径向各向异性;

3.      圆柱形各向异性,实际上线性各向异性,单被映像为圆柱形。

10.3 Bank BRDF 经验模型

Bank BRDF 属于经验模型,由于其计算简单,且效果良好,所以该模型在各向异性光照效果的模拟方面非常有用。 Bank BRDF 的镜面反射部分可以表达为公式 ( 10-14 )的 形式:

Ks、 ns分别表示镜面反射系数和高光系数; L表示入射光线方向、V 表示实现观察方向、 T表示该点的切向量。尤其要注意切向量的计算方法,因为一个三维空间点可能存在无数个切向量,通常我采用 “ 顶点的法向量和视线方向做叉积,其结果作为 T 。

Bank BRDF 模型渲染效果如 图 26 、 图 27 所示。 图 27 的渲染图非常明显的呈现出各向异性的光照效果。

下面分别给出 Bank BRDF 的顶点着色程序和片段着色程序代码。

代码 10 Bank BRDF 的顶点着色程序

void main_v(float4 position   : POSITION,

float4 normal   : NORMAL,

out float4 oPosition : POSITION,

out float3 worldPos : TEXCOORD0,

out float3 worldNormal   : TEXCOORD1,

uniform float4x4 modelViewProj,

uniform float4x4 worldMatrix,

uniform float4x4 worldMatrix_IT)

{

oPosition = mul(modelViewProj, position);

worldPos = mul(worldMatrix, position).xyz;

worldNormal = mul(worldMatrix_IT, normal).xyz;

}

代码 11 Bank BRDF 片段着色程序

void main_f(float4 position  : TEXCOORD0,

float3 normal    : TEXCOORD1,

out float4 color     : COLOR,

uniform float3 globalAmbient,

uniform float3 lightColor,

uniform float3 lightPosition,

uniform float3 eyePosition,

uniform float3 Ka,

uniform float3 Kd,

uniform float3 Ks,

uniform float  shininess)

{

float3 P = position.xyz;

float3 N = normalize(normal);

float3 ambient = Ka * globalAmbient; // 计算环境光分量

float3 L = normalize(lightPosition - P);

float ln = max(dot(L, N), 0);

float3 diffuse = Kd * lightColor *ln; // 计算有向光漫反射分量

// 计算镜面反射分量

float3 V = normalize(eyePosition - P);

float3 H = normalize(L + V);

float3 specular = float3(0.0,0.0,0.0);

bool back = (dot(V,N)>0) && (dot(L,N));

if(back)

{

float3 T = normalize(cross(N,V));  // 计算顶点切向量

float a = dot(L,T);

float b = dot(V,T);

float c = sqrt(1-pow(a,2.0))* sqrt(1-pow(b,2.0)) - a*b; // 计算 Bank BRDF 系数

float brdf = Ks* pow(c, shininess);

specular = brdf * lightColor *ln;

}

color.xyz = ambient + diffuse + specular;

color.w = 1;

}

作者:pizi0475 发表于2011-8-1 15:00:30 原文链接
 
 
http://www.cnblogs.com/guoyiqi/archive/2011/08/01/2137116.html

(z转)基于CPU的Bank BRDF经验模型,实现各向异性光照效果!的更多相关文章

  1. three.js粒子效果(分别基于CPU&GPU实现)

    前段时间做了一个基于CPU和GPU对比的粒子效果丢在学习WebGL的群里,技术上没有多作讲解,有同学反馈看不太懂GPU版本,干脆开一篇文章,重点讲解基于GPU开发的版本. 一.概况 废话不多说,先丢上 ...

  2. 基于Metronic的Bootstrap开发框架经验总结(14)--条码和二维码的生成及打印处理

    在很多项目里面,对条形码和二维码的生成和打印也是一种很常见的操作,在Web项目里面,我们可以利用JS生成条形码和二维码的组件有很多.本文引入两个比较广泛使用的JS组件,用来处理条形码和二维码的生成处理 ...

  3. 基于Metronic的Bootstrap开发框架经验总结(13)--页面链接收藏夹功能的实现2(利用Sortable进行拖动排序)

    在上篇随笔<基于Metronic的Bootstrap开发框架经验总结(12)--页面链接收藏夹功能的实现>上,我介绍了链接收藏夹功能的实现,以及对收藏记录的排序处理.该篇随笔主要使用功能按 ...

  4. 基于Metronic的Bootstrap开发框架经验总结(5)--Bootstrap文件上传插件File Input的使用

    Bootstrap文件上传插件File Input是一个不错的文件上传控件,但是搜索使用到的案例不多,使用的时候,也是一步一个脚印一样摸着石头过河,这个控件在界面呈现上,叫我之前使用过的Uploadi ...

  5. 基于Metronic的Bootstrap开发框架经验总结(11)--页面菜单的几种呈现方式

    在常规的后台管理系统或者前端界面中,一般都有一个导航菜单提供给用户,方便选择所需的内容.基于Metronic的Bootstrap开发框架,是整合了Metroinc样式,以及Boostrap组件模块的内 ...

  6. 基于Metronic的Bootstrap开发框架经验总结(10)--优化Bootstrap图标管理

    在基于Bootstrap开发的项目中,鲜艳颜色的按钮,以及丰富的图表是很吸引人的特点,为了将这个特点发挥到极致,可以利用Bootstrap图标抽取到数据库里面,并在界面中进行管理和使用,这样我们可以把 ...

  7. 基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理

    最近一直很多事情,博客停下来好久没写了,整理下思路,把最近研究的基于Metronic的Bootstrap开发框架进行经验的总结出来和大家分享下,同时也记录自己对Bootstrap开发的学习研究的点点滴 ...

  8. 基于Metronic的Bootstrap开发框架经验总结(2)--列表分页处理和插件JSTree的使用

    在上篇<基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理>介绍了Bootstrap开发框架的一些基础性概括,包括总体界面效果,以及布局.菜单等内容, ...

  9. 基于Metronic的Bootstrap开发框架经验总结(3)--下拉列表Select2插件的使用

    在上篇<基于Metronic的Bootstrap开发框架经验总结(2)--列表分页处理和插件JSTree的使用>介绍了数据的分页处理,使用了Bootstrap Paginator插件,另外 ...

随机推荐

  1. px、pt和em的区别

    (转载)http://www.1z1b.com/one-blog-a-week/px-em-pt/ 这里引用的是Jorux的“95%的中国网站需要重写CSS”的文章,题目有点吓人,但是确实是现在国内网 ...

  2. sparkthriftserver启动及调优

    Sparkthriftserver启用及优化 1.  概述 sparkthriftserver用于提供远程odbc调用,在远端执行hive sql查询.默认监听10000端口,Hiveserver2默 ...

  3. 反应器(Reactor)模式

    Java NIO非堵塞技术实际是采取反应器模式,或者说是观察者(observer)模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/ ...

  4. Eclipse内存讲解,eclipse.ini设置

    Ubuntu 系统下,Eclipse 配置文件: vi ~/eclipse/eclipse.ini -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:Max ...

  5. Linux IPC机制 - 函数总结

    以下表格为IPC的函数总结,IPC包括: 1. 无名管道(Pipe):http://www.cnblogs.com/Jimmy1988/p/7553069.html 2.有名管道(FIFO):http ...

  6. ionic中generate page后module.ts报错的解决办法

    此问题出现在Ionic官方将版本从2.2升级到Ionic3以上之后, 在项目中generate page时,自动创建的module.ts就报错,如下: 解决办法如下: 1)将IonicModule替换 ...

  7. sql中的分页实现

    1.两种方式 1.1:row_number() over()函数 1.2:OFFSET ....FETCH OFFSET { integer_constant | offset_row_count_e ...

  8. Android sdk manager 下载速度慢的问题

    不多说了,直接附上方法: 首先打开Ecplise 中Android sdk manager,打开后, 在此窗口的上方打开偏好设置选项,然后在里面设置HTTP Proxy server和HTTP Pro ...

  9. 微服务与DevOps关系

    随着IT技术的不断发展,从传统的IT建设模型逐步向新型IT建设模型过渡,建设模式的改变,必然影响应用系统的全生命周期.应用系统的建设经过单体应用.SOA应用.逐步走向微服务应用,至于何为单体应用.SO ...

  10. Golang beego ORM + CRUP 操作详解

      构建beego Web 项目         首先构建一个beego 的web 项目,这个我们完全可以参考beego 官网中的开发文档,上面介绍的非常的详细,在这我就不给大家介绍,主要是介绍ORM ...