是否可以模拟直接状态访问?

Is it possible to emulate direct state access?

GLuint b;
glGenBuffers(1,&b);
glBindBuffer(GL_ARRAY_BUFFER,b);
glBufferData(GL_ARRAY_BUFFER,...);

我想这会变成

GLuint b;
glCreateBuffers(1,&b);
glBufferData(b,...);

现在不再需要 "GL_ARRAY_BUFFER" 这样的目标了。但是我将如何模拟这个 < 4.5?

我可以像这样在幕后将 "everything" 绑定到 GL_ARRAY_BUFFER 吗?

glBufferDataDSA(GLuint b,...){
   glBindBuffer(GL_ARRAY_BUFFER,b);
   glBufferData(GL_ARRAY_BUFFER,...);
   glBindBuffer(GL_ARRAY_BUFFER,0);
}

我的意思是,如果我始终确保设置绑定,它应该不会对我绑定的内容产生影响。

或者如果我尝试像这样模拟 DSA 会遇到问题吗?

这不是正确的调用:

GLuint b;
glCreateBuffers(1,&b);
glBufferData(b,...);

glBufferData() 没有重载以获取缓冲区名称参数。 DSA 案例有一个新的 glNamedBufferData() 调用:

GLuint b;
glCreateBuffers(1,&b);
glNamedBufferData(b,...);

除了您已经意识到的明显副作用之外,您使用非 DSA 的替代品看起来不错。它当然会改变当前的 GL_ARRAY_BUFFER 绑定。如果您不关心这一点,代码序列应该是等效的。最后可能不需要将绑定设置为 0,因为无论如何您都丢失了以前的绑定,并且在使用之前总是必须绑定一个缓冲区。

总的来说,我不认为 DSA 真的增加了新功能,所以应该可以用非 DSA 调用来模拟它而不会有太多麻烦。它只是现有功能的一组新 API 入口点,根据一些说法,这应该更有效。