web-dev-qa-db-ja.com

OpenGL頂点シェーダーでは、wとは何ですか?なぜそれで除算するのですか?

void main(void)
{
  vec4 clipCoord = glModelViewProjectionmatrix * gl_Vertex;
  gl_Position = clipCoord;

  gl_FrontColor = gl_Color;

  vec3 ndc = clipCoord.xyz / clipCoord.w;

したがって、clipCoordは標準の固定パイプライン変換を実行しているだけです。 wで除算するのはなぜですか?これで何が得られますか?

42
anon

Wは、3次元の頂点の4番目の座標です。この頂点は、同次頂点座標と呼ばれます。

簡単に言うと、Wコンポーネントは他のベクトルコンポーネントを分割する要素です。 Wが1.0の場合、同種の頂点座標は「正規化」されます。 2つの頂点を比較するには、W値を1.0に正規化する必要があります。

頂点(1,1,1,1)について考えてください。次に、W値を増やします(w> 1.0)。正規化された位置はスケーリングです!そして、それは起源に行きます。頂点(1,1,1,1)について考えてください。次に、W値を減らします(W <1.0)。正規化された位置は無限点になります。

頂点座標のスケーリングとは別に、4x4行列(モデルビューや投影行列)に4x1行列(頂点)を乗算する必要があるため、W座標が必要です。

もちろん、レッドブックは明確なガイドです。

Red Book付録

44
Luca