엉뚱하고 기발하게

Vertex Buffer Object(VBO) 본문

Graphics/OpenGL

Vertex Buffer Object(VBO)

songsmir 2020. 10. 11. 12:24

본 블로그는 개인적인 공부를 목적으로 작성되었습니다. 

작성된 블로그의 내용은 다른 사이트, 블로그를 참고하였으며, 저작권 문제가 있다면 수정하겠습니다.

또한 잘못된 내용으로 인한 불이익은 사용자에게 있습니다.


블로그의 내용은 VS Code에 C++, OpenGL 개발 환경이 설정 되었음을 가정합니다.

만약, 설정되지 않았다면 "OpenGL 개발 환경 설정(VS Code)"를 통해 설정 후 진행세요.


 

Vertex Buffer Object(VBO)는 Video Device(즉, GPU)에 Vertex Data(position, normal, vector, color, etc)를 관리하기 위해 사용하는 기능입니다.

 

VBO를 사용하기 위해서 아래의 4가지 함수를 사용합니다.

 

  • glGenBuffers(sizei n, uint *buffers)
  • glBindBuffer(enum target, uint buffer)
  • glBufferData(enum target, sizeiptrARB size, const void *data, enum usage)
  • glDeleteBuffers(sizei n, const uint *buffers)

 

1. glGenBuffers

생성할 Buffer Object의 수를 지정합니다. 성공하면 unsigned int형 Buffer Object ID를 리턴합니다.

 

void glGenBuffers(GLsizei n​, GLuint * buffers​);

 

  • n
    생성할 Buffer Object 수를 지정합니다.

  • buffers
    생성된 Buffer Object IDs를 리턴합니다.

 

2. glBindBuffer

입력된 심볼의 버퍼를 활성화(바인딩)합니다.

 

void glBindBuffer(GLenum target​, GLuint buffer​);

 

  • target
    활성화 할 버퍼 심볼을 지정합니다.

  • buffer
    사용할 Buffer Object ID를 입렵합니다.

 

더보기

target 심볼

GL_ARRAY_BUFFER, GL_ATOMIC_COUNTER_BUFFER, GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, GL_DRAW_INDIRECT_BUFFER, GL_DISPATCH_INDIRECT_BUFFER, GL_ELEMENT_ARRAY_BUFFER, GL_PIXEL_PACK_BUFFER, GL_PIXEL_UNPACK_BUFFER, GL_QUERY_BUFFER, GL_SHADER_STORAGE_BUFFER, GL_TEXTURE_BUFFER, GL_TRANSFORM_FEEDBACK_BUFFER, or GL_UNIFORM_BUFFER.

 

 

3. glBufferData

​실제 GPU 메모리를 할당 합니다.

 

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

 

  • target
    생성 및 초기화 할 버퍼 타입을 지정합니다.

  • size
    생성할 버퍼의 크기를 지정 합니다. 단위는 byte 입니다.

  • data
    생성시 버퍼를 초기화 할 데이터의 포인터를 지정합니다, NULL 입력시 데이터의 복사 없이 진행합니다.

  • usage
    버퍼의 사용 패턴을 지정합나다.

 

더보기

target 심볼

GL_ARRAY_BUFFER, GL_ATOMIC_COUNTER_BUFFER, GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, GL_DRAW_INDIRECT_BUFFER, GL_DISPATCH_INDIRECT_BUFFER, GL_ELEMENT_ARRAY_BUFFER, GL_PIXEL_PACK_BUFFER, GL_PIXEL_UNPACK_BUFFER, GL_QUERY_BUFFER, GL_SHADER_STORAGE_BUFFER, GL_TEXTURE_BUFFER, GL_TRANSFORM_FEEDBACK_BUFFER, or GL_UNIFORM_BUFFER.

 

usage 패턴

GL_STREAM_DRAW, GL_STREAM_READ, GL_STREAM_COPY, GL_STATIC_DRAW, GL_STATIC_READ, GL_STATIC_COPY, GL_DYNAMIC_DRAW, GL_DYNAMIC_READ, or GL_DYNAMIC_COPY.

4. glDeleteBuffers

​Buffer Objects를 제거합니다.

 

void glDeleteBuffers(GLsizei n​, const GLuint * buffers​);

  • n
    제거할 Buffer Object 수를 지정합니다.

  • buffers
    제거할 Buffer Object IDs를 지정합니다.

 

5. 사용 예

	// 정점 배열
    float vertices[] =
    {
        -0.5f, -0.5f, 0.0f,
         0.5f, -0.5f, 0.0f,
         0.0f,  0.5f, 0.0f
    };

    unsigned int VBO;
    // VBO ID 생성
    glGenBuffers(1, &VBO);

    // VBO 바인딩
    glBindBuffer(GL_ARRAY_BUFFER, VBO);

    // VBO 메모리 확보, 초기화, 복사
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    // VBO 제거
    glDeleteBuffers(1, &VBO);

 


https://whilescape.tistory.com/entry/OpenGL-%EC%98%A4%ED%94%88%EC%A7%80%EC%97%98-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B4%80%EB%A0%A8-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC1

https://mr-dingo.github.io/opengl/2019/01/02/VAOandVBO.html

https://learnopengl.com/

https://en.wikipedia.org/wiki/Vertex_buffer_object

https://www.khronos.org/opengl/wiki/Category:Core_API_Reference

'Graphics > OpenGL' 카테고리의 다른 글

Lambertian reflectance  (0) 2020.10.19
Blinn-Phong reflection model  (0) 2020.10.19
Phong reflection model(Phong lighting model)  (0) 2020.10.19
Comments