2012-07-04 2 views
1

3 차원 공간에서 일부 쿼드 평면을 그리는 OpenGL을 사용하여 응용 프로그램을 만듭니다. 각 평면마다 서로 다른 꼭지점 좌표를 설정하기 전까지 모든 것이 잘 작동했습니다. 이제 새로운 좌표로 평면을 만들면 이전에 만들어진 평면 인 것처럼 그려집니다. 즉, 새로운 좌표는 노트가 사용됩니다.VBO가 QGLBuffer를 사용하여 업데이트되지 않습니다.

Qt 라이브러리와 함께 OpenGL을 사용하고 있습니다.

void Plane::initBuffers() 
{ 
    mVertexVBO.create(); //QGLBuffer 
    mIndexVBO.create(); //QGLBuffer 

    mVertexVBO.bind(); 
    mIndexVBO.bind(); 

    mVertexVBO.setUsagePattern(QGLBuffer::StaticDraw); 
    mIndexVBO.setUsagePattern(QGLBuffer::StaticDraw); 

    /* mVertices and mIndices are a QVarLengthArray object */ 
    Vertex* aVerts = mVertices.data(); 
    for(int i=0; i<4; ++i) 
    { 
     qDebug() << aVerts[i].x << " " << aVerts[i].y << " " << aVerts[i].z; 
    } 
    qDebug() << " --- "; 

    mVertexVBO.allocate(mVertices.data(), sizeof(Vertex)*4); 
    mIndexVBO.allocate(mIndices.data(), sizeof(GLuint)*6); 
} 

나는 두 개의 비행기를 만들었습니다. 그들 각자는 다음과 같은 좌표로 기본적으로 만들어집니다 :

-1 -1 0 
-1 1 0 
1 1 0 
1 -1 0 

내가
1 0 0 
0 0 0 
0 0 1 
1 0 1 

에 첫 비행기의 좌표를 변경하지만, 그 비행기는 정확히 같은 그리는 있습니다. 모델 매트릭스를 변경했기 때문에 다른 장소에서만 사용됩니다. QVarLengthArray는 올바르게 갱신됩니다 (위의 코드 실행은 저에게 그것을 보여 줬습니다).

누군가 내가 무엇을 놓치고 있는지 알고 있습니까?

+0

'QGLBuffer'를 사용하지 않으셨습니까? 버퍼 객체가 바인딩되어야하는 위치를 실제로 취하는'bind' 함수와 같은 중요한 API가 누락 된 것 같습니다. 또한 이러한 객체를 만들 때 어떤 유형 매개 변수를 사용합니까? –

+0

예. 이게 내 B 계획이야. QGLBuffer는 약간의 이점을 제공하기 때문에 (그렇게 다루기가 더 쉽다) 나는 그렇게하고 싶지 않다. QGLBuffer 객체를 만들기 위해 Qt 매개 변수를 전달하여 버퍼 유형 (정점, 인덱스 ...)을 결정했습니다. Qt 문서에 따르면, 언급 한 매개 변수는 내부적으로 QGLBuffer로 처리됩니다. 답변 해주셔서 감사합니다! –

답변

2

문제가 해결되었습니다. 사실 VBO와 관련된 문제는 없었습니다 ... 방금 법선을 업데이트하지 않고 비행기가 (예상대로) 완전히 어둡습니다 (보이지 않음). 다행히도 아무도이 문제에 대해 생각할 시간을 잃어 버리지 않았습니다 ... 죄송합니다! = D

관련 문제