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/

10-11 19:22