GLuint b;
glGenBuffers(1,&b);
glBindBuffer(GL_ARRAY_BUFFER,b);
glBufferData(GL_ARRAY_BUFFER,...);
我认为这将成为
GLuint b;
glCreateBuffers(1,&b);
glBufferData(b,...);
现在不再需要诸如“ GL_ARRAY_BUFFER”之类的目标。但是我将如何模拟
我可以像这样在幕后将“一切”绑定到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入口点,根据一些说法,它们应该更有效。
关于opengl - 可以模拟直接状态访问吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27773410/