ブリン・フォン反射モデル
ナビゲーションに移動
検索に移動
ブリン・フォン反射モデルとは、フォン反射モデルにユタ大学のジム・ブリンが改良を加えたもの。
実のところ「フォン反射モデル」として紹介されているほとんどは改良型の「ブリン・フォン反射モデル」の方であったりする。 OpenGLやDicrect3Dでは特にシェーダーを明示しない場合に使われるデフォルトのライティング(内蔵シェーダー)として採用されている。
頂点間のピクセル補完にはフォンシェーディングではなくグローシェーディングが採用されている。
ジム・ブリンもブイ・トン・フォンもアンリ・グローも同じユタ大学の教室でアイバン・サザランドに学んだ仲間だったそうだ。
HLSL[編集 | ソースを編集]
HLSLでの実装例。
struct Lighting
{
float3 Diffuse;
float3 Specular;
};
struct PointLight
{
float3 position;
float3 diffuseColor;
float diffusePower;
float3 specularColor;
float specularPower;
};
Lighting GetPointLight( PointLight light, float3 pos3D, float3 viewDir, float3 normal )
{
Lighting OUT;
if( 0 < light.diffusePower )
{
float3 lightDir = light.position - pos3D; //3D position in space of the surface
float distance = length( lightDir );
lightDir = lightDir / distance; // = normalize( lightDir );
distance = distance * distance; //This line may be optimised using Inverse square root
// 拡散光の強度。
// saturateは0.0-1.0の範囲内に丸める処理(裏面からのライティングを無効化する処理)。
float NdotL = dot( normal, lightDir );
float intensity = saturate( NdotL );
// 色、強さ、減衰を考慮した拡散光を計算する
OUT.Diffuse = intensity * light.diffuseColor * light.diffusePower / distance;
// 光源ベクトルと視点ベクトルの間のハーフベクトルを計算する。
float3 H = normalize( lightDir + viewDir );
// 鏡面光の強度を計算する
float NdotH = dot( normal, H );
intensity = pow( saturate( NdotH ), specularHardness );
// 鏡面光
OUT.Specular = intensity * light.specularColor * light.specularPower / distance;
}
return OUT;
}