본문 바로가기
C++ 200제/코딩 IT 정보

[OpenGL ES] 4. 버퍼 오브젝트(Buffer Object) 알아보기

by vicddory 2017. 10. 22.

[OpenGL ES] 4. 버퍼 오브젝트(Buffer Object) 알아보기


OpenGL ES 버퍼 오브젝트[[OpenGL ES] 4. 버퍼 오브젝트(Buffer Object) 알아보기]


Buffer Objects

Buffer Object는 primitive(기본 도형)의 배열을 저장하는데 최적화 되어있으며 두 종류로 구분된다.


첫번째, VBO는 꼭지점 배열을 저장한다.

VBO는 어떤 종류의 원본 데이터라도 복사, 저장하기에 Buffer Object를 생성하면 원본 데이터는 삭제해도 된다.


두번째, IBO는 Index(순서) 배열이며, index들은 VBO의 데이터들을 가리킨다.

일반적으로 IBO의 데이터 타입은 Glubyte 또는 Glushort이며, IBO를 만드는 과정은 Frame buffer와 Render buffer를 만드는 것과 비슷하다.


Buffer Objects Creation


GLvoid glGenBuffers(GLsizei n, GLuint* buffers)

- n: The number representing how many buffer objects's names/ids will be generated at once.

- buffers: A pointer to a variable to store the generated names/ids. If more than one name/id was generated, this pointer will point to the start of an array.


GLvoid glBindBuffer(GLenum target, GLuint buffer)

- target: The target will define what kind of buffer object will be, VBO or IBO. The values can be:

- GL_ARRAY_BUFFER: This will set a VBO (or ABO, whatever).

- GL_ELEMENT_ARRAY_BUFFER: This will set an IBO.

- buffer: The name/id of the frame buffer to be bound.


Buffer Object는 두 개의 속성으로 설정할 수 있다. (GL_ARRAY_BUFFER와 GL_ELEMENT_ARRAY_BUFFER)


Buffer Objects Properties

GLvoid glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)

- target : 원하는 형태로 buffer를 설정.

- 이 글의 예제에선 GL_ARRAY_BUFFER 또는 GL_ELEMENT_ARRAY_BUFFER를 사용.


- size : 기본 단위의 크기 (bytes).

- data : Pointer로 넘길 데이터.

- usage : 3D를 표현할 방법(OpenGL의 optimize 참조).


- GL_STATIC_DRAW : 데이터의 변경이 거의 없음.

- GL_DYNAMIC_DRAW : 자주 변경되는 데이터.

- GL_STREAM_DRAW : 임시 데이터 사용시 선택.


Object-C에선 개발자를 위해 자동으로 릴리즈. 한번 설정해 놓으면 자동으로 버퍼를 없앤다(destroy).


이제 이 함수들이 뭘 만드는지 알아보자.


glBufferData 함수는 Buffer Object에 컨텐츠와 속성을 설정한다.


Usage 인자로 GL_DYNAMIC_DRAW를 설정하면 나중에 데이터가 바뀌며, glBufferSubData 함수를 통해 필요한 데이터가 업데이트 된다.


[OpenGL ES] 4. 버퍼 오브젝트(Buffer Object) 알아보기[[OpenGL ES] 4. 버퍼 오브젝트(Buffer Object) 알아보기]


glBufferSubData를 사용할 때 buffer object의 크기는 고정이기에 변경은 불가능하다. 데이터 수정에 따른 최적화를 위해서 전체 버퍼 중 작은 부분만을 수정하라.


개인적으론 GL_DYNAMIC_DRAW를 좋아하지 않는다. 부하가 크기 때문이다.


3차원 세계에서는 원본 꼭지점 데이터(original vertex data), 법선 데이터(normal data), 텍스쳐 좌표 데이터(texture coordinate) 처럼 변화하는 것들이 있는데, Shader를 사용해서도 위의 데이터와 관련된 거의 모든 것을 변경할 수 있다.


그래서 나는 Shader를 사용해 같은(비슷한) 효과를 낼 수 있는지를 먼저 고민하길 추천한다.


출처 : All About OpenGL ES 2.X 번역

[OpenGL ES] 4. 버퍼 오브젝트(Buffer Object) 알아보기

댓글