opengl 中的透视除法和NDC

归一化设备坐标
OpenGL的坐标空间是[-1, 1],x,y轴超过该区域的都将被切掉 看不见。
viewport像素是 1280 X 720,归一化后坐标空间从[1280X720],映射到[-1,1]

问题:导致物体变形,因为 x,y轴坐标长度都是1 - (-1)= 2,但x,y轴像素数量不同。y轴像素少,单位坐标就会变长。
办法:设短的轴映射为1,长的轴根据与短轴的比例 映射。[0, 1280] ,[0, 720]--->[-1280/720 , 1280/720],[-1, 1]。这个空间被称作虚拟坐标空间。

OpenGL最终的渲染设备是2D的,我们需要将3D表示的场景转换为最终的2D形式,前面使用模型变换和视变换将物体坐标转换到照相机坐标系后,需要进行投影变换,将坐标从相机—》裁剪坐标系,经过透视除法后,变换到规范化设备坐标系(NDC),最后进行视口变换后,3D坐标才变换到屏幕上的2D坐标,这个过程如下图所示:

在光栅化阶段会做透视分割(或透视除法,即除以第四个分量)。

W 分量是投影仪到屏幕的距离。

在3D计算机图形学中,透视是通过投影矩阵变换,改变每一个向量中 W 分量的值来实现透视的。

透视除法只是将齐次坐标中的 W 分量转换为1的专用名词。

扫描二维码关注公众号,回复: 8965996 查看本文章

这里需要注意以下,对于attribute类型的属性量。OpenGL会用默认的值替换属性中未指定的分量,前三个分量会被设定为0,最后一个分量w会被设定为1.

图元装配阶段,它实际上做了以下几件事:剪裁坐标、透视分割、视口变换(视变换是将NDC坐标转换为显示屏幕坐标的过程,使用线性映射)。图元装配的输入是顶点着色器的输出,是物体坐标gl_Position,之后到光栅化阶段。

站在gl_position的角度来说,[-w,w]之间的坐标点才是可见的,否则都是不可见会被剪裁掉。往前看,在做投影变换的时候我们说,在视景体内的物体有效,视景体外的会被剪裁,实际上是对应的,剪裁就是发生在图元装配阶段判断所有的坐标是否在[-w,w]之间。

剪裁实际上就是判断每一个最小三角形、直线、点单元的坐标是否规范。

透视除法

对上面的剪裁坐标的点的x、y、z坐标除以它的w分量,除以w的坐标叫做归一化设备坐标。如果w分量大,除以w后的点就接近(0,0,0),在三维空间中,距离我们较远的坐标如果它的w分量较大,进行透视除法后,就距离原点越近,原点作为远处物体的消失点,就有三维场景的效果。

发布了46 篇原创文章 · 获赞 74 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/u010977122/article/details/103244051