gl_fragcoord

gl-fragcoord.png

原点は画面左下。gl_FragCoord.xyはウィンドウ座標になっている。

zには何が入っているのか?

デプス値が入っている。
近いほど小さい値、遠いほど大きい値である。
値の範囲はデフォルトで0.0-1.0(near to far)
glDepthRangef関数でデプスの範囲は変えることができる。
gl_FragCoord.w1 / clip.wと同じである。
where clip.w is the W component of the クリップ座標における値である。
クリップ座標のxyzを各々wで割ると、正規化デバイス座標になる

gl_FragCoord.z は以下のようにして算出されている。通常の座標変換と同じ過程である。

Camera-space to clip-space transform, via projection matrix multiplication in the vertex shader.

 clip.z = (projectionMatrix * cameraPosition).z

正規化デバイス座標に変換する
ndc.z = clip.z / clip.w

Transform to window coordinates, using the glDepthRange
near/far values.
 win.z = ((dfar-dnear)/2) * ndc.z + (dfar+dnear)/2.

Now, using the default depth range of near=0, far=1, we can define win.z in terms of clip-space:
(clip.z/clip.w)/2 + 0.5.
If we then divide this by gl_FragCoord.w,
that is the equivalent of multiplying by clip.w, thus giving us:
(gl_FragCoord.z / gl_FragCoord.w) = clip.z/2 + clip.w/2 = (clip.z + clip.w) / 2

Using the standard projection matrix, clip.z represents a scale and offset from camera-space Z component. The scale and offset are defined by the camera's near/far depth values. clip.w is, again in the standard projection matrix, just the negation of the camera-space Z. Therefore, we can redefine our equation in those terms:
(gl_FragCoord.z / gl_FragCoord.w) = (A * cam.z + B -cam.z)/2 = (C * cam.z + D)

Where A and B represent the offset and scale based on near/far, and C = (A - 1)/2 and D = B / 2.

window-coordinate

サポートサイト Wikidot.com window-coordinate