「ハーフベクトル」の版間の差分
Administrator (トーク | 投稿記録) |
Administrator (トーク | 投稿記録) |
||
| (同じ利用者による、間の2版が非表示) | |||
| 1行目: | 1行目: | ||
'''ハーフベクトル'''([[英語]]:half | '''ハーフベクトル'''([[英語]]:half vector)とは、2つのベクトルを足したものである。 | ||
ベクトルとベクトルを足すとその中間(ハーフ)の方向を向いたベクトルになる。 | |||
この特性を利用して[[3DCG]]においては物体表面([[頂点]]または[[ピクセル]])の位置からみて、視点と光源の中間方向(ハーフベクトル)を求めるのに使われる。 | |||
2個の[[ベクトル]]を足し算するとその中間のベクトルが得られるので、 ハーフベクトルを求めるには物体表面([[頂点]]または[[ピクセル]])の位置を基準とした「視点」と「光源」のベクトルを足し合わせればよい。 また、光の強さは0.0~1.0の範囲で表すのが一般的なので、その範囲になるよう[[正規化]](normalize)しておく。<source lang="HLSL"> | 鏡面反射はハーフベクトルと[[法線ベクトル]]が一致した際に最大値となる。 | ||
== 算出 == | |||
2個の[[ベクトル]]を足し算するとその中間のベクトルが得られるので、 ハーフベクトルを求めるには物体表面([[頂点]]または[[ピクセル]])の位置を基準とした「視点」と「光源」のベクトルを足し合わせればよい。 また、光の強さは0.0~1.0の範囲で表すのが一般的なので、その範囲になるよう[[正規化]](normalize)しておく。 | |||
[[頂点シェーダー]]での実装例(超抜粋)。 | |||
<source lang="HLSL"> | |||
float4x4 World; | float4x4 World; | ||
float3 LightDirection; | |||
float3 CameraPosition; | |||
struct VSIn { | struct VSIn { | ||
| 20行目: | 30行目: | ||
// カメラベクトルを求める | // カメラベクトルを求める | ||
float3 cameraVector = normalize(worldPosition.xyz - | float3 cameraVector = normalize(worldPosition.xyz - CameraPosition.xyz); | ||
// ハーフベクトルを求める | // ハーフベクトルを求める | ||
vsout.HalfVector = normalize( | vsout.HalfVector = normalize(LightDirection.xyz + cameraVector.xyz); | ||
return vsout; | return vsout; | ||
} | } | ||
</source> | </source> | ||
==関連項目== | ==関連項目== | ||
* [[シェーダー]] | * [[シェーダー]] | ||
* [[フラットシェーディング]] | * [[フラットシェーディング]] | ||
| 39行目: | 49行目: | ||
** [[スペキュラー・ライティング]] | ** [[スペキュラー・ライティング]] | ||
* [[ブリン・フォン反射モデル]] | * [[ブリン・フォン反射モデル]] | ||
[[category: 3DCG]] | |||