Multithreading 如何存储OpenGL程序对象&x27;是按上下文而不是按程序?

Multithreading 如何存储OpenGL程序对象&x27;是按上下文而不是按程序?,multithreading,macos,opengl,graphics,core-graphics,Multithreading,Macos,Opengl,Graphics,Core Graphics,我正在开发一个多线程的OpenGL合成引擎。我有一组在多个上下文中共享的着色器。出于性能原因,我希望避免为每个线程编译每个着色器程序的单独实例 但是,如果多个线程碰巧使用同一个程序对象,并且我尝试在每个线程上设置不同的统一,统一值就会混淆,因为统一值与共享程序对象一起存储 到目前为止,我的选择是: 为每个线程编译一个单独的程序对象(这会浪费时间和资源),或者 对于每个共享程序对象,序列化设置一致性和呈现的过程(这在很大程度上抵消了多线程的好处) 还是有更好的办法?(即,是否有一种方法可以存储Op

我正在开发一个多线程的OpenGL合成引擎。我有一组在多个上下文中共享的着色器。出于性能原因,我希望避免为每个线程编译每个着色器程序的单独实例

但是,如果多个线程碰巧使用同一个程序对象,并且我尝试在每个线程上设置不同的统一,统一值就会混淆,因为统一值与共享程序对象一起存储

到目前为止,我的选择是:

  • 为每个线程编译一个单独的程序对象(这会浪费时间和资源),或者
  • 对于每个共享程序对象,序列化设置一致性和呈现的过程(这在很大程度上抵消了多线程的好处)
  • 还是有更好的办法?(即,是否有一种方法可以存储OpenGL程序对象在每个上下文而不是每个程序中的制服?)


    编辑:我还需要通过Mac OS 10.6支持用户几个月,因此在此之前,我一直坚持使用OpenGL 2.1以及Mac OS 10.6上可用的任何扩展<如果我理解正确,Mac OS 10.8中会出现代码>ARB\u单独的\u着色器\u对象。请考虑统一缓冲区对象和程序管道对象。统一缓冲区对象将使为每个渲染上下文维护整个统一变量集变得更容易(如果已授予缓冲区对象可共享,您仍然可以为每个上下文提供其自己唯一的缓冲区对象)。程序管道对象(单独着色器对象的一部分)将允许您维护每个上下文的程序状态,而无需编译同一着色器的多个副本。当然,这两个功能都有些新,如果你能解释一下你的目标是哪个版本的OpenGL,那会有所帮助。谢谢,@AndonM.Coleman。如果使用选项#1,程序管道对象看起来将节省一些重新编译时间。在我放弃对Mac OS 10.6和10.7的支持之前,我似乎运气不好。