微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

直接状态访问 (DSA) 失败,但 4.3 之前的 OpenGL 有效

如何解决直接状态访问 (DSA) 失败,但 4.3 之前的 OpenGL 有效

我目前有一个 OpenGL 项目,在该项目中我使用 GLFW 来创建窗口和上下文,并使用 GLAD 来加载 OpenGL 函数。我使用的 GLAD 版本是 OpenGL 4.6,兼容性配置文件,具有所有扩展(包括 ARB_direct_state_access)。

我当前的显卡设置是

OpenGL Version: 4.6.0 NVIDIA 457.09
GLSL Version: 4.60 NVIDIA
Renderer: GeForce GTX 970/PCIe/SSE2
vendor: NVIDIA Corporation

当我运行以下非 DSA 代码时,它工作正常。

// Create vertex array object and bind it
gluint vao;
glGenVertexArrays(1,&vao);
glBindVertexArray(vao);

// Create an index buffer object and use the data in the indices vector
gluint ibo;
glGenBuffers(1,&ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,indicies.size()*sizeof(GLint),indicies.data(),GL_STATIC_DRAW);

// Create a array buffer object and use the positional data which has x,y,z components
gluint vbo;
glGenBuffers(1,&vbo);
glBindBuffer(GL_ARRAY_BUFFER,vbo);
glBufferData(GL_ARRAY_BUFFER,positions.size()*sizeof(GLfloat),positions.data(),GL_STATIC_DRAW);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0);
glEnabLevertexAttribArray(0);

但是,当我尝试将此代码转换为 DSA 格式并运行它时,程序会打开一个窗口,然后在没有有用的调试信息的情况下终止。

gluint vao;
glGenVertexArrays(1,&vao);

gluint vbo;
glCreateBuffers(1,&vbo);
glNamedBufferStorage(vbo,GL_DYNAMIC_STORAGE_BIT);
glVertexArrayVertexBuffer(vao,vbo,0);
glEnabLevertexArrayAttrib(vao,0);
glVertexArrayAttribFormat(vao,0);
glVertexArrayAttribBinding(vao,0);

gluint ibo;
glCreateBuffers(1,&ibo);
glNamedBufferStorage(ibo,sizeof(GLint)*indicies.size(),GL_DYNAMIC_STORAGE_BIT);
glVertexArrayElementBuffer(vao,ibo);

在这两种情况下,我都像这样在绘制之前绑定了顶点数组对象

glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES,indicies.size(),GL_UNSIGNED_INT,0);

为什么我的 DSA 之类的代码不起作用?

解决方法

当您使用 glVertexArrayVertexBuffer 时,您必须指定 stride 参数。当 stride 为 0 时,通用顶点属性被理解为紧密打包的特殊情况,如使用 glVertexAttribPointer 时,不适用于使用 glVertexArrayVertexBuffer 时。

glVertexArrayVertexBuffer(vao,vbo,0);

glVertexArrayVertexBuffer(vao,3*sizeof(float));

如果 stride 为 0,它不会导致错误,但这并不意味着它有意义。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。