gpt4 book ai didi

c++ - 实现图形流水线

转载 作者:太空宇宙 更新时间:2023-11-04 13:41:54 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com