是否可以模拟直接状态访问?
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 入口点,根据一些说法,这应该更有效。
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 入口点,根据一些说法,这应该更有效。