ハーフベクトル

提供: MonoBook
2020年4月28日 (火) 03:42時点におけるAdministrator (トーク | 投稿記録)による版 (ページの作成:「'''ハーフベクトル'''(英語:half vector)とは、3DCGにおいて物体表面(頂点またはピクセル)の位置からみて、視点…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

ハーフベクトル英語:half vector)とは、3DCGにおいて物体表面(頂点またはピクセル)の位置からみて、視点と光源の中間のことである。


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

float4x4 World;

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(LightPosition.xyz + cameraVector.xyz);
    
    return vsout;
}

ハーフベクトルは鏡面反射の強さを表現する際に使われる値であり、 鏡面反射はハーフベクトルと法線ノーマル)が一致した際に最大値となる。

関連項目