日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/3/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】Phong和Blinn-Phong光照模型 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【轉(zhuǎn)】Phong和Blinn-Phong光照模型

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

Phong和Blinn-Phong是計(jì)算鏡面反射光的兩種光照模型,兩者僅僅有很小的不同之處。

?

1.Phong模型

Phone模型計(jì)算中的一個關(guān)鍵步驟就是反射向量R的計(jì)算:

?

上圖中的位于表面“下面”的向量?‘I’?是原始?‘I’?向量的拷貝,并且二者是一樣的,現(xiàn)在我們的目標(biāo)計(jì)算出向量?‘R’?。根據(jù)向量相加原則,向量?‘R’?等于?'I'?+?'V',‘I’?是已知的,所以我們需要做的就是找出向量?‘V’。注意法向量?‘N’?的負(fù)方向就是?‘-N’,我們可以在?‘I’?和?‘-N’?之間使用一個點(diǎn)乘運(yùn)算就能得到?‘I’?在?‘-N’?上面的投影的模。這個模正好是?‘V’?的模的一半,由于?‘V’?與?‘N’?有相同的方向,我們可以將這個模乘上?‘N’?(其模為?1?)再乘上?2?即可得到?‘V’。總結(jié)一下就是下面的公式:

?

?

2.Blinn-Phong模型

?Phong模型中計(jì)算反射光線的向量是一件相對比較耗時的任務(wù),因此Blinn-Phong對這一點(diǎn)進(jìn)行了改進(jìn)。

?

Ks:物體對于反射光線的衰減系數(shù)

N:表面法向量

H:光入射方向L和視點(diǎn)方向V的中間向量

Shininess:高光系數(shù)

?

可見,通過該式計(jì)算鏡面反射光是符合基本規(guī)律的,當(dāng)視點(diǎn)方向和反射光線方向一致時,計(jì)算得到的H與N平行,dot(N,H)取得最大;當(dāng)視點(diǎn)方向V偏離反射方向時,H也偏離N。

同時H的計(jì)算比起反射向量R的計(jì)算簡單的多,R向量的計(jì)算需要若干次的向量乘法與加法,而H的計(jì)算僅僅需要一次加法。

下面是用cg著色語言書寫的Phong和Blinn-Phong的頂點(diǎn)和片段著色程序

?

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光照模型

通過簡單的對比發(fā)現(xiàn),在相同條件下Blinn-Phong的高光范圍要比Phong更大,寫實(shí)效果Phong光照模型更好。但算法簡單,運(yùn)行速度快是Blinn-Phong光照模型的優(yōu)點(diǎn)。

posted on 2018-08-14 11:53 時空觀察者9號 閱讀(...) 評論(...) 編輯 收藏

總結(jié)

以上是生活随笔為你收集整理的【转】Phong和Blinn-Phong光照模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。