c++ - glEnableVertexArrayAttrib 抛出无效大小
问题描述
有两台电脑都有现代显卡。两者都处理 OpenGL 4.6。我得到了这个代码:
GLuint VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
//Setting up the VAO Attribute format
glVertexArrayAttribFormat(VAO, 0, 3 * sizeof(float), GL_FLOAT, GL_FALSE, 0);
glEnableVertexArrayAttrib(VAO, 0);
出于某种原因,这段代码在我的一台计算机上运行良好(我的三角形打印正确)(但是 OpenGL 返回错误:但程序运行正常而没有崩溃)
在我的另一台计算机(代码完全相同)上,当调用 glEnableVertexArrayAttrib(VAO,0) 并且我的程序崩溃时,我会收到此错误。
我不知道为什么会发生这两个错误,我的 VAO 在两台计算机上都很好地生成了。我在调用此代码之前检查了 OpenGL 上下文,这没关系。
如果需要,我可以分享 GLFW 和 Glew Init 代码以及我的着色器生成代码(两者都不会引发任何错误,并且它已在我完成的其他一些测试代码中使用,没有任何问题)
解决方案
您的大小确实不正确,它不是以字节为单位的。大小表示每个顶点的元素数,例如vec3
对应于 3:
glVertexArrayAttribFormat(VAO, 0, 3 , GL_FLOAT, GL_FALSE, 0);
至于为什么它可以在一台 PC 上运行,那么,习惯它吧。GPU驱动程序中的OpenGL实现通常非常神奇和宽容,直到它们不是。
以字节为单位的实际大小在 relativeoffset 参数中起作用,glVertexArrayVertexBuffer
同时也在指定偏移量和步幅中。
考虑使用glCreateVertexArrays
直接状态访问函数。原因是glGenVertexArrays
只保留了一个 VAO 对象,但不创建它(在某些驱动程序上它会创建它)。只有第一个glBindVertexArray(VAO);
会创建这样的对象。这是危险的,因为任何使用 DSA 的调用都可能在绑定之前失败,并且如果您首先使用 DSA,则没有理由进行绑定。我怀疑您已经这样做了,但是其他会看到您的代码和“浪费”绑定的人可能不知道这一点。
推荐阅读
- perl - Perl 两个相同的字符串比较为不相等
- php - 如何使用诀窍 API 获取每月明智的记录?
- regex - 查找正则表达式匹配,包括当前文本行
- php - 对 Laravel CommandBus 的证明无法识别 CommandHandler
- javascript - 如何插入 ejs 以实现国际化?
- c# - Serilog 与 .NET Core AWS 无服务器 Web API 项目
- wso2 - WSO2 - OAuth2/token 抛出 405 错误
- microcontroller - SAM4S - DMA 是否及时确定?
- c# - 将 DurableOrchestration 与 Azure Functions 结合使用时,无法将参数“orchestrationContext”绑定到类型 DurableOrchestrationContext
- mysql - 如何操作 SQL 查询输出