「ハーフベクトル」の版間の差分

ページの作成:「'''ハーフベクトル'''(英語:half vector)とは、3DCGにおいて物体表面(頂点またはピクセル)の位置からみて、視点…」
 
 
(同じ利用者による、間の2版が非表示)
1行目: 1行目:
'''ハーフベクトル'''([[英語]]:half vector)とは、[[3DCG]]において物体表面([[頂点]]または[[ピクセル]])の位置からみて、視点と光源の中間のことである。
'''ハーフベクトル'''([[英語]]: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 - cameraPosition.xyz);
     float3 cameraVector  = normalize(worldPosition.xyz - CameraPosition.xyz);


     // ハーフベクトルを求める
     // ハーフベクトルを求める
     vsout.HalfVector    = normalize(LightPosition.xyz + cameraVector.xyz);
     vsout.HalfVector    = normalize(LightDirection.xyz + cameraVector.xyz);
      
      
     return vsout;
     return vsout;
}
}
</source>ハーフベクトルは[[鏡面反射]]の強さを表現する際に使われる値であり、 鏡面反射はハーフベクトルと[[法線]]([[ノーマル]])が一致した際に最大値となる。
</source>
 
==関連項目==
==関連項目==
* [[シェーダー]]
* [[シェーダー]]
* [[フラットシェーディング]]
* [[フラットシェーディング]]
39行目: 49行目:
** [[スペキュラー・ライティング]]
** [[スペキュラー・ライティング]]
* [[ブリン・フォン反射モデル‎]]
* [[ブリン・フォン反射モデル‎]]
[[category: 3DCG]]