使用glVertexAttrib3f在glDrawArrays上崩溃

Crash on glDrawArrays with glVertexAttrib3f

本文关键字:崩溃 glDrawArrays glVertexAttrib3f 使用      更新时间:2023-10-16

我在glDrawArrays上看到了很多其他与EXC_BAD_ACCESS信号相关的帖子,但没有一个完全符合我的问题,所以就这样吧。

以下代码有效:

glEnableVertexAttribArray(mAttributes.position);
glEnableVertexAttribArray(mAttributes.color);
GLsizei stride = sizeof(Vertex);
const GLvoid* pPos = &mVertices2[0].mPos.x;
const GLvoid* pColors = &mVertices2[0].mColor.r;
glVertexAttribPointer(mAttributes.position, 2, GL_FLOAT, GL_FALSE, stride, pPos);
glVertexAttribPointer(mAttributes.color, 3, GL_FLOAT, GL_FALSE, stride, pColors);
glDrawArrays(GL_LINE_STRIP, 0, mVertices2.size());

但我似乎不能用一个不变的属性来书写颜色。这在glDrawArrays上崩溃:

glEnableVertexAttribArray(mAttributes.position);
glEnableVertexAttribArray(mAttributes.color);
glVertexAttribPointer(mAttributes.position, 2, GL_FLOAT, GL_FALSE, stride, pPos);
glVertexAttrib3f(mAttributes.color, 1.0f, 0.0f, 0.0f);
glDrawArrays(GL_LINE_STRIP, 0, mVertices2.size()); // <-- EXC_BAD_ACCESS because of the line above

有人知道为什么吗?是否只能使用glDrawElements的常量顶点属性调用?

您告诉OpenGL使用VertexAttribArray,然后您就不提供数组元素了。因此,OpenGL将尝试读取既没有分配也没有正确填充的内存。一定要做

glDisableVertexAttribArray(ARRAYINDEX) 

当您不提供特定数组的数据时。只使用glVertexAttrib3f()是可以的。但它不是一个数组,所以不需要启用数组就可以使用它。