程序和缓冲区类型之间的OpenGL绑定点索引有多可共享,我何时必须重新绑定?

时间:2019-09-12 10:04:13

标签: opengl shader-storage-buffer buffer-objects

OpenGL Shader存储缓冲区对象必须绑定到某个绑定点索引,并且如果该块使用该SSBO,则某些Shader存储块索引必须绑定到相同的绑定点索引。对于统一块和统一缓冲区对象也是如此。

我有一些奇怪的行为很难调试,我想知道是否是因为我没有正确使用绑定点。

请考虑以下集合或对象:

  • 两个着色器程序:P_aP_b
  • 两个着色器存储块:SSB_a中的P_aSSB_b中的P_b
  • 两个统一块:UB_a中的P_aUB_b中的P_b
  • 两个Shader存储缓冲区对象SSBO_pSSBO_q
  • 两个统一缓冲区对象UBO_xUBO_y
  • 一些由程序员政策决定的BINDING_POINT_INDEX=7或任意数字

这些缓冲区何时可以共享BINDING_POINT_INDEX,何时必须重新绑定这些缓冲区?

在一个程序中,SSBO和UBO之间是否共享绑定点?即我是否可以安全地使用BINDING_POINT_INDEXSSB_a绑定到SSBO_p中的P_a和使用BINDING_POINT_INDEXUB_a绑定到{{ 1}}在UBO_x中?

程序之间是否共享绑定点?即我是否可以安全地使用P_aBINDING_POINT_INDEX绑定到SSB_a中的SSBO_p和使用P_aBINDING_POINT_INDEX绑定到{{ 1}}在SSB_b中?

我何时必须重新绑定缓冲区?如果我这样做

SSBO_q

此时,P_b仍绑定到glUseProgram (P_a); glUniformBlockBinding (P_a, UB_a, BINDING_POINT_INDEX); glBindBufferBase (GL_UNIFORM_BUFFER, BINDING_POINT_INDEX, UBO_x); // UB_a is now bound to UBO_x in P_a // Draw stuff... glUseProgram (P_b); glUniformBlockBinding (P_b, UB_b, BINDING_POINT_INDEX); glBindBufferBase (GL_UNIFORM_BUFFER, BINDING_POINT_INDEX, UBO_y); // UB_b is now bound to UBO_y in P_b // Draw stuff... glUseProgram (P_a); 中的UB_a吗?

我是否正确地认为,在一个上下文中完成的绑定不会影响在另一个上下文中的绑定?

在不同的程序和不同的缓冲区类型之间共享绑定点索引的方式是什么,用于绑定它们的正确事件顺序是什么(根据UBO_xP_a等),以及何时必须重新绑定缓冲区吗?

0 个答案:

没有答案