Opengl es 在OpenGL ES 2.0中从模型空间获取坐标到规范坐标空间的最快方法

Opengl es 在OpenGL ES 2.0中从模型空间获取坐标到规范坐标空间的最快方法,opengl-es,opengl-es-2.0,Opengl Es,Opengl Es 2.0,像许多3d图形程序一样,我有一组对象,它们有自己的模型坐标(在x、y和z轴上从-1到1)。然后,我有一个矩阵,它将模型坐标转换为世界坐标(使用绘制对象的位置、旋转和比例)。最后,我有第二个矩阵将这些世界坐标转换为标准坐标,OopenGL ES 2.0将使用这些坐标绘制到屏幕上 因此,由于一个对象可以包含多个顶点,所有这些顶点都使用到世界空间和标准坐标的相同变换,因此计算这两个矩阵的乘积一次,并将每个顶点通过结果矩阵,比将每个顶点通过两个矩阵更快 但是,据我所知,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个矩阵/向量乘法。这是一个很大的区别

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

也就是说,除非您在模型空间中进行照明,否则您通常需要在模型空间和4D同质剪辑空间之间进行某种中介。这是将位置和法线变换为的空间,以便计算灯光方向、点(N,L)等


就我个人而言,我不建议使用世界空间,但无论是世界空间、相机空间还是其他空间,通常都会有一些中间空间,您需要处于其中。在这一点上,上面的代码是必要的,因此不会浪费时间。

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

第二,应该是:

gl_Position = uProjection * (uMV * aPosition);
你发布的内容是矩阵/矩阵相乘,然后是矩阵/向量相乘。这个版本有2个矩阵/向量乘法。这是一个很大的区别

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

也就是说,除非您在模型空间中进行照明,否则您通常需要在模型空间和4D同质剪辑空间之间进行某种中介。这是将位置和法线变换为的空间,以便计算灯光方向、点(N,L)等


就我个人而言,我不建议使用世界空间,但无论是世界空间、相机空间还是其他空间,通常都会有一些中间空间,您需要处于其中。在这一点上,上面的代码是必要的,因此不会浪费时间。

用于解释的链接不再存在。你会更新吗?解释的链接不再存在。你会更新吗?