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

时间:2015-01-05 04:26:24

标签: opengl

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?

我可以绑定"一切"在这样的幕后GL_ARRAY_BUFFER?

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

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

如果我试图像这样模拟DSA,我会遇到问题吗?

1 个答案:

答案 0 :(得分:3)

这不是一个正确的电话:

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入口点,根据一些声明,它应该更有效。