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的专用名词。

 

这里需要注意以下,对于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分量较大,进行透视除法后,就距离原点越近,原点作为远处物体的消失点,就有三维场景的效果。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章