2018년 3월 20일 화요일

5.1 버퍼


  1. 버퍼
    1. 타입이 정해져 있지 않은 데이터의 연속 공간
    2. 이름으로 구별된다
    3. 버퍼를 사용하기 전에 사용할 이름을 예약 후 메모리 할당, 데이터 저장.
    4. 버퍼 객체를 위해 할당한 메모리를 데이터 스토어 라고 부른다.
    5. 버퍼를 사용하여 메모리 할당하기
      1. glBufferData
        1. void glBufferData(GLenum target,
          GLsizeiptr size,
          const GLvoid * data,
          GLenum usage);
          1. target : 버퍼가 어떤 타깃에 바인딩될지?
            1. Buffer Binding TargetPurpose
              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
          2. size : 버퍼 사이즈
          3. data : 초기화 데이터 (NULL 가능)
          4. usage : 버퍼를 어떤 목적으로 사용 할 것인지. 
            1. The symbolic constant must be GL_STREAM_DRAWGL_STREAM_READGL_STREAM_COPYGL_STATIC_DRAWGL_STATIC_READGL_STATIC_COPYGL_DYNAMIC_DRAW,GL_DYNAMIC_READ, or GL_DYNAMIC_COPY.
        2. glGenBuffers
          1. void glGenBuffers(GLsizei n,
            GLuint * buffers);
            1. 버퍼를 생성하고 GLuint 형의 핸들러를 생성한다.
        3. Example
          1. GLuint buffer;

            glGenBuffers(1, &buffer);

            glBindBuffer(GL_ARRAY_BUFFER, buffer);

            glBufferData(GL_ARRAY_BUFFER, 1024*1024, NULL, GL_STATIC_DRAW);
            1. 버퍼 생성 후 바인드. 해당 버퍼에는 1MB의 공간 할당.
            2. NULL대신에 데이터 포인터 삽입시, 해당 데이터로 초기화 가능.
        4. glBufferSubData
          1. 버퍼에 데이터를 저장
          2. void glBufferSubData(GLenum target,
            GLintptr offset,
            GLsizeiptr size,
            const GLvoid * data);
            1. target : 위와 동일한 바인딩 타겟
            2. offset : 데이터 시작 위치 (byte)
            3. size : offset으로부터 저장할 데이터 크기
            4. data : 저장할 데이터의 포인터
          3. Example
            1. static const float data[] = {~};
              glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(data), data);
        5. glMapBuffer
          1. 버퍼에 데이터를 저장
          2. void *glMapBuffer(GLenum target,
            GLenum access);
            1. target : 위와 동일한 바인딩 타겟
            2. access : access policy.
              The symbolic constant must be GL_READ_ONLYGL_WRITE_ONLY, or GL_READ_WRITE.
          3. Example
            1. static const float data[] = {~};

              void *ptr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);

              memcpy(ptr, data, sizeof(data));

              glUnmapBuffer(GL_ARRAY_BUFFER);
          4. 호출 당시 모든 데이터가 준비되지 않은 상황에서 유용하다. 데이터를 생성하거나 읽어서 메모리에 담아 둘 필요 없이, 파일 내용을 매핑된 버퍼로 직접 읽어들일 수 있음.
          5. glUnmapBuffer 호출 시 데이터 복사본을 유지하지 않음.
        6. glClearBufferSubData
          1. 버퍼에 저장하려는 데이터가 하나의 상수값일 때 유용함.
          2. void glClearBufferSubData(GLenum target,
            GLenum internalformat,
            GLintptr offset,
            GLsizeiptr size,
            GLenum format,
            GLenum type,
            const void * data);
            1. target : 위와 동일한 바인딩 타겟
            2. internalformat
              1. Sized Internal FormatBase TypeComponentsNorm0123
                GL_R8ubyte1YESR001
                GL_R16ushort1YESR001
                GL_R16Fhalf1NOR001
                GL_R32Ffloat1NOR001
                GL_R8Ibyte1NOR001
                GL_R16Ishort1NOR001
                GL_R32Iint1NOR001
                GL_R8UIubyte1NOR001
                GL_R16UIushort1NOR001
                GL_R32UIuint1NOR001
                GL_RG8ubyte2YESRG01
                GL_RG16ushort2YESRG01
                GL_RG16Fhalf2NORG01
                GL_RG32Ffloat2NORG01
                GL_RG8Ibyte2NORG01
                GL_RG16Ishort2NORG01
                GL_RG32Iint2NORG01
                GL_RG8UIubyte2NORG01
                GL_RG16UIushort2NORG01
                GL_RG32UIuint2NORG01
                GL_RGB32Ffloat3NORGB1
                GL_RGB32Iint3NORGB1
                GL_RGB32UIuint3NORGB1
                GL_RGBA8uint4YESRGBA
                GL_RGBA16short4YESRGBA
                GL_RGBA16Fhalf4NORGBA
                GL_RGBA32Ffloat4NORGBA
                GL_RGBA8Ibyte4NORGBA
                GL_RGBA16Ishort4NORGBA
                GL_RGBA32Iint4NORGBA
                GL_RGBA8UIubyte4NORGBA
                GL_RGBA16UIushort4NORGBA
                GL_RGBA32UIuint4NORGBA
            3. format : GL_RED, GL_RG, GL_RGB, GL_RGBA 중 하나로 지정
            4. type : 컴포넌트의 데이터 타입 (GL_UNSIGNED_BYTE, GL_FLOAT, GL_UNSIGNED_INT 등)
        7. glCopyBufferSubData
          1. 버퍼 간 데이터의 복사
          2. void glCopyBufferSubData(GLenum readTarget,
            GLenum writeTarget,
            GLintptr readOffset,
            GLintptr writeOffset,
            GLsizeiptr size);
            1. readTarget, writeTarget : 버퍼 바인딩 타겟
            2. readOffset, writeOffset : 데이터 시작지점(offset)
            3. size : 크기
            4. readtarget, writeTarget은 서로 데이터를 복사 할 두 버퍼가 바인딩된 타깃이다.
              1. 가용한 버퍼 바인딩 포인트에 바인딩되어 있어야 한다.
              2. 하지만 버퍼는 한 번에 오직 한 버퍼만 바인딩 가능
                1. GL_ARRAY_BUFFER 타깃인 두 버퍼간에는 복사가 불가능
              3. 이를 위해 OpenGL에서는 GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER 타깃을 제공함.

댓글 없음:

댓글 쓰기