OpenGL/WebGL 如何“知道”我想要透视图?

How OpenGL/WebGL 'knows' I want perspective view?

提问人:Utututu 提问时间:10/25/2023 最后编辑:Utututu 更新时间:10/25/2023 访问量:82

问:

我使用 WebGL,但在 OpenGL 中的问题完全相同 我认为问题不在于数学。这是关于决定论的。

问题是:OpenGL(WebGL)或GPU如何“知道”我想使用透视投影?

这个问题听起来很有趣甚至很愚蠢,但我已经研究了数学库并在 PDF 中写下了投影矩阵(以获得更好的图片),它只是不会以这种方式改变顶点,就像在透视视图中一样。 您可以在此处的 PDF 屏幕截图上看到它:

enter image description here

如果仔细观察 x 或 y 变量的结果,则 W(设备宽度)、H(设备高)和 ctan(fovY/2) 在 sigle 帧中是常数。因此,每个顶点的所有 x 和 y 坐标将乘以相同的常量值。因此,如果我在 Z 轴上移动三角形(将其平移),值 X 和 Y 不会像在透视投影中那样改变。 我没有使用View Matrix来不使数学复杂化。视图是一个单位矩阵,为了检查它,我将其定义为三角形:

    data: [
    new Float32Array([
        0,      0.05,   -0.5,    1.0, 0.0, 0.0,
        0.05,   -0.05,  -0.5,    0.0, 1.0, 0.0,
        -0.05,  -0.05,  -0.5,    0.0, 0.0, 1.0
        ]),
    new Float32Array([
        0.05,   0.075,  -0.8,    1.0, 1.0, 0.0,
        0.1,   -0.025,  -0.8,    0.0, 1.0, 1.0,
        0,     -0.025,  -0.8,    1.0, 0.0, 1.0
        ])
    ],

我没有添加其他代码,因为它正在工作。问题是我不知道为什么。

由于 OpenGL 只“知道”我链接了一些制服。GPU 有我的统一投影矩阵,但“完全不知道”这个矩阵是什么意思,问题是:

那么,如果投影矩阵没有真正做到这一点,那么为什么它根本不起作用呢?但也许我错了或不明白什么?

如果你想查看更多细节,你找不到我使用的功能: 用于 WebGL 的 glMatrix。在文件 mat4.js 中,您可以找到函数 perspectiveNO,它是为 WebGL 而不是 WebGPU 设计的。 我从旧的本地存档中获取了这个,但在最新版本中应该是相同的。 您还可以在文件中查看 glm、函数透视图: glm/gtc/matrix_transform.inl

opengl glsl webgl mathml gl-matrix

评论

0赞 Nicol Bolas 10/25/2023
"你可以在这里的PDF截图上看到它:“该PDF中有错误。输出的第 4 个坐标应为 。-Z
0赞 Utututu 10/25/2023
谢谢。“-z”并不是唯一的错误。但仍然不明白它是如何工作的。
0赞 Utututu 10/25/2023
还行。我可能明白了。要使它正常工作,输出的 x,y,z 需要除以输出的第三个值。这是 -Z,这将是最终结果?
0赞 Erdal Küçük 10/25/2023
是的,在管道的更深处,会有更多的转换(例如,从 3D 空间到 2D 空间,我们仍然需要考虑视口)。看一看:learnopengl.com/Getting-started/Coordinate-Systems。要了解 OpenGL 的功能,请阅读 OpenGL 核心配置文件 - 第 13 章:固定函数顶点后处理。推荐的维基文章:en.wikipedia.org/wiki/Clip_coordinatesen.wikipedia.org/wiki/Homogeneous_coordinatesen.wikipedia.org/wiki/3D_projection

答: 暂无答案