2016-10-27 2 views
0

glVertexAttribPointer를 사용하여 각 프레임 (~ 242kb)에 내 정점 데이터를로드하는 데 약 8ms가 걸립니다.
VBO를 사용하여 성능이 향상됩니까?
나는 여전히 전체 데이터를로드해야하기 때문에 대답이 '아니오'라고 생각합니다.
glBufferData가 glVertexAttribPointer보다 빠르게 데이터를로드하는 경우 성능 향상을 얻을 수있는 유일한 방법은
입니까?opengl es2 : VBO (Vertex Buffer Object) 사용의 이점

답변

2

정적 정점 데이터가있는 경우 VBO는 GPU 액세스 가능한 메모리에 데이터가 보관되어 있기 때문에 성능이 매우 유리합니다.

VBO 드라이버없이 glVertexAttribPointer를 사용할 때 모든 프레임에서 GPU 액세스 가능한 메모리에 정점 데이터를 복사해야합니다. 클라이언트 배열에 복사가 필요한 이유는 두 가지입니다.

  1. GPU는 모든 메모리에 액세스 할 수 없습니다. GPU 드라이버가 매핑 한 페이지 만 볼 수 있습니다.
  2. OpenGL은 glDraw *가 반환 된 후에 클라이언트 배열 메모리를 자유롭게 변경할 수 있다고 약속하지만 반환 후 GPU 렌더링은 비동기 적으로 발생합니다.

VBO 데이터는 드라이버에 의해 할당되고 GPU에 매핑됩니다. 동일한 버텍스 데이터를 유지하면 복사본이 생성되지 않습니다. glBufferSubData로 정점 배열의 일부만을 업데이트하면 업데이트도 최적화 할 수 있습니다. (예 : 정점 위치 업데이트가없는 텍스처 좌표 업데이트 만)

+0

내 정점 데이터가 변경 될 수 있습니다 (주로 도면 순서 변경) > 동일한 정점 데이터를 유지하면 복사본이 생성되지 않습니다.
이것이 glBufferData가 실제로 gpu 메모리에 데이터를 복사하지 않으며 클라이언트 측에서 정점 데이터를 수정 한 다음 glBufferData를 호출하여 추가 속도가 빨라진다는 의미입니까? – undefined

+1

#undefined No. 소프트웨어 메모리에서 GPU 메모리로 데이터를 옮길 때 어느 시점에서 복사해야합니다. 그러나 glBufferSubData 및 glMapBuffer를 사용하면 업데이트를 줄일 수 있습니다. 그러나 그림 순서를 변경해도 정점 데이터가 변경되어서는 안됩니다. glDrawElements와 함께 indeces를 사용하여 꼭지점 순서를 알 수 있습니다. 최신 GPU 렌더링 기본 아이디어는 가능한 한 정적 데이터를 사용하고 최소 동적 입력 (최소 동적 입력은 유니폼 만 또는 일부 버텍스 속성 일 수 있음)을 사용하여 셰이더가이를 동적으로 변환하도록합니다. 데이터가 변경 될 때마다 복사본, 할당 및 파이프 라인 마비가 발생할 수 있습니다. –

+0

glMapBuffer 란 GLES20 클래스 안에 그런 메소드가 없다는 것입니다. 이것이 꼭 필요한 버텍스 데이터의 복사를 피할 필요가 있다고 생각합니다. – undefined

관련 문제