2013-01-18 1 views
0

복잡한 배경을 렌더링하기 위해 여러 버텍스 배열 객체를 사용하는 렌더링 인프라가 있습니다. 각 정점 배열 객체는 자체적으로 바인드 된 버퍼, 포인터 및 속성 집합을 유지 관리합니다.여러 버텍스 배열 객체를 사용하는 렌더러에 깊이 버퍼를 소개합니다.

을 감안할 때 여러 배열이 어떻게 각각 별도의 배열 객체 렌더링 동안 동일한 깊이 버퍼를 사용하는 방식으로 깊이 버퍼링을 소개 않는, 렌더링에 대한 책임을 객체? 다른 말로하면, 어떻게하면 좀 더 글로벌 개념 인 것처럼 보이는 Vertex Array Objects (그리고 그 좋은 캡슐화 속성)와 깊이 버퍼링의 개념을 통일 할 수 있을까요?

내가 발견 한 모든 예제는 프레임 버퍼의 컨텍스트에서 깊이 버퍼를 사용하여 설명합니다. 애플은이 기술을 descibes here. 그렇다면 프레임 버퍼 레벨에서 깊이 버퍼링을 구현 한 다음 그 프레임 버퍼에 버텍스 배열 객체를 쓰는 기술이 있을까요? VAO와 깊이 버퍼링을 사용하는 예가 있습니까?

I는 정점 어레이 객체를 캡슐화하는 클래스를 가지며 이것은 (다양한 버퍼 포인터 및 속성을 설정해야)의 결합 방법이다.

void scene_GLBuffer::BindTriangles() 
{ 
    glBindVertexArrayOES(_mVertexArrayObject); 
    glGenVertexArraysOES(1, &_mVertexArrayObject); 

    // generate the buffer and configure the gl pointers for position and normal data 
    glGenBuffers(1, &_mVertexPositionNormalTriangles); 
    /* Bind and set up vertex position and normal data */ 
    glBindBuffer(GL_ARRAY_BUFFER, _mVertexPositionNormalTriangles); 
    glBufferData(GL_ARRAY_BUFFER, 
       sizeof(crVertexPN)*_mPositionNormalTriangleData->size(), 
       _mPositionNormalTriangleData->data(), 
       GL_STATIC_DRAW); 
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 
          sizeof(crVertexPN), (void*)offsetof(crVertexPN,Position)); 
    glEnableVertexAttribArray(GLKVertexAttribPosition); 
    glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 
          sizeof(crVertexPN), (void*)offsetof(crVertexPN,Normal)); 
    glEnableVertexAttribArray(GLKVertexAttribNormal); 

    // generate the buffer and configure the gl pointers for color and alpha data 
    glGenBuffers(1, &_mVertexColorTriangles); 
    glBindBuffer(GL_ARRAY_BUFFER, _mVertexColorTriangles); 
    glBufferData(GL_ARRAY_BUFFER, 
       sizeof(crVertexC)*_mColorTriangleData->size(), 
       _mColorTriangleData->data(), 
       GL_DYNAMIC_DRAW); 
    glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_TRUE, 
          sizeof(crVertexC), (void*)offsetof(crVertexC,Color)); 
    glEnableVertexAttribArray(GLKVertexAttribColor); 
    glBindBuffer(GL_ARRAY_BUFFER,0); 

    // generate the buffer and configure the gl pointers for triangle index data 
    glGenBuffers(1, &_mVertexIndexTriangles); 
    /* Bind and set up triangle index data */ 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _mVertexIndexTriangles); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(bits32)*_mIndexTriangleData->size(),_mIndexTriangleData->data(), GL_STATIC_DRAW); 
    //  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); 

    glBindVertexArrayOES(0); 
} 

바인딩 후, 추첨 방법은 다음과 같이 구현됩니다 (이 그리기 방법은 각 버텍스 버퍼 오브젝트에 호출) :

void scene_GLBuffer::Draw() 
{ 
    glBindVertexArrayOES(_mVertexArrayObject); 

    glBindBuffer(GL_ARRAY_BUFFER, _mVertexPositionNormalTriangles); 
    glDrawElements(GL_TRIANGLES, _mIndexTriangleData->size(), GL_UNSIGNED_INT, 0); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    glBindVertexArrayOES(0); 
} 

이 원활하게 작동 모든하지만 문제보고를 데 여기에 깊이 버퍼링이 들어갑니다.

답변

1

나는 문제가 깊이 버퍼링이에 맞는 경우 볼을 데.

왜냐하면 이 아니기 때문입니다.

정점 배열 객체는 정점 배열 상태를 캡슐화하는 방법입니다. 이 상태는 현재 프로그램 객체, 현재 바운드 텍스처 또는 프레임 버퍼와 같은 다른 상태와 아무 관련이 없습니다. 마지막 하나는 깊이 버퍼의 출처입니다.

VAO가있는 여러 객체를 동일한 프레임 버퍼로 렌더링하려면 은 단순히 프레임 버퍼을 변경하지 마십시오. 이것은 동일한 이미지에 모두 렌더링하는 방법입니다 (간단히 말해서 화면이라고 부름). 깊이 버퍼는 프레임 버퍼의 일부이므로 동일한 깊이 버퍼로 렌더링하려는 경우 다른 객체간에 프레임 버퍼를 변경하지 마십시오. 한마디로

, 개체의 Draw 기능은 둘 다 알지도 현재 사용중인 어떤 깊이 버퍼를 걱정해야한다. Draw 함수는 사용중인 프로그램, 바인딩 된 텍스처 및 현재 뷰포트가 무엇인지 알지 못하거나 신경 쓰지 않습니다.

+0

고맙습니다! 그것은 내 마음 속의 관계를 풀어 놓을 먼 길을 갔다. –

관련 문제