从模型空间获取坐标的最快方法,以及OpenGL ES 2.0中的规范坐标空间

时间:2011-07-24 04:01:39

标签: opengl-es opengl-es-2.0

与许多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管道的着色器只使用了一个矩阵,那么使用的是什么?

1 个答案:

答案 0 :(得分:5)

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

其次,它应该是这样的:

gl_Position = uProjection * (uMV * aPosition);

你发布的是矩阵/矩阵乘法后跟矩阵/向量乘法。此版本执行2次矩阵/向量乘法。这是一个很大的不同。

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

话虽如此,除非你在模型空间中进行照明,否则你经常需要在模型空间和4D均匀剪辑空间之间建立一些中介。这是您将位置和法线转换为空间以便计算光线方向,点(N,L)等的空间。

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