(z转)基于CPU的Bank BRDF经验模型,实现各向异性光照效果!
摘抄“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;
}
(z转)基于CPU的Bank BRDF经验模型,实现各向异性光照效果!的更多相关文章
- three.js粒子效果(分别基于CPU&GPU实现)
前段时间做了一个基于CPU和GPU对比的粒子效果丢在学习WebGL的群里,技术上没有多作讲解,有同学反馈看不太懂GPU版本,干脆开一篇文章,重点讲解基于GPU开发的版本. 一.概况 废话不多说,先丢上 ...
- 基于Metronic的Bootstrap开发框架经验总结(14)--条码和二维码的生成及打印处理
在很多项目里面,对条形码和二维码的生成和打印也是一种很常见的操作,在Web项目里面,我们可以利用JS生成条形码和二维码的组件有很多.本文引入两个比较广泛使用的JS组件,用来处理条形码和二维码的生成处理 ...
- 基于Metronic的Bootstrap开发框架经验总结(13)--页面链接收藏夹功能的实现2(利用Sortable进行拖动排序)
在上篇随笔<基于Metronic的Bootstrap开发框架经验总结(12)--页面链接收藏夹功能的实现>上,我介绍了链接收藏夹功能的实现,以及对收藏记录的排序处理.该篇随笔主要使用功能按 ...
- 基于Metronic的Bootstrap开发框架经验总结(5)--Bootstrap文件上传插件File Input的使用
Bootstrap文件上传插件File Input是一个不错的文件上传控件,但是搜索使用到的案例不多,使用的时候,也是一步一个脚印一样摸着石头过河,这个控件在界面呈现上,叫我之前使用过的Uploadi ...
- 基于Metronic的Bootstrap开发框架经验总结(11)--页面菜单的几种呈现方式
在常规的后台管理系统或者前端界面中,一般都有一个导航菜单提供给用户,方便选择所需的内容.基于Metronic的Bootstrap开发框架,是整合了Metroinc样式,以及Boostrap组件模块的内 ...
- 基于Metronic的Bootstrap开发框架经验总结(10)--优化Bootstrap图标管理
在基于Bootstrap开发的项目中,鲜艳颜色的按钮,以及丰富的图表是很吸引人的特点,为了将这个特点发挥到极致,可以利用Bootstrap图标抽取到数据库里面,并在界面中进行管理和使用,这样我们可以把 ...
- 基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理
最近一直很多事情,博客停下来好久没写了,整理下思路,把最近研究的基于Metronic的Bootstrap开发框架进行经验的总结出来和大家分享下,同时也记录自己对Bootstrap开发的学习研究的点点滴 ...
- 基于Metronic的Bootstrap开发框架经验总结(2)--列表分页处理和插件JSTree的使用
在上篇<基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理>介绍了Bootstrap开发框架的一些基础性概括,包括总体界面效果,以及布局.菜单等内容, ...
- 基于Metronic的Bootstrap开发框架经验总结(3)--下拉列表Select2插件的使用
在上篇<基于Metronic的Bootstrap开发框架经验总结(2)--列表分页处理和插件JSTree的使用>介绍了数据的分页处理,使用了Bootstrap Paginator插件,另外 ...
随机推荐
- Redis configuration
官方2.6配置如下: # Redis configuration file example # Note on units: when memory size is needed, it is pos ...
- Ionic3 UI组件之 autocomplete
无论是web开发还是app开发,autocomplete是常用组件之一. 可惜截止到目前,ionic官方并未提供此组件. ionic2-autocomplete是GitHub上的开源的Ionic2组件 ...
- ILMerge将源DLL合并到目标EXE
ILMerge将源DLL合并到目标EXE(.NET4.6.2) 本文为原创文章,如转载,请在网页明显位置标明原文名称.作者及网址,谢谢! 本文主要是使用微软的ILMerge工具将源DLL合并到目标EX ...
- 2 duplicate symbols for architecture“文件冲突”
我在配置第三方库拷贝示例文件中的库文件到新项目完成相关配置之后报下面的错误: 错误的原因是在解决问题之后发现的(第三方库的项目示例demo中的 要拷贝到自己项目中的库 并不需要全部添加到自己 ...
- MyBatis和Hibernate的优缺点对比。
Hibernate的优点: 1.hibernate是全自动,hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql. 2.功能强 ...
- SpringMVC配置式开发
所谓配置式开发是指“处理器类是程序员手工定义,实现了特定接口的类,然后再在SpringMVC 配置文件中对该类进行显示的.明确的注册”的开发方式. 一.处理器映射器HandlerMapping Han ...
- vue+element ui 的tab 动态增减,切换时提示用户是否切换
前言:工作中用到 vue+element ui 的前端框架,动态添加 Tab,删除 Tab,切换 Tab 时提示用户是否切换等,发现 element ui 有一个 bug,这里记录一下如何实现.转载 ...
- bzoj P4870: [Shoi2017]组合数问题——solution
题意:求解—— $$(C^{r}_{nk}+C^{r+k}_{nk}+C^{r+2k}_{nk}+...+C^{r+(n-1)k}_{nk}+...)mod(P)$$ 其中$C^{m}_{n}$表示从 ...
- bzoj P4825 [Hnoi2017]单旋——solution
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据 结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的 ...
- Docker for Windows(一)下载与安装
一.下载Docker for Windows 下载地址:Docker for Windows 下载完是一个安装程序,双击运行即可.注:如果您的系统不符合运行Docker for Windows的要求, ...