绘制元素后无法绘制数组

比尔格斯普

我绘制了一个巨大的彩色表面(超过130万个索引)。该表面用“彩色顶点”索引。每当我尝试在缓冲的三角形(彩色顶点)之后绘制非缓冲的三角形时,都不会出现非缓冲的三角形。

如果我跳过绘制曲面(缓冲的三角形),则非缓冲的三角形将按其原样进行绘制。

绘制缓冲的顶点:

// Bind array buffer
arrayBuffer->bind();

// Set position of vertices
int posLocation = program->attributeLocation("a_position");
program->enableAttributeArray(posLocation);
program->setAttributeBuffer(posLocation, GL_FLOAT, 0, 3, sizeof(ColoredVertex));

// Set color of vertices
int colorLocation = program->attributeLocation("a_color");
program->enableAttributeArray(colorLocation);
program->setAttributeBuffer(colorLocation, GL_FLOAT, sizeof(QVector3D), 3, sizeof(ColoredVertex));
(GLfloat) 0.0);

// Bind index buffer and draw triangles
indexBuffer->bind();
glDrawElements(GL_TRIANGLES, indicesCount(), GL_UNSIGNED_INT, 0);

绘制非缓冲顶点(面):

if (faces.size() == 0) {
    qDebug("Tried to draw a textured block with no faces.");
    return;
}

int posLocation = program->attributeLocation("a_position");
int texcoordLocation = program->attributeLocation("a_texcoord");

// Draw faces
QHashIterator<Block::Side, Face> iterator(faces);
while (iterator.hasNext()) {
    Face face = iterator.next().value();

    program->setAttributeArray(posLocation, face.coordinates.constData());
    program->enableAttributeArray(posLocation);

    program->setAttributeArray(texcoordLocation, face.textureCoordinates.constData());
    program->enableAttributeArray(texcoordLocation);

    glDrawArrays(GL_LINES, 0, 6);
}
比尔格斯普

该错误似乎是由于未禁用属性数组和正确释放缓冲区对象引起的。以下代码可以正常工作。

绘制缓冲的顶点:

// Bind array buffer
arrayBuffer->bind();

int posLocation = program->attributeLocation("a_position");
int colorLocation = program->attributeLocation("a_color");

program->enableAttributeArray("a_position");
program->enableAttributeArray("a_color");

program->setAttributeBuffer(posLocation, GL_FLOAT, 0, 3, sizeof(ColoredVertex));
program->setAttributeBuffer(colorLocation, GL_FLOAT, sizeof(QVector3D), 3, sizeof(ColoredVertex));

// Bind index buffer and draw triangles
indexBuffer->bind();
glDrawElements(GL_TRIANGLES, indicesCount(), GL_UNSIGNED_INT, 0);
indexBuffer->release();

program->disableAttributeArray(posLocation);
program->disableAttributeArray(colorLocation);

arrayBuffer->release();

绘制非缓冲顶点(面):

if (faces.size() == 0) {
    qDebug("Tried to draw a textured block with no faces.");
    return;
}

int posLocation = program->attributeLocation("a_position");
int texcoordLocation = program->attributeLocation("a_texcoord");

program->enableAttributeArray(posLocation);
program->enableAttributeArray(posLocation);

program->enableAttributeArray(texcoordLocation);
program->enableAttributeArray(texcoordLocation);

// Draw faces
QHashIterator<Block::Side, Face> iterator(faces);
while (iterator.hasNext()) {
    Face face = iterator.next().value();

    program->setAttributeArray(posLocation, face.coordinates.constData());
    program->setAttributeArray(texcoordLocation, face.textureCoordinates.constData());

    glDrawArrays(GL_TRIANGLES, 0, face.coordinates.size());
}

program->disableAttributeArray(posLocation);
program->disableAttributeArray(texcoordLocation);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章