首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从物体空间坐标生成NDC

从物体空间坐标生成NDC
EN

Stack Overflow用户
提问于 2016-03-03 02:27:07
回答 1查看 306关注 0票数 0

谁能给我解释一下,为了从物体空间坐标生成NDC,需要执行哪些步骤?

代码语言:javascript
复制
    float vertices[] = {
 -2.0f, -12.0f,
 2.0f, -12.0f,
-2.0f, 12.0f, 
 2.0f, 12.0f
    };

这是我的mvp矩阵:

代码语言:javascript
复制
        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:

代码语言:javascript
复制
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

但这些都是错误的。我的意思是,如果我这样做了:

代码语言:javascript
复制
         vec4 vert =  mvp * vec4(inPos.x,inPos.y,0,1);
        vert.xyzw/=vert.w;
        gl_Position = vert;

在VS中,我得到不同的o/p,如:

代码语言:javascript
复制
         vec4 vert =  mvp * vec4(inPos.x,inPos.y,0,1);
        gl_Position = vert;
EN

回答 1

Stack Overflow用户

发布于 2016-03-03 03:28:57

首先,我不能准确地复制你得到的数字。也许你对问题中的矩阵元素进行了舍入。我得到的值是:

代码语言:javascript
复制
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]

然而,问题是另一回事。当您查看这些点的剪辑空间坐标时,您会得到以下结果:

代码语言:javascript
复制
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坐标被镜像到xyz中,在这种情况下,跳过裁剪步骤将导致完全错误的基元。

GL永远不会有这个问题,因为裁剪将在分割完成之前在裁剪空间中完成。如果您想要有意义的NDC坐标,您还必须实现自己的裁剪。但是,这很难在顶点着色器中完成(除非正在绘制的所有点都是单独的点)。对于直线或三角形基本体,您需要所有顶点的数据来计算基本体边和剪裁平面之间的交点,并且可能需要动态创建新的基本体。

这也意味着位于投影中心后面的点没有任何有意义的NDC坐标。例如,考虑一个三角形,其中两个顶点位于相机前面,恰好在视图体积内,第三个顶点位于相机后面。裁剪将在从第三个点到其他点的每条边上创建一个新点(并将生成两个三角形来替换原始三角形)。这两个新点确实有有意义的NDC坐标,但第三个原始点从来没有-并且第三个输入点和新创建的点之间也没有1:1的映射。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35755263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档