谁能给我解释一下,为了从物体空间坐标生成NDC,需要执行哪些步骤?
float vertices[] = {
-2.0f, -12.0f,
2.0f, -12.0f,
-2.0f, 12.0f,
2.0f, 12.0f
};这是我的mvp矩阵:
float MVP[16] = {
0.993, 0.054, -0.102, -0.102,
0.007, 0.852, 0.524, 0.524,
-0.115, 0.521, -0.846, -0.846,
0.575, -2.604, 4.061, 4.260 };根据我的计算,我得到:
X、Y、Z、W:
0.824918 7.111959 1.110172 1.000000
-1.111003 5.714332 1.090060 1.000000
-0.123152 0.698949 0.981588 1.000000
0.256286 0.747339 0.980855 1.000000但这些都是错误的。我的意思是,如果我这样做了:
vec4 vert = mvp * vec4(inPos.x,inPos.y,0,1);
vert.xyzw/=vert.w;
gl_Position = vert;在VS中,我得到不同的o/p,如:
vec4 vert = mvp * vec4(inPos.x,inPos.y,0,1);
gl_Position = vert;发布于 2016-03-03 03:28:57
首先,我不能准确地复制你得到的数字。也许你对问题中的矩阵元素进行了舍入。我得到的值是:
V0: [0.819627 7.09211 1.1091 1]
V1: [-1.10977 5.69893 1.08916 1]
V2: [-0.123419 0.698661 0.981492 1]
V3: [0.255704 0.7471 0.980762 1]然而,问题是另一回事。当您查看这些点的剪辑空间坐标时,您会得到以下结果:
V0: [-1.495 -12.936 -2.023 -1.824]
V1: [2.477 -12.72 -2.431 -2.232]
V2: [-1.327 7.512 10.553 10.752]
V3: [2.645 7.728 10.145 10.344]注意几件事:观看音量受剪辑空间中的不等式-w <= x,y,z <= w的限制。V0和V1的坐标不满足该不等式。因此,这些点位于视图锥体之外。通常,GL将裁剪部分位于观看体积内部和外部的基元。
然而,剪辑本身并不是这里的问题。请注意,V0和V1的w组件实际上是负的。这意味着这些点位于投影中心(=虚拟相机)的后面。通过将它们除以w,可以将这些点镜像回到相机前面。相机后面的点的NDC坐标被镜像到x,y和z中,在这种情况下,跳过裁剪步骤将导致完全错误的基元。
GL永远不会有这个问题,因为裁剪将在分割完成之前在裁剪空间中完成。如果您想要有意义的NDC坐标,您还必须实现自己的裁剪。但是,这很难在顶点着色器中完成(除非正在绘制的所有点都是单独的点)。对于直线或三角形基本体,您需要所有顶点的数据来计算基本体边和剪裁平面之间的交点,并且可能需要动态创建新的基本体。
这也意味着位于投影中心后面的点没有任何有意义的NDC坐标。例如,考虑一个三角形,其中两个顶点位于相机前面,恰好在视图体积内,第三个顶点位于相机后面。裁剪将在从第三个点到其他点的每条边上创建一个新点(并将生成两个三角形来替换原始三角形)。这两个新点确实有有意义的NDC坐标,但第三个原始点从来没有-并且第三个输入点和新创建的点之间也没有1:1的映射。
https://stackoverflow.com/questions/35755263
复制相似问题