0

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

// 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国家的文档没有这样的问题。

4

1 回答 1

1

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

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

于 2013-05-13T07:59:28.437 回答