【问题标题】:Fastest way to to take coordinates from model space, to canonical coordinates space in OpenGL ES 2.0在 OpenGL ES 2.0 中从模型空间获取坐标到规范坐标空间的最快方法
【发布时间】:2020-01-04 11:33:58
【问题描述】:

像许多 3d 图形程序一样,我有一堆对象,它们有自己的模型坐标(x、y 和 z 轴从 -1 到 1)。然后,我有一个矩阵,将它从模型坐标带到世界坐标(使用正在绘制的对象的位置、旋转和比例)。最后,我有第二个矩阵将这些世界坐标转换为标准坐标,OopenGL ES 2.0 将使用它来绘制到屏幕上。

所以,因为一个对象可以包含许多顶点,所有这些顶点都使用相同的变换到世界空间和规范坐标,计算这两个矩阵的乘积一次,并将每个顶点放入结果矩阵中会更快,而不是将每个顶点都放在两个矩阵中。

但是,据我所知,在 OpenGL ES 2.0 着色器中似乎没有办法让它计算一次矩阵,并一直使用它直到两个矩阵之一使用直到 glUniformMatrix4fv() (或另一个设置制服的函数)被调用。因此,似乎计算一次矩阵的唯一方法是在 CPU 上进行,然后使用统一的结果到 GPU。否则,当类似:

gl_Position = uProjection * uMV * aPosition;

它会一遍又一遍地计算它,这似乎会浪费时间。

那么,哪种方式通常被认为是标准的?还是有另一种我完全想念的方式?据我所知,OpenGL ES 2.0 编程指南中用于实现 OpenGL ES 1.1 流水线的着色器只使用了一个矩阵,那么用的更多吗?

【问题讨论】:

    标签: opengl-es opengl-es-2.0


    【解决方案1】:

    首先,“规范坐标”的正确 OpenGL 术语是剪辑空间。

    第二,应该是这样的:

    gl_Position = uProjection * (uMV * aPosition);
    

    您发布的内容是矩阵/矩阵乘法,然后是矩阵/向量乘法。此版本执行 2 个矩阵/向量乘法。这是一个很大的区别。

    您正在使用基于着色器的硬件;如何处理矩阵取决于您。没有什么是“被认为是标准的”;你做你最需要做的。

    话虽如此,除非您在模型空间中进行照明,否则您通常需要在模型空间和 4D 同质剪辑空间之间进行一些中介。这是您将位置和法线转换到的空间,以便计算光的方向、dot(N, L) 等。

    就个人而言,我不建议使用世界空间,原因是 I explain thoroughly here. 但无论是世界空间、相机空间还是其他东西,您通常都会有一些需要定位的中间空间。此时,上面的代码变得很有必要,因此没有浪费时间。

    【讨论】:

    • 解释链接已不存在。你会更新吗?
    猜你喜欢
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2022-01-07
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    相关资源
    最近更新 更多