欢迎光临散文网 会员登陆 & 注册

Unity Shader 各个空间坐标的获取方式及xyzw含义

2023-06-09 15:38 作者:Lucas_dudu  | 我要投稿

一、对象/模型空间 OS(Object/Model Space):float4

  • 定义:以模型(通常为模型的重心)为原点的空间,一般默认物体前方为z轴,右边为x轴,上方为y轴。

  • posOS.xyzw含义

    • x[-精度范围上限,精度范围上限]:本地坐标x值。

    • y[-精度范围上限,精度范围上限]:本地坐标y值。

    • z[-精度范围上限,精度范围上限]:本地坐标z值。

    • w[0,1]:如果有位移变换的话,需要将坐标转换至齐次坐标系下,因此w值为1,否则一般为0,不清楚怎么用的话直接写1.0。

  • 求posOS

二、世界空间 WS(World Space):float4

  • 定义:一般来说世界空间就是游戏空间,其原点放置在游戏空间的中心。

  • posWS.xyzw含义

    • x[-精度范围上限,精度范围上限]:世界坐标x值。

    • y[-精度范围上限,精度范围上限]:世界坐标y值。

    • z[-精度范围上限,精度范围上限]:世界坐标z值。

    • w[0,1]:如果有位移变换的话,需要将坐标转换至齐次坐标系下,因此w值为1,否则一般为0,不清楚怎么用的话直接写1.0。

  • 求posWS

三、观察空间 VS(View Space):float4

  • 定义:以相机为原点的坐标空间。(ps:观察空间与屏幕空间不一样,观察空间是一个三维空间,屏幕空间是二维空间)。

  • posVS.xyzw含义

    • x[-精度范围上限,精度范围上限]:观察空间坐标x值。

    • y[-精度范围上限,精度范围上限]:观察空间坐标y值。

    • z[-精度范围上限,精度范围上限]:观察空间坐标z值。

    • w[0,1]:如果有位移变换的话,需要将坐标转换至齐次坐标系下,因此w值为1,否则一般为0,不清楚怎么用的话直接写1.0。

  • 求posVS

四、裁剪空间 CS(Clip Space):float4

  • 定义:与投影矩阵计算后也被称为齐次裁剪空间(HCS Homogeneous Clip Space),这个用于变换的矩阵叫做裁剪矩阵(Clip Matrix),也被称为投影矩阵(Projection Matrix)。

  • 透视投影posCS.xyzw含义

    • x[-w , w]:裁剪空间下x轴坐标。

    • y[-w , w]:裁剪空间下x轴坐标。

    • z[-w, w]:裁剪空间下z轴坐标,离相机越远z值越大。

    • w[Near, Far]:用来判断坐标是否在视锥体外部,-w<= x/y/z <= w 的话则点在视锥体内部。


  • x[-1 , 1]:裁剪空间下x轴坐标。

  • y[-1 , 1]:裁剪空间下x轴坐标。

  • z[-1, 1]:裁剪空间下z轴坐标,离相机越远z值越大。

  • w[1]:用来判断坐标是否在视锥体外部,-w<= x/y/z <= w 的话则点在视锥体内部。

  • 求posCS

五、归一化设备坐标 NDC(Normalized Device Coordinates):float4

  • 定义:用齐次坐标系的w分量去除以x、y、z分量。

  • 透视投影posNDC.xyzw含义

    • x[-1 , 1]:NDC空间x坐标。

    • y[-1 , 1]:NDC空间y坐标。

    • z[-w, w]:posNDC.z == posCS.z。

    • w[Near, Far]:posNDC.w == posCS.w。


  • 正交投影posNDC.xyzw含义

    • x[-1 , 1]:NDC空间x坐标。

    • y[-1 , 1]:NDC空间y坐标。

    • z[-1, 1]:posNDC.z == posCS.z。

    • w[1]:posNDC.w == posCS.w。

  • 求posNDC

六、屏幕空间 SS(Screen Space):float2

  • 定义:当裁剪工作完毕后,就需要进行真正的投影,也就是说需要把视锥体投影到屏幕空间(Screen Space)。经过这一步变换就会得到真正的像素位置,而不是虚拟的三维坐标。

  • posSS.xyzw含义

    • x[0, ScreenPixelWidth]:屏幕x轴坐标。

    • y[0, ScreenPixelWidth]:屏幕y轴坐标。

    • z、w:posSS.zw == posCS.zw,具体查看ComputeScreenPos()方法

    • 通常z分量会被用于深度缓冲。 一个传统方式是把ClipzClipw的值直接存入深度缓存中,但这并不是必须的。通常驱动厂商会根据硬件来选择最好的存储格式。 Clipw 也并不会被抛弃,它在后续的工作中会起到重要的作用,例如进行透视校正差值。

  • 求posSS

七、视口空间 VP(ViewPort Space):float2

  • 定义:屏幕空间除以屏幕分辨率得到的就是视口空间(viewport space)中的坐标。

  • posVP.xy含义:

    • x[0, 1]:归一化后的屏幕X坐标,左下角为0,右上角为1。

    • y[0, 1]:归一化后的屏幕Y坐标,左下角为0,右上角为1。

  • 求取视口空间中的坐标 VPPos(View Port Position)

    • 方式一:就是把屏幕坐标归一化,这样屏幕左下角就是(0,0),右上角就是(1,1)。如果已知屏幕坐标的话,只需要把xy值除以屏幕分辨率即可。

  • VPOS.xyzw含义(注意是输入语义VPOS的xyzw含义)

    • x[0, ScreenParamsX):屏幕空间中像素x坐标。(ps: 屏幕像素可以在_ProjectionParams中拿到)

    • y[0, ScreenParamsY):屏幕空间中像素y坐标。

    • z[0, 1]:在摄像机的近裁剪平面处,z值为0,在远裁剪平面处,z值为1。

    • w[ 1Near,1Far ]:Near、Far对应了Camera组件中设置的近裁剪平面和远裁剪平面距离相机的远近;如果使用的是正交投影,那么w分量的值恒为1。(ps: Near、Far可以在_ProjectionParams中拿到)

  • 方式二:通过Unity提供的ComputeScreenPos函数,首先在顶点着色器计算结果,然后在片元着色器进行一个齐次除法运算即可得到视口空间下的坐标。


引用:《Unity Shader入门精要》learnopengl-cn 坐标系统

https://learnopenglcn.readthedocs.io/zh/latest/01%20Getting%20started/08%20Coordinate%20Systems/

https://zhuanlan.zhihu.com/p/505030222

Unity Shader 各个空间坐标的获取方式及xyzw含义的评论 (共 条)

分享到微博请遵守国家法律