如果在OpenGL管道中的光栅化阶段发生线性插值,并且顶点已经转换为屏幕空间,那么用于透视正确插值的深度信息来自何处?
任何人都可以详细描述OpenGL如何从屏幕空间原语转换为具有正确插值的片段?
opengl projection linear-interpolation fragment-shader pixel-shading
根据数量来源,NDC与剪辑空间的不同之处在于NDC仅仅是由W分量划分后的剪辑空间.基本体被剪切在剪辑空间中,在OpenGL中沿X,Y和Z轴为-1到1(编辑:这是错误的,请参阅答案).换句话说,剪辑空间是一个立方体.剪切在此立方体内完成.如果它落在里面,它是可见的,如果它落在外面,它是不可见的.
因此,让我们以这个简单的例子为例,我们从俯视图中俯视观察平截头体,沿负Y轴向下看.HALFFOV是45度,这意味着NEAR和RIGHT都是相同的(在这种情况下长度为2).示例点是(6,0,-7).
现在,这是透视投影矩阵:
为简单起见,我们将使用1:1的宽高比.所以:
RIGHT = 2
LEFT = -2
TOP = 2
BOTTOM = -2
NEAR = 2
FAR = 8
Run Code Online (Sandbox Code Playgroud)
因此,填写我们的值,我们得到一个投影矩阵:
现在我们将同质W添加到我们的点,即(6,0,-7),得到get(6,0,-7,1).
现在我们将矩阵与我们的点相乘,得到(6,0,2.29,7).现在这一点(乘以投影矩阵之后的点,应该位于"剪辑空间".据说剪裁是在这个阶段完成的,弄清楚一个点是位于裁剪立方体的内部还是外部,并且据说是在分割之前与W.这是它在"剪辑空间"中的样子:
从我看到的剪辑源是在这个阶段完成,如上所示,在除以W之前.如果你除以W NOW,该点最终在剪辑空间立方体的右侧区域.这就是为什么我不明白为什么每个人都说透视划分在裁剪空间之后完成的原因.在这个空间中,在透视分割之前,该点完全位于外部并且将被判断为在剪切空间之外,并且不可见.然而,在透视划分后,除以W,这是它的外观:
现在这一点位于剪辑空间立方体内,可以判断为内部和可见.这就是为什么我认为透视分割是在剪切之前完成的,因为如果裁剪空间在每个轴的-1到+1中,并且裁剪阶段检查这些尺寸,对于一个点在这个立方体内,它必须已经经过分割通过W,否则几乎任何一点都位于裁剪空间立方体之外并且永远不可见.
那么为什么每个人都说首先是剪辑空间,这是投影矩阵的结果,而且只有透视划分(除以W)导致NDC?
gl_Position的w分量是否需要大于零?因为当我将其设置为负数时,不会绘制任何内容,但正数是正常的.
gl_Position = vec4(vPos,0,-1);
Run Code Online (Sandbox Code Playgroud)
面部剔除没有启用顺便说一句.