- 버퍼
- 타입이 정해져 있지 않은 데이터의 연속 공간
- 이름으로 구별된다
- 버퍼를 사용하기 전에 사용할 이름을 예약 후 메모리 할당, 데이터 저장.
- 버퍼 객체를 위해 할당한 메모리를 데이터 스토어 라고 부른다.
- 버퍼를 사용하여 메모리 할당하기
- glBufferData
void glBufferData(
GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage )
;- target : 버퍼가 어떤 타깃에 바인딩될지?
Buffer Binding Target Purpose GL_ARRAY_BUFFER
Vertex attributes GL_ATOMIC_COUNTER_BUFFER
Atomic counter storage GL_COPY_READ_BUFFER
Buffer copy source GL_COPY_WRITE_BUFFER
Buffer copy destination GL_DISPATCH_INDIRECT_BUFFER
Indirect compute dispatch commands GL_DRAW_INDIRECT_BUFFER
Indirect command arguments GL_ELEMENT_ARRAY_BUFFER
Vertex array indices GL_PIXEL_PACK_BUFFER
Pixel read target GL_PIXEL_UNPACK_BUFFER
Texture data source GL_QUERY_BUFFER
Query result buffer GL_SHADER_STORAGE_BUFFER
Read-write storage for shaders GL_TEXTURE_BUFFER
Texture data buffer GL_TRANSFORM_FEEDBACK_BUFFER
Transform feedback buffer GL_UNIFORM_BUFFER
Uniform 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_R8
ubyte 1 YES R 0 0 1 GL_R16
ushort 1 YES R 0 0 1 GL_R16F
half 1 NO R 0 0 1 GL_R32F
float 1 NO R 0 0 1 GL_R8I
byte 1 NO R 0 0 1 GL_R16I
short 1 NO R 0 0 1 GL_R32I
int 1 NO R 0 0 1 GL_R8UI
ubyte 1 NO R 0 0 1 GL_R16UI
ushort 1 NO R 0 0 1 GL_R32UI
uint 1 NO R 0 0 1 GL_RG8
ubyte 2 YES R G 0 1 GL_RG16
ushort 2 YES R G 0 1 GL_RG16F
half 2 NO R G 0 1 GL_RG32F
float 2 NO R G 0 1 GL_RG8I
byte 2 NO R G 0 1 GL_RG16I
short 2 NO R G 0 1 GL_RG32I
int 2 NO R G 0 1 GL_RG8UI
ubyte 2 NO R G 0 1 GL_RG16UI
ushort 2 NO R G 0 1 GL_RG32UI
uint 2 NO R G 0 1 GL_RGB32F
float 3 NO R G B 1 GL_RGB32I
int 3 NO R G B 1 GL_RGB32UI
uint 3 NO R G B 1 GL_RGBA8
uint 4 YES R G B A GL_RGBA16
short 4 YES R G B A GL_RGBA16F
half 4 NO R G B A GL_RGBA32F
float 4 NO R G B A GL_RGBA8I
byte 4 NO R G B A GL_RGBA16I
short 4 NO R G B A GL_RGBA32I
int 4 NO R G B A GL_RGBA8UI
ubyte 4 NO R G B A GL_RGBA16UI
ushort 4 NO R G B A GL_RGBA32UI
uint 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)
댓글 없음:
댓글 쓰기