2018년 4월 22일 일요일

5.5.[1-3] 텍스쳐 생성 및 초기화, 텍스쳐 타깃과 타입, 쉐이더에서 텍스쳐 읽기


  1. 쉐이더에서 읽기/쓰기 가능한 구조화된 스토리지 형식
  2. 대부분 이미지 데이터로 사용
  3. 2D 레이아웃을 가장 일반적으로 사용하지만, (1차원, 3차원, 배열, 정육면체 등)으로 생성 가능하다.
  4. 텍스쳐 생성 및 초기화
    1. [생성 - 바인딩 - 텍스쳐 스토리지 할당]
    2. Example
      1. GLuint texture;

      2. glGenTextures(1, &texture);

      3. // GL_TEXTURE_2D 바인딩 포인트를 사용하여 컨텍스트에 바인딩
      4. glBindTexture(GL_TEXTURE_2D, texture);

      5. glTexStorage2D(
        GL_TEXTURE_2D,  // 2D텍스쳐
        1,  // 1 밉맵레벨
        GL_RGBA32F,  // 32비트 부동소수점 RGBA 데이터(텍스쳐 내부 포맷)
        256, 256);  // 256*256 텍셀
  5. 텍스쳐 데이터 갱신
    1. Example
      1. float *data = new float[256 * 256 * 4];

      2. // data에 이미지 데이터 삽입 프로세스

      3. glTexSubImage2D(
        GL_TEXTURE_2D,  // 2D 텍스쳐
        0,  // 레벨 0
        0, 0,  // 오프셋 0, 0
        256, 256,  // 256 * 256 텍셀, 전체 이미지 덮어씀
        GL_RGBA, // 4 Channel
        GL_FLOAT, // 부동 소수점
        data);

      4. delete [] data;
  6. 텍스쳐 타깃과 타입
    1. GL_TEXTURE_1DGL_TEXTURE_2DGL_TEXTURE_3DGL_TEXTURE_1D_ARRAYGL_TEXTURE_2D_ARRAYGL_TEXTURE_RECTANGLEGL_TEXTURE_CUBE_MAP,GL_TEXTURE_CUBE_MAP_ARRAYGL_TEXTURE_BUFFERGL_TEXTURE_2D_MULTISAMPLE or GL_TEXTURE_2D_MULTISAMPLE_ARRAY
      https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindTexture.xhtml
      1. GL_TEXTURE_1D_ARRAY, GL_TEXTURE_2D_ARRAY
        1. 단일 객체로 합쳐진 텍스쳐 이미지 배열
      2. GL_TEXTURE_BUFFER
        1. 1D 텍스쳐와 유사하지만 스토리지가 실제 버퍼 객체로 표현되는 특별한 텍스쳐 타입
        2. 1D 텍스쳐의 최대크기보다 훨씬 더 크다.
      3. GL_TEXTURE_2D_MULTISAMPLE
        1. 멀티 샘플 안티엘리어싱에서 사용
  7. 쉐이더에서 텍스쳐 읽기
    1. 텍스쳐는 쉐이더에서 샘플러 변수로 사용됨
    2. 2차원 텍스쳐를 나타내는 샘플러 타입은 sampler2D
    3. Example
      1. #version 430 core

      2. uniform sampler2D s;

      3. out vec4 color;

      4. void main(void)
      5. {
      6.   color = texelFetch(s, ivec2(gl_FragCoord.xy), 0);
      7. }
        1. gl_FragCoord로 부터 구한 텍스쳐 좌표를 사용하여 유니폼 샘플러로부터 읽음.
        2. gvec4 texelFetch(gsampler2D sampler,
           ivec2 P,
           int lod);
          1. lod: 밉맵 레벨 (1 레벨일 경우 0)
    4. 샘플러 타입
      1. GLSL samplerOpenGL texture enumTexture type
        gsampler1DGL_TEXTURE_1D1D texture
        gsampler2DGL_TEXTURE_2D2D texture
        gsampler3DGL_TEXTURE_3D3D texture
        gsamplerCubeGL_TEXTURE_CUBE_MAPCubemap Texture
        gsampler2DRectGL_TEXTURE_RECTANGLERectangle Texture
        gsampler1DArrayGL_TEXTURE_1D_ARRAY1D Array Texture
        gsampler2DArrayGL_TEXTURE_2D_ARRAY2D Array Texture
        gsamplerCubeArrayGL_TEXTURE_CUBE_MAP_ARRAYCubemap Array Texture
        (requires GL 4.0 or ARB_texture_cube_map_array)
        gsamplerBufferGL_TEXTURE_BUFFERBuffer Texture
        gsampler2DMSGL_TEXTURE_2D_MULTISAMPLEMultisample Texture
        gsampler2DMSArrayGL_TEXTURE_2D_MULTISAMPLE_ARRAYMultisample Array Texture
        https://www.khronos.org/opengl/wiki/Sampler_(GLSL)
      2. 정수형 샘플러는 앞에 i를 붙이고, unsigned는 u
        (ex. isampler2D, usampler2D)

댓글 없음:

댓글 쓰기