【转】Phong和Blinn-Phong光照模型

来自:http://www.cnblogs.com/bluebean/p/5299358.html

Phong和Blinn-Phong是计算镜面反射光的两种光照模型,两者仅仅有很小的不同之处。

1.Phong模型

Phone模型计算中的一个关键步骤就是反射向量R的计算:

上图中的位于表面“下面”的向量 ‘I’ 是原始 ‘I’ 向量的拷贝,并且二者是一样的,现在我们的目标计算出向量 ‘R’ 。根据向量相加原则,向量 ‘R’ 等于 'I' + 'V',‘I’ 是已知的,所以我们需要做的就是找出向量 ‘V’。注意法向量 ‘N’ 的负方向就是 ‘-N’,我们可以在 ‘I’ 和 ‘-N’ 之间使用一个点乘运算就能得到 ‘I’ 在 ‘-N’ 上面的投影的模。这个模正好是 ‘V’ 的模的一半,由于 ‘V’ 与 ‘N’ 有相同的方向,我们可以将这个模乘上 ‘N’ (其模为 1 )再乘上 2 即可得到 ‘V’。总结一下就是下面的公式:

2.Blinn-Phong模型

Phong模型中计算反射光线的向量是一件相对比较耗时的任务,因此Blinn-Phong对这一点进行了改进。

Ks:物体对于反射光线的衰减系数

N:表面法向量

H:光入射方向L和视点方向V的中间向量

Shininess:高光系数

可见,通过该式计算镜面反射光是符合基本规律的,当视点方向和反射光线方向一致时,计算得到的H与N平行,dot(N,H)取得最大;当视点方向V偏离反射方向时,H也偏离N。

同时H的计算比起反射向量R的计算简单的多,R向量的计算需要若干次的向量乘法与加法,而H的计算仅仅需要一次加法。

下面是用cg着色语言书写的Phong和Blinn-Phong的顶点和片段着色程序

Phong_FragmentLighting_v.cg
 1 struct V2F{2     float4 position:POSITION;3     float3 worldPosition: TEXCOORD0;4     float3 worldNormal :TEXCOORD1;5 };6 void Phong_FragmentLighting_v(float4 position :POSITION,7                               float4 normal:NORMAL,8                               uniform float4x4 modelMatrix,9                               uniform float4x4 modelMatrix_IT,
10                               uniform float4x4 modelViewProj,
11                               out V2F O){
12     O.position=mul(modelViewProj,position);
13     O.worldPosition=mul(modelMatrix,position).xyz;
14     O.worldNormal=normalize(mul(modelMatrix_IT,normal)).xyz;
15 }

Phong_FragmentLighting_f.cg
 1 void Phong_FragmentLighting_f(float3 position :TEXCOORD0,2                                float3 normal: TEXCOORD1,3                                uniform float3 globalAmbient,4                                uniform float3 lightColor,5                                uniform float3 lightPosition,6                                uniform float3 eyePosition,7                                uniform float3 Ke,8                                uniform float3 Ka,9                                uniform float3 Kd,
10                                uniform float3 Ks,
11                                uniform float  shininess,
12                                out float4 color:COLOR)
13               {
14                   float3 N=normalize(normal);
15                   float3 L=normalize(lightPosition-position);
16                   float3 V=normalize(eyePosition-position);
17
18                   float3 R=reflect(-L,N);
19                   R=normalize(R);
20
21                   // Compute emissive term
22                   float3 emissive = Ke;
23
24                  // Compute ambient term
25                  float3 ambient = Ka * globalAmbient;
26
27                 // Compute the diffuse term
28                 float diffuseLight = max(dot(N, L), 0);
29                 float3 diffuse = Kd * lightColor * diffuseLight;
30
31                 // Compute the specular term
32                 float specularLight = pow(max(dot(V, R), 0), shininess);
33                 if (diffuseLight <= 0) specularLight = 0;
34                 float3 specular = Ks * lightColor * specularLight;
35
36                 //color.xyz = emissive + ambient + diffuse + specular;
37                 color.xyz=ambient + diffuse + specular;
38                 color.w = 1;
39               }

BlinnPhong_FragmentLighting_v.cg
 1 struct V2F{2     float4 position:POSITION;3     float3 worldPosition: TEXCOORD0;4     float3 worldNormal :TEXCOORD1;5 };6 void BlinnPhong_FragmentLighting_v(float4 position :POSITION,7                               float4 normal:NORMAL,8                               uniform float4x4 modelMatrix,9                               uniform float4x4 modelMatrix_IT,
10                               uniform float4x4 modelViewProj,
11                               out V2F O){
12     O.position=mul(modelViewProj,position);
13     O.worldPosition=mul(modelMatrix,position).xyz;
14     O.worldNormal=normalize(mul(modelMatrix_IT,normal)).xyz;
15 }

 
BlinnPhong_FragmentLighting_f.cg
 1 void BlinnPhong_FragmentLighting_f(float3 position :TEXCOORD0,2                                float3 normal: TEXCOORD1,3                                uniform float3 globalAmbient,4                                uniform float3 lightColor,5                                uniform float3 lightPosition,6                                uniform float3 eyePosition,7                                uniform float3 Ke,8                                uniform float3 Ka,9                                uniform float3 Kd,
10                                uniform float3 Ks,
11                                uniform float  shininess,
12                                out float4 color:COLOR)
13               {
14                   float3 N=normalize(normal);
15                   float3 L=normalize(lightPosition-position);
16                   float3 V=normalize(eyePosition-position);
17
18                  float3 H=normalize(L+V);
19
20                   // Compute emissive term
21                   float3 emissive = Ke;
22
23                  // Compute ambient term
24                  float3 ambient = Ka * globalAmbient;
25
26                 // Compute the diffuse term
27                 float diffuseLight = max(dot(N, L), 0);
28                 float3 diffuse = Kd * lightColor * diffuseLight;
29
30                 // Compute the specular term
31                 float specularLight = pow(max(dot(H, N), 0), shininess);
32                 if (diffuseLight <= 0) specularLight = 0;
33                 float3 specular = Ks * lightColor * specularLight;
34
35                 color.xyz=ambient + diffuse + specular;
36                 color.w = 1;
37               }

