2014-05-02 60 views
0

OpenGL检查我想绑定的程序是否已绑定?还是我必须自己做这个? 我想根据对象是否具有法线贴图来切换着色器。OpenGL再次绑定相同的程序

+0

你问是否会导致任何问题在同一行中绑定两次相同的程序? –

+0

我认为它是依赖于实现的,更好的是绑定而不是自己检查。分支可能比绑定着色器程序慢很多! – CoffeeandCode

+0

对那些没有法线贴图的物体使用“平面”或“空白”法线贴图怎么样?这个法线贴图不会干扰任何法线,但会为您节省程序开关以及分支。 – zero298

回答

2

每次绘制对象时绑定不同的GLSL程序肯定是效率低下的。 FBO和GLSL程序具有所有对象类型的最高验证成本。任何智能实现都会知道何时绑定相同的程序,并避免任何额外的工作,但状态缓存以避免多余的绑定仍然有用。

然而,实际的性能增长是可能的,如果你的所有排序以这样的方式不透明对象,而不正常的地图都拉到一起,然后与他们不透明对象拉到一起绘制。不透明几何不具有严格的顺序依赖性,所以您可以最大限度地减少着色器变化。这就是你应该瞄准的目标,而不是尽量减少多余的绑定(驱动程序可能已经这样做)。