「ハーフベクトル」の版間の差分
ナビゲーションに移動
検索に移動
Administrator (トーク | 投稿記録) |
Administrator (トーク | 投稿記録) |
||
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; | ||
27行目: | 35行目: | ||
return vsout; | return vsout; | ||
} | } | ||
− | </source> | + | </source> |
+ | |||
==関連項目== | ==関連項目== | ||
− | |||
* [[シェーダー]] | * [[シェーダー]] | ||
* [[フラットシェーディング]] | * [[フラットシェーディング]] | ||
39行目: | 47行目: | ||
** [[スペキュラー・ライティング]] | ** [[スペキュラー・ライティング]] | ||
* [[ブリン・フォン反射モデル]] | * [[ブリン・フォン反射モデル]] | ||
+ | |||
+ | [[category: 3DCG]] |
2020年4月28日 (火) 03:48時点における版
ハーフベクトル(英語:half vector)とは、2つのベクトルを足したものである。 ベクトルとベクトルを足すとその中間(ハーフ)の方向を向いたベクトルになる。
この特性を利用して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;
}