这是对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。它在索引缓冲区上的工作方式不同吗我错过了什么吗?
答案 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);