2016-06-23 6 views
0

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 바인딩의 순서를 생각 나는 잘못되고 여기 코드는 그게 옳은 일인 지 모르겠습니다. 어떤 도움을 주셔서 감사합니다.

+1

여기에 실제 OpenGL이 있습니까? 아니면 모든 종류의 래퍼를 사용하고 계십니까? –

+0

Qt에서 제공하는 래퍼를 사용합니다. http://doc.qt.io/qt-5/qopenglvertexarrayobject.html http://doc.qt.io/qt-5/qopenglbuffer.html – vigilanum

+0

... 와우. Qt의 래퍼는 * garbage *입니다. 나는 더 나쁜 것을 말할 수 없다 :'setAttributeBuffer'를 버텍스 상태와 아무 관계가없는 타입의 멤버로 만들었거나 버퍼 객체를 직접적으로 넘겨 줄 수는 없다. 그것은 [glVertexAttribPointer'의 가장 나쁜 부분입니다.] (http://stackoverflow.com/q/37972229/734069). 나는 감동; 그것은 틀리게 * 망칠 진정한 노력이 필요합니다. –

답변

2
glDrawElements(GL_TRIANGLES, 3, GL_FLOAT, 0); 

귀하의 지수 GLushort의 float가 아닌 있습니다. GL_INVALID_ENUM 오류가 발생 했어야합니다. GL 오류가 있는지 항상 확인해야합니다.

또한 shaderProgram->disableAttributeArray(0);은 완전히 필요하지 않습니다. 활성화/비활성화 상태는 VAO의 일부입니다 (Qt의 바보 래퍼와 반대로). 속성을 해제하면 VAO가 언 바운드되므로 바뀌지 않습니다. 그리고 어쨌든 그것을 비활성화하고 싶지는 않습니다.

마지막이있다 :

shaderProgram->enableAttributeArray(0); 
shaderProgram->setAttributeBuffer(positionLocation, GL_FLOAT, 0, 3, 0); 

이러한 기능의 모두의 첫 번째 매개 변수가 동일해야합니다. 그들은 아마도 그렇습니다. 따라서 이것은 양성 버그에 가깝습니다. 하지만 여전히 잘못된 것입니다.

+0

감사합니다. 이제 그림이 작동합니다. Qt를 사용할 필요가 없다면 확신 할 수 없다. – vigilanum

+2

@vigilanum : Qt의 래퍼를 사용하지 않아도됩니다. Qt를 사용하여 윈도우를 만들고 직접 OpenGL 호출을 사용하여 렌더링 할 수 있습니다. –

+0

글쎄, 그 과제가 지시하기 때문에해야만 해. – vigilanum

관련 문제