分享

GPU实现“Blinn

 LVADDIE 2015-02-04

摘抄“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 进行光照渲染,在同样的高光系数下,高光领域覆盖范围较大,明暗界限不明显。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多