2012-02-06 67 views
5

这与Switch shader program in WebGL有关,但我想重新提出这个问题,现在我对问题有了更清楚的认识以及我想问什么。glUseProgram后,什么状态丢失/重置?

我试图在不同的着色器程序之间切换,但我似乎无法在同一渲染中切换着色器程序时正确渲染。我认为在拨打glUseProgram()之后,状态丢失或重置。

该通话后,哪些状态丢失或重置?换句话说,我需要在glUseProgram()后再次绑定?

回答

0

有可能您的顶点阵列和顶点attrib阵列在其他程序(例如this.locATex)中具有不同的位置,例如纹理绑定和采样器制服可能会出现同样的问题。您需要单独查询每个程序的那些attrib位置和“纹理单元制服”,您需要自行初始化,并在绘制之前相应地绑定阵列和纹理。另一端的进一步绑定也会中断,比如片段数据位置。但我建议,在发现新问题之前,您提供了更多的代码:-)。

+1

感谢您的建议,但我一直在寻找更一般的建议,就像我需要再次设置制服还是保持其价值?属性或统一位置对于一个给定的程序是否坚持其价值?纹理是否需要重新启用?等等。 – AshleysBrain 2012-02-06 17:26:17

+0

链接程序后,Attrib位置和实际统一的位置和值仍然存在。统一缓冲区可以绑定到更多的程序。纹理不需要重新启用,因为您没有使用固定功能管线。 – Sam 2012-02-06 17:35:34

+0

纹理单元具有多个附着点,例如可以绑定2D和3D纹理,并使用适当的采样器制服访问它们中的任何一个。 – Sam 2012-02-06 17:37:09