2015-01-02 3 views
1

메쉬가 여러 개 있습니다. 모든 항목에는면, 정점, 법선, 색상 및 텍스처 좌표의 자체 목록이 있습니다.하나에 버퍼 추가

수 있습니까 루프하지만 내 모든 항목 및 속성 0에 대한 glVertexAttribPointer에 호출을 반복한다, 이것은 즉

glBindBuffer(vbo); 
for(Entry* e : entries) { 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, e->vertices); 
    ... 
} 

을? : 같은 단일 버퍼 객체에 속성의 데이터를 cummulate하는 glVertexAttribPointer를 사용 버퍼 vbo 전에 지적 된 데이터를 다시 작성 하시겠습니까?

예인 경우 전체 버퍼에 대해 glVertexAttribPointer을 한 번만 호출하기 전에 모든 꼭지점을 하나의 연속 메모리 블록으로 복사하는 효과적인 해결책이 있습니까?

답변

2

glVertexAttribPointer는 마지막으로 입력 한 정보 만 저장합니다 (각 속성에 대해). 따라서 버퍼를 추가하는 것은이 방법으로는 불가능합니다.

  1. 문제 별도의 단일 버퍼로 모든 버퍼 오프
  2. 복사 된 데이터를 인출 전화 1 무 통화를 발행 각각의 버퍼에 대한 : 당신은 당신 같은 상황이있을 때

    당신은 두 가지 옵션이 있습니다 그것을 위해. 이 경우, 결합 된 버퍼의 올바른 위치를 가리 키도록 인덱스를 조정해야 할 수도 있습니다.

+0

음 ... 그게 내가 생각한 것입니다. 메쉬 로딩 전체를 다시해야합니다. TStill, 고마워! – user35443

2

glVertexAttribPointer() 아무 것도 복사하지 않습니다. 정점 데이터를 가져올 위치를 지정하는 상태 만 설정합니다. 동일한 속성에 대해 반복적으로 호출하면 각 호출이 이전 상태를 대체하고 마지막 호출이 우선합니다.

OpenGL 3.1부터는 한 버퍼에서 다른 버퍼로 데이터를 복사 할 수있는 glCopyBufferSubData() 호출 (man page)이 있습니다. 이것을 사용하여 모든 공간에 대해 충분한 공간을 가진 버퍼를 할당 한 다음 더 작은 버퍼를 모든 버텍스를 포함하는 버퍼로 복사 할 수 있습니다.

이런 식으로 사용하는 것은 좋은 생각처럼 들리지 않습니다. 모든 버텍스를 같은 버퍼에 넣고 싶다면 처음부터 바로 그 버퍼에 버텍스를 저장하는 것이 훨씬 쉽고 효율적입니다.

각 그리기 호출에서 정점 데이터를 복사해서는 안됩니다. 드로우 호출 수를 줄이는 것이 바람직하지만, 정점 데이터를 복사하는 것은 보다 비쌉니다.

+0

설명해 주셔서 감사합니다. 나는 그것을 결국 하나의 버퍼에 모든 것을 저장하도록 다시 썼다. – user35443