我有一些想法,但我不确定,因为我不是 webgl 的专家。
在 WebGL 中,没有摄像头。如果要模拟的话,就得对很多物体进行操作……准确的说,就是要改变位置到几十万个顶点。我没有深入研究 Three.js 或 Babylon js,所以我不知道它们如何与相机一起工作。
既然顶点着色器可以转换顶点位置,而且我们可以传递camera matrix
给顶点着色器,那么让它进行计算是否有意义,所以 GPU 会代替 CPU 来做艰苦的工作?
我有一些想法,但我不确定,因为我不是 webgl 的专家。
在 WebGL 中,没有摄像头。如果要模拟的话,就得对很多物体进行操作……准确的说,就是要改变位置到几十万个顶点。我没有深入研究 Three.js 或 Babylon js,所以我不知道它们如何与相机一起工作。
既然顶点着色器可以转换顶点位置,而且我们可以传递camera matrix
给顶点着色器,那么让它进行计算是否有意义,所以 GPU 会代替 CPU 来做艰苦的工作?
您的意思是:使用位置和方向等数据在顶点着色器中创建视图矩阵,而不是从应用程序创建它并在着色器中发送结果矩阵?
实际上,最后一个是像 THREE.js 和许多其他解决方案的情况:可以从 JavaScript 操作表示相机的对象。然后在绘制时,从一些位置和方向参数构建视图矩阵,并发送到活动着色器程序。
创建一个视图矩阵是通过一些步骤完成的:
决定应该在哪里(或何时)计算矩阵取决于视图矩阵在仅绘制一张图像的过程中不会改变的想法。事实上,视图矩阵和投影矩阵旨在在两个图像之间进行修改。
不要忘记,对于发送到管道的每个顶点,顶点着色器都会执行一次。如果在顶点着色器中计算视图矩阵,每张图像将被重新计算一千次。
所以视图矩阵的计算最好留在应用程序中并发送到着色器程序。
如果您想从浮点运算中着色器的性能中受益,您可以考虑使用计算着色器(不幸的是,WebGL 中不存在)或考虑一些机制来从着色器程序中读取数据以便计算一次矩阵,并在下一次抽奖时发送。