使用OpenGL缓冲区对象和多个目标的潜在问题?

时间:2013-05-13 02:42:54

标签: qt opengl glsl

我正在为Qt开发一个库,扩展了它的OpenGL功能,以支持现代OpenGL(3+)功能,如纹理缓冲区,图像加载存储纹理,着色器存储缓冲区,原子计数器缓冲区等。为了完全支持像转换反馈这样的功能,我允许用户在不同的时间将缓冲区对象绑定到不同的目标(无论它们分配缓冲区的数据是什么)。考虑以下场景,我使用变换反馈来推进顶点数据ONCE,然后将其绑定到单独的程序进行渲染(用于其余的应用程序运行时):

// I attach a (previously allocated) buffer to the transform feedback target so that I 
// can capture data advanced in a shader program. 
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, someBufferID);

// Then I execute the shader program...

// and release the buffer from the transform feedback target.
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0);

// Then, I bind the same buffer containing data advanced via transform feedback 
// to the array buffer target for use in a separate shader program.
glBindBuffer(GL_ARRAY_BUFFER, someBufferID);

// Then, I render something using this buffer as the data source for a vertex attrib.

// After, I release this buffer from the array buffer target.
glBindBuffer(GL_ARRAY_BUFFER, 0);

在这种情况下,能够将缓冲区对象绑定到多个目标非常有用。但是,根据OpenGL规范,我不确定是否存在此功能会导致问题的情况。基本上,我应该在实例化期间允许单个缓冲区对象绑定到多个目标还是强制目标(如标准Qt缓冲区包装器)?

修改: 我发现将创建/绑定目标与TEXTURE对象混合作为glBindTexture状态的OpenGL文档存在问题:

  

如果先前已创建纹理,则会生成GL_INVALID_OPERATION   目标与目标目标不匹配。

但是,glBindBuffer的文档没有说明这样的问题。

1 个答案:

答案 0 :(得分:1)

好吧,总会有错误的驱动程序(如果你没有“绿色”硬件,无论如何都无法保证)。但请放心,将缓冲区绑定到您想要的任何目标是完全合法的,无视它们创建的目标。

可能存在某些细微之处,例如某些目标需要使用glBindBufferRange/Base以索引方式使用(如统一缓冲区或变换反馈缓冲区)。但强制执行仅与单个目标一起使用的缓冲区,就像Qt一样,太过严格,无法在现代OpenGL中使用,正如您常见的示例所示。也许一个很好的折衷方案是使用每类(如Qt)或每缓冲区默认目标(在大多数简单情况下,当缓冲区总是与单个目标一起使用时,这将足够,并且可以用于如果需要,则为类内部绑定操作,但提供将其绑定到其他内容的选项。

相关问题