Qt 使用具有多个目标的OpenGL缓冲区对象时可能出现的问题?

Qt 使用具有多个目标的OpenGL缓冲区对象时可能出现的问题?,qt,opengl,glsl,Qt,Opengl,Glsl,我正在为Qt开发一个库,该库扩展了它的OpenGL功能,以支持现代OpenGL(3+)功能,如纹理缓冲区、图像加载存储纹理、着色器存储缓冲区、原子计数器缓冲区等。。为了完全支持像转换反馈这样的功能,我允许用户在不同的时间将缓冲区对象绑定到不同的目标(不管他们用什么数据分配缓冲区)。考虑下面的场景,在这里,我使用转换反馈来提前顶点数据,然后将其绑定到一个单独的渲染程序(用于应用程序运行的其余时间): 在这种情况下,能够将缓冲区对象绑定到多个目标非常有用。然而,鉴于OpenGL规范,我不确定是否存在

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

在这种情况下,能够将缓冲区对象绑定到多个目标非常有用。然而,鉴于OpenGL规范,我不确定是否存在这种功能会导致问题的情况。本质上,我应该允许一个缓冲区对象绑定到多个目标,还是在实例化过程中强制一个目标(比如标准的Qt缓冲区包装器)

编辑: 我发现将创建/绑定目标与纹理对象混合在一起存在问题,因为
glBindTexture
的OpenGL文档指出:

如果先前创建了纹理,则生成GL_无效_操作 目标与目标不匹配


然而,
glBindBuffer
的文档说明没有这样的问题。

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


可能存在某些微妙之处,例如某些目标需要使用
glBindBufferRange/Base
(如统一缓冲区或变换反馈缓冲区)以索引方式使用。但是,像Qt一样,强制一个缓冲区只用于单个目标,这在现代OpenGL中太过严格,不太有用,正如您非常常见的示例所示。也许一个好的折衷办法是使用每类(如Qt)或每缓冲区默认目标(在大多数简单情况下,当缓冲区始终与单个目标一起使用时,这就足够了,必要时可以用于类内部绑定操作),但是提供将其绑定到其他对象的选项。

缓冲区只是数据块,与纹理不同,纹理具有大量的结构(尺寸、格式、mipmap级别、配置状态)。所以,缓冲区可以用于任何目的是有道理的。这就是我的想法,但我想我会确保没有潜在的危险。(可能是由于不同的供应商实施、某些目标的可能怪癖等原因)
// 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);