c++ - 实现图形流水线

标签 c++ math matrix graphics projection

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

结果如下:enter image description here 这对我来说看起来很合理,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

此数据的输出是: enter image description here

我觉得这不对,但我看不出问题出在矩阵堆栈的哪个位置。从上面还有人能看出矩阵堆栈有什么问题吗?

最佳答案

如原帖所示:

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

关于c++ - 实现图形流水线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27383949/

相关文章:

时间:2018-03-08 标签:c++opengl: how to find normalized vectors for a quad?

c++ - 编写一个函数来分配上三角矩阵

c++ - *** 检测到 glibc *** ./parent_child_conscall : double free or corruption (fasttop): 0x09d9e028 ***

c++ - VS2010 中不同大小的 lambda 表达式?

基于mysql数学的查询

c# - 使用数学运算符评估字符串

c - 为什么我不能在不声明像 const 这样的矩阵的情况下进行编译

matrix - CSS3 matrix3d矩形到梯形变换

c++ - OpenCV 访问 MAT 对象中的 RGB 值

c++ - 不命名类型 - C++