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

Lei*_*sen 1 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;
Run Code Online (Sandbox Code Playgroud)

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

那么,哪种方式通常被认为是标准的?还是有一种我完全失踪的不同方式?据我所知,用于在OpenGL ES 2.0编程指南中实现OpenGL ES 1.1管道的着色器仅使用一个矩阵,那么使用更多?

Nic*_*las 5

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

其次,它应该是这样的:

gl_Position = uProjection * (uMV * aPosition);
Run Code Online (Sandbox Code Playgroud)

您发布的是矩阵/矩阵乘法,然后是矩阵/向量乘法.此版本执行2次矩阵/向量乘法.这是一个很大的不同.

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

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

就个人而言,我不会因为我在这里详细解释的原因而建议世界空间.但无论是世界空间,相机空间还是其他东西,你通常都会有一些中间空间需要位置.此时,上面的代码变得必要,因此没有浪费时间.