Qt를 사용하는 인덱스 버퍼 인 vertex 버퍼 &과 정점 배열 오브젝트를 결합하려고합니다.Vertex Array 오브젝트와 Vertex Buffer & Index Buffer의 결합
다음 코드는 완벽하게 작업 VAO과 VBO을 결합 :
// Create buffers
void Tile::setupBuffers() {
vbo.create();
vbo.bind();
vbo.setUsagePattern(QOpenGLBuffer::StaticDraw);
vbo.allocate(vertices.constData(), vertices.size() * sizeof(QVector3D));
vbo.release();
vao.create();
shaderProgram->bind();
vao.bind();
vbo.bind();
shaderProgram->enableAttributeArray(0);
shaderProgram->setAttributeBuffer(positionLocation, GL_FLOAT, 0, 3, 0);
vao.release();
shaderProgram->disableAttributeArray(0);
vbo.release();
shaderProgram->release();
}
// Draw triangle
void Tile::draw() {
shaderProgram->bind();
vao.bind();
glDrawArrays(GL_TRIANGLES, 0, 3);
vao.release();
shaderProgram->release();
}
지금 인덱스 버퍼 아무것도 추가하지하기 위해 노력하고있어 맑은 색을 제외하고 그려됩니다. 여기
// Create buffers
void Tile::setupBuffers() {
vbo.create();
vbo.bind();
vbo.setUsagePattern(QOpenGLBuffer::StaticDraw);
vbo.allocate(vertices.constData(), vertices.size() * sizeof(QVector3D));
vbo.release();
ibo.create();
ibo.bind();
ibo.setUsagePattern(QOpenGLBuffer::StaticDraw);
ibo.allocate(indices.constData(), indices.size() * sizeof(GLushort));
ibo.release();
vao.create();
shaderProgram->bind();
vao.bind();
vbo.bind();
shaderProgram->enableAttributeArray(0);
shaderProgram->setAttributeBuffer(positionLocation, GL_FLOAT, 0, 3, 0);
ibo.bind();
vao.release();
shaderProgram->disableAttributeArray(0);
vbo.release();
ibo.release();
shaderProgram->release();
}
void Tile::draw() {
shaderProgram->bind();
vao.bind();
glDrawElements(GL_TRIANGLES, 3, GL_FLOAT, 0);
vao.release();
shaderProgram->release();
}
내 정점 벡터 & 인덱스 벡터의 내용은 다음과 같습니다 :
vertices = {
QVector3D(1.0f, -1.0f, 0.0f),
QVector3D(1.0f, 1.0f, 0.0f),
QVector3D(-1.0f, -1.0f, 0.0f)
};
indices = {
0, 1, 2
};
내가 두 번째 코드 블록에서 VAO/VBO/IBO 바인딩의 순서를 생각 나는 잘못되고 여기 코드는 그게 옳은 일인 지 모르겠습니다. 어떤 도움을 주셔서 감사합니다.
여기에 실제 OpenGL이 있습니까? 아니면 모든 종류의 래퍼를 사용하고 계십니까? –
Qt에서 제공하는 래퍼를 사용합니다. http://doc.qt.io/qt-5/qopenglvertexarrayobject.html http://doc.qt.io/qt-5/qopenglbuffer.html – vigilanum
... 와우. Qt의 래퍼는 * garbage *입니다. 나는 더 나쁜 것을 말할 수 없다 :'setAttributeBuffer'를 버텍스 상태와 아무 관계가없는 타입의 멤버로 만들었거나 버퍼 객체를 직접적으로 넘겨 줄 수는 없다. 그것은 [glVertexAttribPointer'의 가장 나쁜 부분입니다.] (http://stackoverflow.com/q/37972229/734069). 나는 감동; 그것은 틀리게 * 망칠 진정한 노력이 필요합니다. –