ブリン・フォン反射モデル

提供: MonoBook
2018年11月14日 (水) 08:52時点におけるimported>Administratorによる版 (ページの作成:「'''ブリン・フォン反射モデル'''とは、フォン反射モデルにユタ大学のジム・ブリンが改良を加えたもの。 実のところ「[...」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

ブリン・フォン反射モデルとは、フォン反射モデルにユタ大学のジム・ブリンが改良を加えたもの。

実のところ「フォン反射モデル」として紹介されているほとんどは改良型の「ブリン・フォン反射モデル」の方であったりする。 OpenGLDicrect3Dでは特にシェーダーを明示しない場合に使われるデフォルトのライティング(内蔵シェーダー)として採用されている。

頂点間のピクセル補完にはフォンシェーディングではなくグローシェーディングが採用されている。

ジム・ブリンブイ・トン・フォンアンリ・グローも同じユタ大学の教室でアイバン・サザランドに学んだ仲間だったそうだ。

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;
}

関連項目[編集 | ソースを編集]