我正在研究渲染管道,当我进入剪辑阶段时,它解释了从视图(眼睛或相机)空间我们必须传递到剪辑空间的 ,也称为归一化设备空间(NDC),即从-1到1的立方空间。
然而,现在我不明白从这个空间到屏幕坐标空间的通道何时发生:
剪辑后和光栅化之前?
光栅化后和剪刀和z测试之前?
在写入帧缓冲区之前的最后?
答案 0 :(得分:44)
剪辑空间实际上距离NDC一步,所有坐标除以Clip.W
以产生NDC。在得到的NDC空间中,[ -1 , 1 ]范围之外的任何内容都对应于裁剪体积之外的点。 NDC之前的坐标空间被称为剪辑空间是有原因的;)
然而,严格地说,NDC空间不一定是立方的。确实,NDC空间是OpenGL中的一个多维数据集,但在Direct3D中它不是。在D3D中,NDC空间中的Z坐标范围从 0.0 到 1.0 ,而范围从 -1.0 到 1.0 在GL。 X和Y在GL和D3D中表现相同(即,它们的范围从 -1.0 到 1.0 )。 NDC是标准坐标空间,但它在不同的API中具有不同的表示。
最后,在光栅化过程中会出现NDC空间到屏幕空间(AKA窗口空间),并由视口和深度范围定义。片段位置在任何其他坐标空间中都没有意义,这就是光栅化产生的结果: 片段 。
在OpenGL 4.5中引入,扩展名GL_ARB_clip_control
允许您在GL中采用D3D的NDC约定。
glClipControl (GL_LOWER_LEFT, GL_NEGATIVE_ONE_TO_ONE);
glClipControl (GL_UPPER_LEFT, GL_ZERO_TO_ONE); // Y-axis is inverted in D3D
答案 1 :(得分:10)
剪辑空间和NDC(规范化设备坐标)不是一回事,否则它们将没有不同的名称。
剪辑空间是投影矩阵在点变换之后但在w
归一化之前空间点所在的位置。
NDC空间是w
规范化后的空间点。
Camera space -->
x projection matrix --->
Clip space (before normalisation) --->
Clipping --->
Normalisation by w (x/w, y/w, z/w) --->
NDC space (in the range [-1, 1] in x and y)
答案 2 :(得分:1)
显然,据Apple称,剪辑空间与NDC相同。
https://developer.apple.com/documentation/metal/hello_triangle
引用:
“顶点函数(也称为顶点着色器)的主要任务是处理传入的顶点数据并将每个顶点映射到视口中的一个位置。这样,管道中的后续阶段可以引用此视口位置并将像素渲染到drawable中的精确位置。顶点函数通过将任意顶点坐标转换为规范化设备坐标(也称为剪辑空间坐标)来完成此任务。“
示例代码中的评论的另一个引用:
“每个顶点着色器的输出位置都在剪辑空间中(也称为规范化设备坐标空间或NDC)。”
也许这是因为教程是二维的?误导性陈述..
答案 3 :(得分:0)
NDC空间是剪辑空间,NDC空间到窗口空间是由硬件完成的,发生在NDC之后和光栅化之前。
有用于设置宽度和高度的API,默认值与窗口大小相同。
// metal
func setViewport(_ viewport: MTLViewport)
// OpenGL
void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
OpenGL的NDC空间,xyz范围[-1,1]。对于金属,Z为0到1
NDC空间通常是左手系统。
答案 4 :(得分:0)
您可以考虑从剪辑空间(每个轴上的 -1 到 +1,对于图像内的任何内容)到屏幕坐标的过渡,也称为视口空间(0 到 X 中的 ResX,0 到 Y 中的 rexY,以及 0到 Z 中的 1,也就是深度),发生在 光栅化之前,在顶点处理器之后。
当您编写顶点着色器时,您输出的是顶点在剪辑空间中的投影位置,但在片段着色器中,每个片段都有自己的屏幕坐标和深度。
Clip Space,顾名思义,是一个空间,即一个参考系,一个坐标系,即你使用的一个特定的原点和一组三个轴的选择指定点和向量。
它的原点在剪辑体积的中间,它的三个轴按照 API 的规定对齐。例如,这个空间的笛卡尔坐标(+1,0,0)的点出现在图像的右端,而笛卡尔坐标(-1,0,0)的点出现在左边。
NDC(标准化设备坐标),顾名思义,是一组坐标:它们是剪辑空间中一个点的三个笛卡尔坐标。例如,在齐次坐标(3,0,0,3)的裁剪空间中取一个点,你也可以表示为(30,0,0,30),还有很多其他的方式,它有笛卡尔坐标( 1,0,0):它的 NDC 是 (1,0,0)。