正确使用glCopyBufferSubData

时间:2014-02-27 19:44:55

标签: opengl

这是对this问题的跟进。

我已经设置了这样的Copy Constructor:

glGenBuffers(1, &m_vertexBuffer);
glGenBuffers(1, &m_colorBuffer);
glGenBuffers(1, &m_indexBuffer);
glGenVertexArrays(1, &m_vertexArray);

glBindVertexArray(m_vertexArray);

GLint size = 0;

glBindBuffer(GL_COPY_READ_BUFFER, other.m_indexBuffer);
glGetBufferParameteriv(GL_COPY_READ_BUFFER, GL_BUFFER_SIZE, &size);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, nullptr, GL_STATIC_DRAW);
glCopyBufferSubData(other.m_indexBuffer, m_indexBuffer, 0, 0, size);

glBindBuffer(GL_COPY_READ_BUFFER, other.m_vertexBuffer);
glGetBufferParameteriv(GL_COPY_READ_BUFFER, GL_BUFFER_SIZE, &size);
glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, size, nullptr, GL_STATIC_DRAW);
glCopyBufferSubData(other.m_vertexBuffer, m_vertexBuffer, 0, 0, size);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void *) 0);
glEnableVertexAttribArray(0);

glBindBuffer(GL_COPY_READ_BUFFER, other.m_colorBuffer);
glGetBufferParameteriv(GL_COPY_READ_BUFFER, GL_BUFFER_SIZE, &size);
glBindBuffer(GL_ARRAY_BUFFER, m_colorBuffer);
glBufferData(GL_ARRAY_BUFFER, size, nullptr, GL_STATIC_DRAW);
glCopyBufferSubData(other.m_colorBuffer, m_colorBuffer, 0, 0, size);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void *) 0);
glEnableVertexAttribArray(1);

glBindVertexArray(0);  

但是,在第一次glGetBufferParameteriv调用之后,size是0。它在索引缓冲区上的工作方式不同吗我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

您没有将实际缓冲区对象名称传递给glCopyBufferSubData (...),您将枚举缓冲区对象的位置传递给枚举。有趣的是,没有为您尝试执行的操作定义错误状态,但实际上应该创建GL_INVALID_ENUM错误。

使用GL_COPY_READ_BUFFER等你是在正确的轨道上。这是一个特殊的绑定位置,不会破坏当前使用绑定缓冲区对象的任何其他内容,但是当你开始时你自己开枪了传递缓冲区对象名称。

最简单的解决方案是对要复制的对象使用GL_COPY_READ_BUFFER,为正在创建的新对象使用GL_COPY_WRITE_BUFFER

以下是一些略微修改的代码行,显示了这一点:

glBindBuffer           (GL_COPY_READ_BUFFER, other.m_indexBuffer);
glGetBufferParameteriv (GL_COPY_READ_BUFFER, GL_BUFFER_SIZE, &size);

glBindBuffer           (GL_COPY_WRITE_BUFFER, m_indexBuffer);
glBufferData           (GL_COPY_WRITE_BUFFER, size, nullptr, GL_STATIC_DRAW);

glCopyBufferSubData    (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, size);