效果对比:

Phong光照模型

Blinn-Phong光照模型

通过简单的对比发现,在相同条件下Blinn-Phong的高光范围要比Phong更大,写实效果Phong光照模型更好。但算法简单,运行速度快是Blinn-Phong光照模型的优点。

posted on 2018-08-14 11:53 时空观察者9号 阅读(...) 评论(...) 编辑 收藏

【转】Phong和Blinn-Phong光照模型相关推荐

  1. cesium gltf 1.0 2.0的一些扩展

    cesium中对于 gltf1.0.2.0中某些扩展需要进行解析,解析的过程是将gltf1.0的格式转换成gltf2.0的格式.         对于解析过程中使用的某些扩展的解释: {"a ...

  2. 基础光照-Phong 光照模型

    1. Phong 光照模型 1.1 环境光照 Ambient Lighting 1.1.1 实现代码 1.2 漫反射光照 Diffuse Lighting 1.2.1 法向量 及实现代码 1.2.2 ...

  3. 计算机图形学基础:颜色模型、图像基本知识、Phong光照模型

    主要内容: 图形学中的一些重要概念 色彩视觉 图像和像素 三角网格模型 光照模型与明暗处理 视点变换和视点方向 色彩视觉 什么是色彩? 色彩是对不同波长的光的能量的感知: 不同波长的电磁波(elect ...

  4. BGRABitmap图像操作9c:同时使用莫林杂点和 phong 阴影制作纹理

    纹理随鼠标不停变化,有点像水面. unit Unit1;{$mode objfpc}{$H+}interfaceusesClasses, SysUtils, FileUtil, Forms, Cont ...

  5. opengl光照效果_【图形学基础 | Shader】Blinn-Phong 光照模型

    在学习threejs时候,看到了MeshPhongMaterial这个api,了解到了Blinn-Phong 光照模型. Blinn-Phong 光照模型,又称为 Blinn-phong 反射模型(B ...

  6. 5、计算机图形学——着色与光照模型

    一.着色(shading)的概念 着色,顾名思义就是给物体上色.在计算机图形学中,着色就是确定物体上或者图形上的每个像素的颜色. 像素或者物体表面的颜色受光照和材质的影响,光照中光线的颜色一定程度上决 ...

  7. 【Aladdin Unity3D Shader编程】之三 光照模型(二)

    高光反射模型 Specular=直射光*pow(cosθ,高光的参数) θ:是反射光和视野方向的夹角 编写高光反射Shader Shader "AladdinShader/07 Specul ...

  8. Unity3D 的物理渲染和光照模型

    阅读目录 漫反射面:郎伯模型 朗伯着色器(Lambertian shader) Toon shading 镜面: Blinn-Phong模型 在Unity5中物理渲染 Unity 中使用的着色技术 结 ...

  9. Blinn-Phong光照模型详解

            Blinn-Phong光照模型,又称为Blinn-phong反射模型(Blinn–Phong reflection model)或者 phong 修正模型(modified Phong ...

  10. (转)光照模型及cg实现

    经典光照模型(illumination model) 物体表面光照颜色由入射光.物体材质,以及材质和光的交互规律共同决定. 由于环境光给予物体各个点的光照强度相同,且没有方向之分,所以在只有环境光的情 ...

最新文章

  1. antd+dva笔记
  2. Celery定时任务异步任务
  3. 面试题 08.03. Magic Index LCCI 魔术索引
  4. python中xpath_Python爬虫之Xpath语法
  5. 十分钟能学会的简单python爬虫
  6. 风格迁移模型测试效果
  7. azure 导入 bak_如何使用BULK INSERT在本地和Azure中导入数据
  8. [JSOI2008]火星人 hash+splay
  9. Lesson6 how to use HTML QT Widgets
  10. 自制的JavaScript NodeTree导航栏,纯练手,附源码
  11. python requests text content_对python requests的content和text方法的区别详解
  12. 矩阵奇异值分解(详解)
  13. 【读书笔记】Vue.js 初次接触
  14. 神器啊!轻松用 Python 写个 APP!
  15. uni-app设置原生标题栏渐变色
  16. C#替换方向性的 Unicode 控制字符,解决无法匹配iphone 通讯录复制的手机号码问题
  17. “特殊疑问词+动词不定式”的用法归纳
  18. Y9000P 2022独显直连
  19. C++中带.h与不带.h的头文件
  20. python 当前日期的上一个月和后一个月

热门文章

  1. SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载)
  2. 一行Java代码判断文件夹是否存在,不存在则新建
  3. oracle转64编码,[转]将oracle数据库的编码变成utf-8
  4. python相同程序执行结果不同_原理相同只是精简了的python代码,运行结果不同是为什么...
  5. PPT 下载 | 神策数据张涛:企业服务客户全生命周期运营三步曲客情诊断 解决方案库...
  6. 神策数据算法专家:推荐系统的实践与思考(下)
  7. 全面布局大数据平台,银科控股签约神策数据
  8. 【CEO赠书】《精益数据分析》:如何构建数据指标体系
  9. 重新认识mysql基本知识
  10. 高度平衡树 -- AVL 树