摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文 名“GPU编程与CG语言之阳春白雪下里巴人”
2011-01-29 20:29
477 查看
摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文 名“GPU编程与CG语言之阳春白雪下里巴人”
9.4 Blinn-Phong 光照模型
Blinn-Phong 光照模型,又称为 Blinn-phong 反射模型( Blinn–Phong reflection model )或者 phong 修正模型( modified Phong reflection model ),是由 Jim Blinn 于 1977 年在文章 “Models of light reflection for computer synthesized pictures ” 中对传统 phong 光照模型基础上进行修改提出的。和传统 phong 光照模型相比, Blinn-phong 光照模型混合了 Lambert 的漫射部分和标准的高光 ,渲染效果有时比 Phong 高光更柔和、更平滑,此外它在速度上相当快,因此成为许多 CG 软件中的默认光照渲染方法。此外它也集成在了大多数图形芯片中,用以产生实时快速的渲染。 在 OpenG L 和 Direct3D 渲染管线中, Blinn-Phong 就是默认的渲染模型。
phong 光照模型中,必须计算 的V和R的点积的值值,其中 R为反射光线方向单位向量, V为视线方向单位向量,但是在 Blinn-phong 光照模型中,用N dot H 的值取代了V dot R 。 Blinn-phong 光照模型公式为:
其中 N是入射点的单位法向量, H是“光入射方向L 和视点方向V 的中间向量”,通常也称之为半角向量。 注意:半角向量被广泛用于各类光照模型,原因不但在于半角向量蕴含的信息价值,也在于计算半角向量是一件简单、耗时不多的工作。
通常情况下,使用 Blinn-phong 光照模型渲染的效果和 phong 模型渲染的效果没有太大的区别,有些艺术工作者认为 phong 光照模型比 blinn-phong 更加真实,实际上也是如此。 Blinn-phong 渲染效果要更加柔和一些, Blinn-phong 光照模型 省去了计算反射光线方向向量的两个乘法运算,速度更快。由于 Blinn-phong 和 phong 模型的唯一区别一个使用半角向量,一个使用反射光方向向量,所以下面只给出 Blinn-phong 模型的片段着色程序代码。
代码 7 Blinn-phong 模型片段着色程序
void main_f(VertexScreen posIn,
out float4 color : COLOR,
uniform float4x4 worldMatrix,
uniform float4x4 worldMatrix_IT,
uniform float3 globalAmbient,
uniform float3 eyePosition,
uniform float3 lightPosition,
uniform float3 lightColor,
uniform float3 Kd,
uniform float3 Ks,
uniform float shininess)
{
float3 worldPos = mul(worldMatrix, posIn.objectPos).xyz;
float3 N = mul(worldMatrix_IT, posIn.objectNormal).xyz;
N = normalize(N);
// 计算入射光方向 / 视线方向 / 半角向量
float3 L = normalize(lightPosition - worldPos);
float3 V = normalize(eyePosition - worldPos);
float3 H = normalize(L + V);
// 计算漫反射分量
float3 diffuseColor = Kd * globalAmbient+Kd*lightColor*max(dot(N, L), 0);
// 计算镜面反射分量
float3 specularColor = Ks * lightColor*pow(max(dot(N, H), 0), shininess);
color.xyz = diffuseColor + specularColor;
color.w = 1;
}
Blinn-phong 光照模型的渲染效果如:
图形截屏,加上文档大小的限制,好像导致 图 19 和 图 20 不能形成明显的对比。实际上,我在实现算法时认真对比过, phong 光照模型确实要比 blinn-phong 渲染效果要真实。与 phong 光照模型相比,使用 blinn-phong 进行光照渲染,在同样的高光系数下,高光领域覆盖范围较大,明暗界限不明显。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liu_lin_xm/archive/2009/11/21/4845848.aspx
9.4 Blinn-Phong 光照模型
Blinn-Phong 光照模型,又称为 Blinn-phong 反射模型( Blinn–Phong reflection model )或者 phong 修正模型( modified Phong reflection model ),是由 Jim Blinn 于 1977 年在文章 “Models of light reflection for computer synthesized pictures ” 中对传统 phong 光照模型基础上进行修改提出的。和传统 phong 光照模型相比, Blinn-phong 光照模型混合了 Lambert 的漫射部分和标准的高光 ,渲染效果有时比 Phong 高光更柔和、更平滑,此外它在速度上相当快,因此成为许多 CG 软件中的默认光照渲染方法。此外它也集成在了大多数图形芯片中,用以产生实时快速的渲染。 在 OpenG L 和 Direct3D 渲染管线中, Blinn-Phong 就是默认的渲染模型。
phong 光照模型中,必须计算 的V和R的点积的值值,其中 R为反射光线方向单位向量, V为视线方向单位向量,但是在 Blinn-phong 光照模型中,用N dot H 的值取代了V dot R 。 Blinn-phong 光照模型公式为:
其中 N是入射点的单位法向量, H是“光入射方向L 和视点方向V 的中间向量”,通常也称之为半角向量。 注意:半角向量被广泛用于各类光照模型,原因不但在于半角向量蕴含的信息价值,也在于计算半角向量是一件简单、耗时不多的工作。
通常情况下,使用 Blinn-phong 光照模型渲染的效果和 phong 模型渲染的效果没有太大的区别,有些艺术工作者认为 phong 光照模型比 blinn-phong 更加真实,实际上也是如此。 Blinn-phong 渲染效果要更加柔和一些, Blinn-phong 光照模型 省去了计算反射光线方向向量的两个乘法运算,速度更快。由于 Blinn-phong 和 phong 模型的唯一区别一个使用半角向量,一个使用反射光方向向量,所以下面只给出 Blinn-phong 模型的片段着色程序代码。
代码 7 Blinn-phong 模型片段着色程序
void main_f(VertexScreen posIn,
out float4 color : COLOR,
uniform float4x4 worldMatrix,
uniform float4x4 worldMatrix_IT,
uniform float3 globalAmbient,
uniform float3 eyePosition,
uniform float3 lightPosition,
uniform float3 lightColor,
uniform float3 Kd,
uniform float3 Ks,
uniform float shininess)
{
float3 worldPos = mul(worldMatrix, posIn.objectPos).xyz;
float3 N = mul(worldMatrix_IT, posIn.objectNormal).xyz;
N = normalize(N);
// 计算入射光方向 / 视线方向 / 半角向量
float3 L = normalize(lightPosition - worldPos);
float3 V = normalize(eyePosition - worldPos);
float3 H = normalize(L + V);
// 计算漫反射分量
float3 diffuseColor = Kd * globalAmbient+Kd*lightColor*max(dot(N, L), 0);
// 计算镜面反射分量
float3 specularColor = Ks * lightColor*pow(max(dot(N, H), 0), shininess);
color.xyz = diffuseColor + specularColor;
color.w = 1;
}
Blinn-phong 光照模型的渲染效果如:
图形截屏,加上文档大小的限制,好像导致 图 19 和 图 20 不能形成明显的对比。实际上,我在实现算法时认真对比过, phong 光照模型确实要比 blinn-phong 渲染效果要真实。与 phong 光照模型相比,使用 blinn-phong 进行光照渲染,在同样的高光系数下,高光领域覆盖范围较大,明暗界限不明显。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liu_lin_xm/archive/2009/11/21/4845848.aspx
相关文章推荐
- 《GPU编程与CG语言之阳春白雪下里巴人》 读书笔记2
- 《GPU编程与CG语言之阳春白雪下里巴人》 读书笔记3 漫反射与Lambert光照模型
- 《GPU编程与CG语言之阳春白雪下里巴人》阅读笔记 第三章+第四章
- 《GPU编程与CG语言之阳春白雪下里巴人》 读书笔记1
- 《GPU编程与CG语言之阳春白雪下里巴人》阅读笔记 第一章+第二章
- 《GPU编程与CG语言之阳春白雪下里巴人》阅读笔记 第五章+第六章
- GPU 编程与CG 语言之阳春白雪下里巴人——CG学习读书笔记之数学函数(三)
- CG标准函数库——数学函数(GPU编程与CG语言之阳春白雪下里巴人)
- GPU 编程与CG 语言之阳春白雪下里巴人——CG学习读书笔记之数学函数(之一)。
- GPU 编程与CG 语言之阳春白雪下里巴人——CG学习读书笔记之数学函数(之二)。
- Computer Language and Programming(计算机语言与编程)
- MDSF:面向语言编程LOP(Language Oriented Programming)方法介绍
- MDSF:面向语言编程LOP(Language Oriented Programming)方法介绍
- Atitit 编程范式之道 attilax著 艾龙 著 1. 编程范式与编程语言的关系是什么? 1 2. LOP 面向语言编程(LOP, Language Oriented Programming
- GPU图形处理管线、图形硬件接口(OpenGL)与可编程图形渲染语言(CG)的关系
- C 语言高效编程的几招——A few action of efficient C language programming
- GPU图形处理管线、图形硬件接口(OpenGL)与可编程图形渲染语言(CG)的关系
- 面向语言编程LOP(Language Oriented Programming)方法介绍 推荐
- The Swift Programming Language , Swift程序语言:基础(中文教程)
- C 语言高效编程的几招——A few action of efficient C language programming