gpt4 book ai didi

ios - 为什么将 GL_ELEMENT_ARRAY_BUFFER 绑定(bind)到 0 会产生内存移动错误?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:59:49 24 4
gpt4 key购买 nike

我有一个错误,我花了很长时间才修复。在我评论以下行之前,我一直收到 EXC_BAD_ACCESS 和对 memmove 错误的引用而没有任何进一步的描述:

[自加载着色器];

glGenVertexArraysOES(1, &_vao);
glBindVertexArrayOES(_vao);

// Vertex Buffer
glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);

glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);

glEnableVertexAttribArray(ATTRIB_TEXTURE);
glVertexAttribPointer(ATTRIB_TEXTURE, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 7));

// Index Buffer
glGenBuffers(1, &_indexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW);

glBindBuffer(GL_ARRAY_BUFFER,0);

////////// COMMENTED THIS ONE //////////////
//glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);//
////////////////////////////////////////////

glBindVertexArrayOES(0);

我认为将缓冲区绑定(bind)到 0 意味着解除绑定(bind),所以我真的不明白这会如何导致我的应用程序崩溃。

感谢提供信息!我只是不关心这个问题......

我的结构:

const Vertex Vertices[4] = {
{{0.75, -1, 0}, {1, 0, 0, 1}, {0.125, 0.833496}},
{{0.75, 1, 0}, {0, 1, 0, 1}, {0.125, 1}},
{{-0.75, 1, 0}, {0, 0, 1, 1}, {0, 1}},
{{-0.75, -1, 0}, {0, 0, 0, 1}, {0, 0.833496}},
};

const GLushort Indices[6] =
{
0, 1, 2,
2, 3, 0
};

最佳答案

从你的代码来看,这个函数似乎在一些初始化例程中,你在其中初始化你的属性数据,这些数据存储在绑定(bind)的 VAO 中,因此在绘制时你只需要绑定(bind) VAO。

一个 VAO 依次封装了绘制 VBO 所需的所有状态,即属性的启用标志(由 gl(En/Dis)ableVertexAttribArray 设置)、属性源和属性(设置使用 glVertexAttribPointer), 当前绑定(bind)的索引缓冲区(使用 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ...) 设置)。请注意,它不存储当前绑定(bind)的顶点缓冲区,因为此信息存储在属性状态中。

那么发生的事情是,您创建并绑定(bind)索引缓冲区,设置其数据,然后解除绑定(bind),同时 VAO 仍然处于事件状态。因此 VAO 状态将存储 0GL_ELEMENT_ARRAY_BUFFER 绑定(bind)。当你现在用

画东西时
glBindVertexArrayOES(_vao);
glDrawElements(...);

没有缓冲区限制,glDrawElements 失败,因为 VAO 不适用于客户端数组。您要么必须为索引数据使用 VBO,要么绘制非索引图元(使用 glDrawArrays)。

也不会

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
glBindVertexArrayOES(_vao);
glDrawElements(...);

工作,因为绑定(bind)索引缓冲区在绑定(bind)时被 VAO 覆盖(其索引缓冲区为 0)。如果您先绑定(bind) VAO,然后绑定(bind)索引缓冲区,它会起作用,但这只会避免问题。

从概念上讲,绑定(bind)的 GL_ELEMENT_ARRAY_BUFFER 是 VAO 状态的一部分,因此您不应在 VAO 初始化例程中将其绑定(bind)到 0(仅当您不需要任何索引数据)。在使用 VAO 时,您也不允许将客户端数组用于索引或顶点数据。如果您不想绘制索引几何体,只需使用 glDrawArrays 而不是 glDrawElements,但是索引缓冲区无论如何都已过时。

关于ios - 为什么将 GL_ELEMENT_ARRAY_BUFFER 绑定(bind)到 0 会产生内存移动错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10545479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com