Vulkanの座標系
Vulkan 1.4.335 - A Specification (with all registered extensions)
の中の座標系に関する部分をつまみ食いする。
プリミティブ処理終了時点の座標系はclip座標系である。
Clip座標系は3+1次元の同次座標系。
Clip座標を
xcyczcwcと表すと、view volumeは
−wc≤xc≤wc−wc≤yc≤wczm≤zc≤wcという制約に則る空間である(ただし、zmはVulkanの拡張で−wcにもできるが普通は0)。
さらに、このview volumeとユーザによって与えられたCullDistanceとの共通空間をclip volumeと言う。
このclip volume外のプリミティブは以降の処理で無視される[29.4. Primitive Clipping]。
ClipされたプリミティブはNDCに変換される。
NDCの座標は
xdydzd=xc/wcyc/wczc/wcである[29.7. Coordinate Transform]。
NDCは次のようにframebuffer coordinates (xf,yf)と深度zfに変換される(ビューポート変換):
xf=2pxxd+oxyf=2pyyd+oyzf=pzzd+ozただし、vk::Viewport(x, y, width, height, minDepth, maxDepth)としたとき、
oxoyozpxpypz=x+2width=y+2height={minDepth2minDepth+maxDepthif zm=0,otherwise.=width=height={maxDepth−minDepth2maxDepth−minDepthif zm=0,otherwise.である[29.9. Controlling the Viewport]。
ここで注意すべきことは:
Framebuffer coordinatesと深度はそれぞれフレームバッファ上のレンダーターゲットであるカラーバッファとデプスバッファである
テクスチャの座標系が左上原点(0,0)であることに注意すると、このビューポート変換によって上下が逆転する
上下逆転を嫌う場合、heightを負の数にすると、上下逆転を実現できる(適切にyも指定する) [29.9. Controlling the Viewport]
minDepthよりmaxDepthを大きくすることで深度値も逆転できる
また、31.10. Depth Testによると、zfが[0,1]に収まらない場合、次のようになる:
depthClampEnableが有効化されている場合→[0,1]外であってもその通りにクランプされる
depthClampEnableが有効化されていない場合:
■