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