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

提供: MonoBook
ナビゲーションに移動 検索に移動
(ページの作成:「'''ハーフベクトル'''(英語: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]]

2020年4月28日 (火) 03:51時点における最新版

ハーフベクトル英語:half vector)とは、2つのベクトルを足したものである。 ベクトルとベクトルを足すとその中間(ハーフ)の方向を向いたベクトルになる。

この特性を利用して3DCGにおいては物体表面(頂点またはピクセル)の位置からみて、視点と光源の中間方向(ハーフベクトル)を求めるのに使われる。

鏡面反射はハーフベクトルと法線ベクトルが一致した際に最大値となる。

算出[編集 | ソースを編集]

2個のベクトルを足し算するとその中間のベクトルが得られるので、 ハーフベクトルを求めるには物体表面(頂点またはピクセル)の位置を基準とした「視点」と「光源」のベクトルを足し合わせればよい。 また、光の強さは0.0~1.0の範囲で表すのが一般的なので、その範囲になるよう正規化(normalize)しておく。

頂点シェーダーでの実装例(超抜粋)。

float4x4 World;
float3 LightDirection;
float3 CameraPosition;

struct VSIn {
    float4 Position: POSITION;
}

struct VSOut {
    float3 HalfVector: TEXCOORD2;
}

VSOut VSMain(VSIn vsin) {
    VSOut vsout = (VSOut)0;

    // 頂点座標をワールド座標に変換
    float4 worldPosition = mul(vertex.Position, World);
    
    // カメラベクトルを求める
    float3 cameraVector  = normalize(worldPosition.xyz - CameraPosition.xyz);

    // ハーフベクトルを求める
    vsout.HalfVector    = normalize(LightDirection.xyz + cameraVector.xyz);
    
    return vsout;
}

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