NDC空间(归一化的设备坐标空间)整理记录

- 在齐次裁剪空间的基础上进行透视除法(perspective division)或称齐次除法(homogeneous division),得到的坐标叫做NDC空间坐标。

补充渲染流水线:

模型数据-顶点着色 - 曲面细分 - 几何着色器 - 裁剪 - NDC空间 - 屏幕空间 - 光栅阶段 - 帧缓存

其中曲面细分和几何着色器是可选项,而从裁剪空间---NDC空间---屏幕空间一般由底层帮我们自动完成。我们的顶点着色器只需要把顶点转换到齐次裁剪空间就可(就是一般所说的输出的positionCS)空间。

透视除法:就是将齐次裁剪空间坐标positionCS的X,Y,Z分量都除以W分量。

我们假设在NDC空间中,经过透视除法后的点为:

,那么x’,y’,z’的取值范围则在【-1,1】区间内。反推会齐次裁剪空间的公式:

NDC空间到屏幕空间:顶点着色器我们的输出在齐次裁剪,那么片段着色器的输入是什么呢?不是齐次裁剪空间,也不是NDC空间,而是屏幕空间。

在Unity中屏幕左下角像素坐标为(0,0),右上角像素坐标为(pixelWidth,pixelHeight),由于当前x,y的坐标范围为【-1,1】,因此是一个缩放的过程,可以用下面公式变换:

ScreenX = NDCx * pixelWidth/2 + pixelWidth/2;

ScreenY = NDCy * pixelWidth/2 + pixelWidth/2;

ScreenZ的值通常为Clipz/Clipw,存入深度缓冲,但也不是必须。

注意上面所说的屏幕空间和使用unity内置函数o.screenPos = ComputeScreenPos(o.vertex)不同,内置函数直接从齐次裁剪空间转换,没有经过透视除法转换到NDC空间的过程,所以如果使用内置函数,需要自己在片段着色器中不上透视除法。

如果需要从屏幕空间转换到NDC空间,可以使用内置函数ComputeScreenPos(o.vertex),求得ScreenPos后进行下面公式转换:

float4 ndcPos = (o.screenPos / o.screenPos.w) * 2 - 1;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值