在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管道的着色器只使用了一个矩阵,所以它使用得更多吗?

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

第二,它应该是这样的:
gl_Position = uProjection * (uMV * aPosition);

你发布的是一个矩阵/矩阵乘法,然后是一个矩阵/向量乘法。这个版本做了2个矩阵/向量乘法。这是一个很大的区别。

你正在使用基于shader的硬件;如何处理矩阵取决于你自己。没有什么是"被认为是标准的";你做你最需要做的事。

也就是说,除非你在模型空间中进行照明,否则你通常需要在模型空间和4D均匀剪辑空间之间进行一些中介。这是你转换位置和法线的空间,以计算光的方向,点(N, L),等等。

就我个人而言,我不会建议使用世界空间,原因我将在这里详细解释。但无论是世界空间,相机空间,还是别的什么,你通常会有一些中间空间,你需要在其中找到位置。这时,上面的代码就变得必要了,因此没有浪费时间。

最新更新