Vulkan 1.4.335 - A Specification (with all registered extensions) の中の座標系に関する部分をつまみ食いする。
パイプラインの一連の流れは「10. Pipelines」に書かれている。 パイプライン上の各シェーダはざっくり下のように構造化される:
プリミティブ処理
Primitive Shading
Vertex Shader
Tessellation Control Shader (optimal)
Tessellation Evaluation Shader (optimal)
Geometry Shader (optimal)
Mesh Shading
Task Shader (optimal)
Mesh Shader
フラグメント処理
Fragment Shader
頂点処理終了時点の座標系はclip座標系である。 Clip座標系は3+1次元の同次座標系。 Clip座標を
と表すと、view volumeは
という制約に則る空間である(ただし、はVulkanの拡張でにもできるが普通は0)。
さらに、このview volumeとユーザによって与えられたCullDistanceとの共通空間をclip volumeと言う。
このclip volume外のプリミティブは以降の処理で無視される[29.4. Primitive Clipping]。
ClipされたプリミティブはNDCに変換される。 NDCの座標は
である[29.7. Coordinate Transform]。
NDCは次のようにframebuffer coordinates と深度に変換される(ビューポート変換):
ただし、vk::Viewport(x, y, width, height, minDepth, maxDepth)としたとき、
である[29.9. Controlling the Viewport]。
ここで注意すべきことは:
Framebuffer coordinatesと深度はそれぞれフレームバッファ上のレンダーターゲットであるカラーバッファとデプスバッファである
テクスチャの座標系が左上原点であることに注意すると、このビューポート変換によって上下が逆転する
上下逆転を嫌う場合、heightを負の数にすると、上下逆転を実現できる(適切にyも指定する) [29.9. Controlling the Viewport]
minDepthよりmaxDepthを大きくすることで深度値も逆転できる
また、31.10. Depth Testによると、がに収まらない場合、次のようになる:
depthClampEnableが有効化されている場合→外であってもその通りにクランプされる
depthClampEnableが有効化されていない場合:
depthClampZeroOneが有効化されている場合:
浮動小数点深度バッファを使っている場合→外であってもそのまま
浮動小数点深度バッファを使っていない場合→にクランプされる
depthClampZeroOneが有効化されていない場合→未定義動作
■