Opengl es Three.js不';为什么不对不同的网格对象使用不同的着色器程序?

Opengl es Three.js不';为什么不对不同的网格对象使用不同的着色器程序?,opengl-es,3d,three.js,webgl,shader,Opengl Es,3d,Three.js,Webgl,Shader,我试图弄清楚three.js是如何工作的,并为此尝试了一些着色器调试器 我添加了两个带有基本材质的简单平面(单色,没有任何着色模型),它们在渲染过程中旋转 首先,我的问题是。。。为什么three.js对两个网格使用单个着色器程序(查看WebGL上下文函数.useProgram())。 我想,对象是相同的,这就是为什么出于性能原因,单个着色器程序用于类似的对象 但是。。。我已经更改了我的three.js应用程序源代码,现在场景中有一个平面和一个立方体,它们正在旋转 让我们再次查看着色器调试器:

我试图弄清楚three.js是如何工作的,并为此尝试了一些着色器调试器

我添加了两个带有基本材质的简单平面(单色,没有任何着色模型),它们在渲染过程中旋转

首先,我的问题是。。。为什么three.js对两个网格使用单个着色器程序(查看WebGL上下文函数
.useProgram()
)。 我想,对象是相同的,这就是为什么出于性能原因,单个着色器程序用于类似的对象

但是。。。我已经更改了我的three.js应用程序源代码,现在场景中有一个平面和一个立方体,它们正在旋转

让我们再次查看着色器调试器:

在这里您可以看到,three.js再次使用一个着色器程序,但现在对象不同了。这一刻对我来说并不清楚

如果要查看该着色器,它似乎是非常通用和庞大的着色器程序,并且还有两个不同的着色器程序,它们已编译,但未使用


那么,为什么three.js使用单个着色器程序?这些正确(或不正确)的原因是什么?

在着色器中完成的大部分工作与网格的材质部分有关,而不是几何体

在webgl(或opengl)中,您所理解的几何体(如果是立方体、球体或其他东西)是非常不相关的

如果你谈论几何体是如何构造的,那就更相关了。但在这些日子里,超过3个顶点的面消失了,三角形条很少使用,这是很少有不同的几何体。。。面3几何图形、线几何图形、粒子几何图形和缓冲区几何图形

大多数情况下,使用不同着色器的关键区别在于材质