【问题标题】:Implementing graphics pipeline实现图形管道
【发布时间】:2014-12-09 16:29:58
【问题描述】:

this post from yesterday 开始。情况与原始帖子中的情况相同:我正在实现自己的图形管道,转换的奇怪问题。但是,我现在认为问题不在于透视投影,而是一个更大的问题。

现在管道只有三个阶段,第一个阶段使用模型和投影矩阵转换单个顶点。接下来将这些组装成基元,最终由光栅化器渲染。这是测试运行的输出:

这是顶点数据:

 Vertex1:  0  ,  0,  -1,  1
 Vertex2:  0.5,  1,  -1,  1
 Vertex3:  1  ,  0,  -1,  1

当没有发生变换时(也就是说模型矩阵是单位矩阵):

Model Matrix
1.000000 0.000000 0.000000 0.000000 
0.000000 1.000000 0.000000 0.000000 
0.000000 0.000000 1.000000 0.000000 
0.000000 0.000000 0.000000 1.000000 

    New vert x: 0.000000 y: 0.000000 z: -1.000000 w: 1.000000
    New vert x: 0.500000 y: 1.000000 z: -1.000000 w: 1.000000
    New vert x: 1.000000 y: 0.000000 z: -1.000000 w: 1.000000

Projection Matrix
1.931371 0.000000 0.000000 0.000000 
0.000000 2.414213 0.000000 0.000000 
0.000000 0.000000 1.002002 -0.200200 
0.000000 0.000000 -1.000000 0.000000 

    New vert x: 0.000000 y: 0.000000 z: -1.202202 w: 1.000000
    New vert x: 0.965685 y: 2.414213 z: -1.202202 w: 1.000000
    New vert x: 1.931371 y: 0.000000 z: -1.202202 w: 1.000000

Divide by W

    New vert x: 0.000000 y: 0.000000 z: -1.202202 w: 1.000000
    New vert x: 0.965685 y: 2.414213 z: -1.202202 w: 1.000000
    New vert x: 1.931371 y: 0.000000 z: -1.202202 w: 1.000000

Screenspace Matrix
400.000000 0.000000 0.000000 400.000000 
0.000000 320.000000 0.000000 320.000000 
0.000000 0.000000 1.000000 0.000000 
0.000000 0.000000 0.000000 1.000000 

    New vert x: 400.000000 y: 320.000000 z: -1.202202 w: 1.000000
    New vert x: 786.274170 y: 1092.548340 z: -1.202202 w: 1.000000
    New vert x: 1172.548340 y: 320.000000 z: -1.202202 w: 1.000000

结果如下: 这对我来说看起来很合理,0,0,0 顶点似乎以原点为中心,而其他点在屏幕外,距离相机 -1 是我所期望的。

当我调整模型矩阵时:

Model matrix
1.000000 0.000000 0.000000 -4.799998 
0.000000 1.000000 0.000000 -3.999998 
0.000000 0.000000 1.000000 -2.300000 
0.000000 0.000000 0.000000 1.000000 
    New vert x: -4.799998 y: -3.999998 z: -3.300000 w: 1.000000
    New vert x: -4.299998 y: -2.999998 z: -3.300000 w: 1.000000
    New vert x: -3.799998 y: -3.999998 z: -3.300000 w: 1.000000

Projection Matrix
1.931371 0.000000 0.000000 0.000000 
0.000000 2.414213 0.000000 0.000000 
0.000000 0.000000 1.002002 -0.200200 
0.000000 0.000000 -1.000000 0.000000 

    New vert x: -9.270576 y: -9.656849 z: -3.506807 w: 1.000000
    New vert x: -8.304890 y: -7.242636 z: -3.506807 w: 1.000000
    New vert x: -7.339205 y: -9.656849 z: -3.506807 w: 1.000000


Divide by W
    New vert x: -2.809265 y: -2.926318 z: -1.062669 w: 3.300000
    New vert x: -2.516633 y: -2.194738 z: -1.062669 w: 3.300000
    New vert x: -2.224001 y: -2.926318 z: -1.062669 w: 3.300000


Screenspace Matrix
400.000000 0.000000 0.000000 400.000000 
0.000000 320.000000 0.000000 320.000000 
0.000000 0.000000 1.000000 0.000000 
0.000000 0.000000 0.000000 1.000000 

    New vert x: 196.293823 y: 119.578247 z: -1.062669 w: 3.300000
    New vert x: 313.346680 y: 353.683777 z: -1.062669 w: 3.300000
    New vert x: 430.399414 y: 119.578247 z: -1.062669 w: 3.300000

这个数据的输出是:

这对我来说看起来不对,但我看不到我的问题在矩阵堆栈中的哪个位置。从上面其他人可以看出矩阵堆栈有什么问题吗?

【问题讨论】:

标签: c++ math matrix graphics projection


【解决方案1】:

和原帖一样:

“所以我在休息一段时间后回到这个项目,我意识到我的投影划分(又名 /w)只是划分 xyz 坐标。所以当我应用屏幕空间矩阵时,翻译列乘以'大于 1' W 值导致三角形随着 Z 减小而向右上方移动。"

【讨论】:

    猜你喜欢
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 2012-07-04
    • 2014-03-21
    • 1970-01-01
    相关资源
    最近更新 更多