- 버퍼
- 타입이 정해져 있지 않은 데이터의 연속 공간
- 이름으로 구별된다
- 버퍼를 사용하기 전에 사용할 이름을 예약 후 메모리 할당, 데이터 저장.
- 버퍼 객체를 위해 할당한 메모리를 데이터 스토어 라고 부른다.
- 버퍼를 사용하여 메모리 할당하기
- glBufferData
void glBufferData(GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage );- target : 버퍼가 어떤 타깃에 바인딩될지?
Buffer Binding Target Purpose GL_ARRAY_BUFFERVertex attributes GL_ATOMIC_COUNTER_BUFFERAtomic counter storage GL_COPY_READ_BUFFERBuffer copy source GL_COPY_WRITE_BUFFERBuffer copy destination GL_DISPATCH_INDIRECT_BUFFERIndirect compute dispatch commands GL_DRAW_INDIRECT_BUFFERIndirect command arguments GL_ELEMENT_ARRAY_BUFFERVertex array indices GL_PIXEL_PACK_BUFFERPixel read target GL_PIXEL_UNPACK_BUFFERTexture data source GL_QUERY_BUFFERQuery result buffer GL_SHADER_STORAGE_BUFFERRead-write storage for shaders GL_TEXTURE_BUFFERTexture data buffer GL_TRANSFORM_FEEDBACK_BUFFERTransform feedback buffer GL_UNIFORM_BUFFERUniform block storage - size : 버퍼 사이즈
- data : 초기화 데이터 (NULL 가능)
- usage : 버퍼를 어떤 목적으로 사용 할 것인지.
- The symbolic constant must be
GL_STREAM_DRAW,GL_STREAM_READ,GL_STREAM_COPY,GL_STATIC_DRAW,GL_STATIC_READ,GL_STATIC_COPY,GL_DYNAMIC_DRAW,GL_DYNAMIC_READ, orGL_DYNAMIC_COPY. - glGenBuffers
void glGenBuffers(GLsizei n, GLuint * buffers );- 버퍼를 생성하고 GLuint 형의 핸들러를 생성한다.
- Example
- GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, 1024*1024, NULL, GL_STATIC_DRAW); - 버퍼 생성 후 바인드. 해당 버퍼에는 1MB의 공간 할당.
- NULL대신에 데이터 포인터 삽입시, 해당 데이터로 초기화 가능.
- glBufferSubData
- 버퍼에 데이터를 저장
void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data );- target : 위와 동일한 바인딩 타겟
- offset : 데이터 시작 위치 (byte)
- size : offset으로부터 저장할 데이터 크기
- data : 저장할 데이터의 포인터
- Example
- static const float data[] = {~};
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(data), data); - glMapBuffer
- 버퍼에 데이터를 저장
void *glMapBuffer(GLenum target, GLenum access );- target : 위와 동일한 바인딩 타겟
- access : access policy.
The symbolic constant must beGL_READ_ONLY,GL_WRITE_ONLY, orGL_READ_WRITE. - Example
- static const float data[] = {~};
void *ptr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
memcpy(ptr, data, sizeof(data));
glUnmapBuffer(GL_ARRAY_BUFFER); - 호출 당시 모든 데이터가 준비되지 않은 상황에서 유용하다. 데이터를 생성하거나 읽어서 메모리에 담아 둘 필요 없이, 파일 내용을 매핑된 버퍼로 직접 읽어들일 수 있음.
- glUnmapBuffer 호출 시 데이터 복사본을 유지하지 않음.
- glClearBufferSubData
- 버퍼에 저장하려는 데이터가 하나의 상수값일 때 유용함.
void glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void * data );- target : 위와 동일한 바인딩 타겟
- internalformat
Sized Internal Format Base Type Components Norm 0 1 2 3 GL_R8ubyte 1 YES R 0 0 1 GL_R16ushort 1 YES R 0 0 1 GL_R16Fhalf 1 NO R 0 0 1 GL_R32Ffloat 1 NO R 0 0 1 GL_R8Ibyte 1 NO R 0 0 1 GL_R16Ishort 1 NO R 0 0 1 GL_R32Iint 1 NO R 0 0 1 GL_R8UIubyte 1 NO R 0 0 1 GL_R16UIushort 1 NO R 0 0 1 GL_R32UIuint 1 NO R 0 0 1 GL_RG8ubyte 2 YES R G 0 1 GL_RG16ushort 2 YES R G 0 1 GL_RG16Fhalf 2 NO R G 0 1 GL_RG32Ffloat 2 NO R G 0 1 GL_RG8Ibyte 2 NO R G 0 1 GL_RG16Ishort 2 NO R G 0 1 GL_RG32Iint 2 NO R G 0 1 GL_RG8UIubyte 2 NO R G 0 1 GL_RG16UIushort 2 NO R G 0 1 GL_RG32UIuint 2 NO R G 0 1 GL_RGB32Ffloat 3 NO R G B 1 GL_RGB32Iint 3 NO R G B 1 GL_RGB32UIuint 3 NO R G B 1 GL_RGBA8uint 4 YES R G B A GL_RGBA16short 4 YES R G B A GL_RGBA16Fhalf 4 NO R G B A GL_RGBA32Ffloat 4 NO R G B A GL_RGBA8Ibyte 4 NO R G B A GL_RGBA16Ishort 4 NO R G B A GL_RGBA32Iint 4 NO R G B A GL_RGBA8UIubyte 4 NO R G B A GL_RGBA16UIushort 4 NO R G B A GL_RGBA32UIuint 4 NO R G B A - format : GL_RED, GL_RG, GL_RGB, GL_RGBA 중 하나로 지정
- type : 컴포넌트의 데이터 타입 (GL_UNSIGNED_BYTE, GL_FLOAT, GL_UNSIGNED_INT 등)
- glCopyBufferSubData
- 버퍼 간 데이터의 복사
void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size );- readTarget, writeTarget : 버퍼 바인딩 타겟
- readOffset, writeOffset : 데이터 시작지점(offset)
- size : 크기
- readtarget, writeTarget은 서로 데이터를 복사 할 두 버퍼가 바인딩된 타깃이다.
- 가용한 버퍼 바인딩 포인트에 바인딩되어 있어야 한다.
- 하지만 버퍼는 한 번에 오직 한 버퍼만 바인딩 가능
- GL_ARRAY_BUFFER 타깃인 두 버퍼간에는 복사가 불가능
- 이를 위해 OpenGL에서는 GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER 타깃을 제공함.
2018년 3월 20일 화요일
5.1 버퍼
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기