opengl 对投影矩阵、透视分割、NDC和视口变换的理解

i2byvkas  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(289)

我对投影矩阵是如何工作的感到很困惑,所以我研究了一下,我发现了一些其他的东西,但研究了几天后,“我只是想确认一下自己的理解是不是正确的,可能用错了几个术语,但写了这篇文章之后,我的大脑已经透支了。还有几个问题,我只是简单研究了一下,比如屏幕坐标、窗口变换之类的,所以写得不多,可能是我的知识有误。”我在这里写的每件事都是正确的还是大部分正确的?如果我错了,请纠正我。

投影矩阵的作用是什么?

所以透视投影矩阵定义了一个截头棱锥体。任何超出这个截头棱锥体/截头棱锥体范围的东西都将被剪切。我将在后面详细介绍。透视投影矩阵还添加了透视。为了使顶点遵循透视规则,透视投影矩阵处理顶点的w分量(同质分量),这取决于顶点离观察者有多远(顶点越远,w坐标将增加得越高)。

为什么以及如何利用w组件使世界看起来更有洞察力?

w分量使世界看起来更有感觉,因为在透视分割中(透视分割发生在顶点后处理阶段),当x、y和z除以w分量时,顶点坐标将根据w分量的大小而缩放得更小。因此,本质上,对象越远,w分量就将对象缩放得越小。
示例:
顶点位置(1,1,2,2)。
在透视除法中,x、y和z将被除以2,因为2是w分量。
(1/2,1/2,2/2)=(0.5,0.5,1)。
如此处所示,顶点坐标已缩放一半。

投影矩阵如何决定要裁剪的内容?

近平面和远平面是观察者可以看到的范围(远平面之外和近平面之前的任何东西都将被裁剪)。任何坐标也必须经过裁剪检查,以确定是否必须裁剪。裁剪检查是检查顶点坐标是否在-w到w的视锥范围内。如果它在该范围之外,则将被裁剪。
假设我有一个位置为(2,130,90,90)的顶点。
x值为2
y值为130
z值为90
w值为90
此折点必须在-90到90的范围内。x和z值在此范围内,但y值超出此范围,因此将裁剪折点。
顶点着色器完成后,下一步是顶点后处理。在顶点后处理中,会发生剪切,也会发生透视分割,将剪切空间转换为NDC(归一化设备坐标)。同样,会发生视口变换,将NDC转换为窗口空间。

透视除法的作用是什么?

透视分割实质上是将顶点的x、y和z分量与w分量分开。这样做实际上做了两件事,将剪辑空间转换为标准化设备坐标,并通过缩放顶点来添加透视。

**什么是标准化设备坐标?**标准化设备坐标是将所有坐标压缩到NDC框中的坐标系,其中每个轴都在-1到+1的范围内。

在NDC发生后,视口转换发生,所有的NDC坐标转换为屏幕坐标。NDC空间将成为窗口空间。
如果NDC坐标为(0.5,0.5,0.3),则将根据程序员在函数glViewport中提供的内容将其Map到窗口上。如果视口为400 x300,则NDC坐标将位于x轴上的像素200处和y轴上的像素150处。

bmvo0sr5

bmvo0sr51#

透视投影矩阵并不决定裁剪什么,用投影变换一个世界坐标后,得到一个裁剪空间坐标,这是一个Homogeneous coordinatesRendering Pipeline根据这个坐标对场景进行裁剪,裁剪规则是 -w〈x,y,z〈w,在下面的渲染流水线过程中,剪辑空间坐标通过透视除法被变换到归一化的设备空间中。(x,y,z)' =(x/w,y/w,z/w)*。除以 w 分量可产生透视效果。(另请参阅"眼睛空间坐标“和"变换模型矩阵”)

相关问题