2018년 4월 24일 화요일

5.5.[4-5] 파일로부터 텍스처 로딩하기, 텍스처 데이터 읽는 방식 제어하기 (1/2)


  1. 파일로부터 텍스처 로딩하기
    1. KTX (Khronos TeXture format)
      1. glTexStorage2D 및glTexSubImage2D 등의 텍스처 함수에 전달할 대부분의 인자를 포함하기 때문에 파일의 텍스처를 직접 로딩할 수 있다.
      2. https://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/
  2. 텍스처 좌표
    1. Example
      1. Vertex shader
        1. #version 430 core

        2. uniform mat4 mv_matrix;
        3. uniform mat4 proj_matrix;

        4. layout (location = 0) in vec4 position;
        5. layout (location = 4) in vec2 tc;

        6. out VS_OUT
        7. {
        8.   vec2 tc;
        9. } vs_out;

        10. void main(void)
        11. {
        12.   // 각 버텍스 위치 계산
        13.   vec4 pos_vs = mv_matrix * position;

        14.   // 텍스처 좌표를 그대로 전달
        15.   vs_out.tc = tc;

        16.   gl_Position = proj_matrix * pos_vs;
        17. }
      2. Fragment shader
        1. #version 430 core

        2. layout (binding = 0) uniform sapler2D tex_object;

        3. in VS_OUT
        4. {
        5.   vec2 tc;
        6. } fs_in;

        7. out vec4 color;

        8. void main(void)
        9. {
        10.   // 받은 좌표값을 스케일하여 텍스쳐를 출력한다.
        11.   color = texture(tex_object, fs_in.tc * vec2(2.0, 3.0));
        12. }
  3. 텍스처 데이터 읽는 방식 제어하기
    1. 일반적으로 텍스처 좌표는 정규화된다. (0.0 ~ 1.0)
    2. 래핑 모드
      1. (0.0 ~ 1.0) 범위를 벗어나는 텍스처 좌표에 대해 어떻게 처리할지
    3. 필터링 모드
      1. 샘플들의 중간값을 어떻게 처리할지
    4. 샘플러의 래핑 및 필터링 모드를 제어하는 인자들은 샘플러 객체에 저장된다.
    5. 샘플러 객체 생성
      1. void glGenSamplers(GLsizei n,
         GLuint *samplers);
        1. n: 생성 할 샘플러 개수
        2. samplers: 샘플러 객체를 저장할 배열 주소
    6. 샘플러 인자 설정
      1. void glSamplerParameterf(GLuint sampler,
         GLenum pname,
         GLfloat param);
         
        void glSamplerParameteri(GLuint sampler,
         GLenum pname,
         GLint param);
        1. sampler: 샘플러 객체 핸들러
        2. pname: 샘플러 파라미터의 심볼릭 네임
          GL_TEXTURE_WRAP_SGL_TEXTURE_WRAP_TGL_TEXTURE_WRAP_RGL_TEXTURE_MIN_FILTERGL_TEXTURE_MAG_FILTER,GL_TEXTURE_BORDER_COLORGL_TEXTURE_MIN_LODGL_TEXTURE_MAX_LODGL_TEXTURE_LOD_BIAS GL_TEXTURE_COMPARE_MODE, or GL_TEXTURE_COMPARE_FUNC 
        3. param: 샘플러 파라미터
    7. 샘플러 객체를 텍스처 유닛에 바인딩
      1. void glBindSampler(GLuint unit,
         GLuint sampler);
        1. unit: 텍스처 유닛의 인덱스
    8. 텍스처로부터 텍스처 샘플러의 인자를 분리함으로써의 장점
      1. 텍스처가 많은 경우에도 동일한 샘플링 인자를 사용할 수 있다.
      2. 바인딩된 텍스처를 변경해도 샘플러 인자는 변경하지 않아도 된다.
      3. 동일한 텍스처에 여러 다른 샘플러 인자를 사용가능.
    9. 텍스처 안에 저장된 샘플러 객체 사용
      1. 타깃에 바인딩 한 후 함수 호출
      2. void glTexParameterf(GLenum target,
         GLenum pname,
         GLfloat param);
         
        void glTexParameteri(GLenum target,
         GLenum pname,
         GLint param);
        1. target: 텍스쳐 종류 (GL_TEXTURE_2D 등)
        2. pname: 텍스쳐 파라미터의 심볼릭 네임
          GL_DEPTH_STENCIL_TEXTURE_MODEGL_TEXTURE_BASE_LEVELGL_TEXTURE_COMPARE_FUNCGL_TEXTURE_COMPARE_MODE,GL_TEXTURE_LOD_BIASGL_TEXTURE_MIN_FILTERGL_TEXTURE_MAG_FILTERGL_TEXTURE_MIN_LODGL_TEXTURE_MAX_LODGL_TEXTURE_MAX_LEVELGL_TEXTURE_SWIZZLE_RGL_TEXTURE_SWIZZLE_GGL_TEXTURE_SWIZZLE_B,GL_TEXTURE_SWIZZLE_AGL_TEXTURE_WRAP_SGL_TEXTURE_WRAP_T, or GL_TEXTURE_WRAP_R
        3. param: pname에 따른 파라미터 (GL_NEAREST 등)

댓글 없음:

댓글 쓰기