OpenGL绘制多个对象
OpenGL drawing several objects
人们通常如何在OpenGL 3.3+中绘制多个对象?我有两个对象:一个地形和一个球体。对于每个对象,我有2个数组(顶点和索引)。我尝试设置不同的VBO和IBO(像这样):
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)12);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)20);
glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBO);
glDrawElements(GL_TRIANGLES, (size-1)*(size-1)*6, GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ARRAY_BUFFER, m_VBOsphere);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBOsphere);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
但看起来GPU只在关闭这个函数后计算/绘制所有内容,而我只看到一个球体。那么,我该怎么办?
您似乎误解了绑定缓冲区的含义以及正确的调用顺序。
您预计在这个序列中,draw调用将从id为m_VBO
:的VBO获取其顶点
glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBO);
glDrawElements(GL_TRIANGLES, (size-1)*(size-1)*6, GL_UNSIGNED_INT, 0);
这不是它的工作方式。当前的GL_ARRAY_BUFFER
绑定对draw调用绝对没有影响。
调用glVertexAttribPointer()
时,需要绑定正确的VBO。除了指定相应属性(格式、步幅等)设置值的直接参数外,此调用还指定将当前绑定的VBO用作属性数据的源。
因此,您需要为每个对象调用glVertexAttribPointer()
,并在绑定相应的VBO后调用它们。
调用顺序为:
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)12);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)20);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBO);
glDrawElements(GL_TRIANGLES, (size-1)*(size-1)*6, GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ARRAY_BUFFER, m_VBOsphere);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)12);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)20);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBOsphere);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
如果要减少每次绘制调用前所需的设置调用次数,请查找"顶点阵列对象"(VAO)。
相关文章:
- 无法使用VAO和EBO(openGL)绘制多个对象
- 绘制一个对象,比较模具缓冲区的两个不同值
- 在 Vulkan 中绘制多个对象
- 当我尝试绘制 sf::Text 对象时,SFML 中的分段错误
- Opencv,在图像中的对象周围绘制一个框
- 将自定义可绘制对象存储在数组中会导致绘制时出现分割错误
- 使用OpenGL绘制更多对象时,性能会降低
- 如何在调用函数时将对象绘制到 sfml 窗口上
- SFML 2.4.2 在绘制 sf::Text 对象之前获取本地边界
- 如何确定我跟踪的对象球是否越过我绘制的线
- SFML 对象在重新初始化其父类时不会绘制
- SFML在另一个对象上方绘制对象
- 尝试使用对象作为输入来绘制QT创建者
- 如何使用多个VAO和VBO在OpenGL中绘制多个对象
- 为什么我的三角形对象没有被绘制?
- 为什么我的 OpenGL 对象相对于最后一个绘制的对象绘制
- 如何使用Qt在运行时从一个对象绘制到另一个对象的线条(或箭头)
- OpenGL 不会为不在命名空间中的对象绘制多边形
- 为同一类的两个对象绘制不同的图像
- 多对象绘制(OpenGL)