GLSL Texture Vs texelFetch

나우히즈·2024년 10월 8일

trialAndErrors

목록 보기
1/5

나의 첫 시행착오 게시글이다.

openGL superbible을 읽으며 평화롭게 공부하던 나는 텍스처를 입히는 방식에 Texture 내장함수 뿐만 아니라 texelFetch라는 내장함수도 있음을 알았다.

둘이 무슨 차이인지를 직접 알아보도록 하자.


1. texelFetch

  • 기능: 텍스처 좌표 대신 정수 기반 좌표정확한 텍셀(texel, texture element)을 가져옵니다.

  • 사용 사례: MIP 맵핑이나 필터링이 적용되지 않은 정확한 텍셀을 가져와야 할 때 주로 사용됩니다.

  • 좌표계: 정수 인덱스 기반의 좌표를 사용합니다.

  • 인자:

    • sampler: 샘플러(텍스처) 타입
    • P: 정수 텍셀 좌표
    • lod: LOD(레벨 오브 디테일) 레벨

    예시:

    vec4 texel = texelFetch(mySampler, ivec2(10, 20), 0);

    여기서는 텍스처의 (10, 20) 좌표에서 LOD 0 레벨의 정확한 텍셀 값을 가져옵니다.

만약 ivec2의 인자로 gl_FragCoord.xy 를 사용하게 된다면 (0,0) ~ (해상도 최대x, 해상도 최대y)의 픽셀들에 대한 계산이 이루어지게 되는데, 텍스처의 (0,0) ~ (텍스처 최대 x, 텍스처 최대 y)까지는 텍스처의 이미지가 입혀지고, 그 외의 픽셀범위엔 값이 들어가지 못하는 문제가 생길 수 있음.

2. texture

  • 기능: 텍스처 좌표에서 텍셀을 샘플링하여 필터링 및 MIP 맵핑을 적용한 결과를 반환합니다.
  • 사용 사례: 일반적인 텍스처 샘플링에 사용되며, 텍스처 필터링이 자동으로 적용됩니다.
  • 좌표계: 텍스처 좌표계에서 정규화된 좌표 (0.0 ~ 1.0)를 사용합니다.
  • 인자:
    • sampler: 샘플러(텍스처) 타입
    • P: 정규화된 텍스처 좌표

일반적으로 texture를 사용하는데, texture는 일반적으로 VBO에 각 버텍스가 해당하는 texCoord값을 같이 입력해준다. 그 값을 기준으로 0~1 범위에서 프레그먼트들을 보간하여 텍셀 값을 입히게 된다.

차이점 정리

  • texelFetch: 정수 인덱스 좌표로 정확한 텍셀을 가져옴. 필터링과 MIP 맵핑이 적용되지 않음.
  • texture: 정규화된 좌표로 필터링과 MIP 맵핑이 적용된 텍셀 값을 가져옴. 텍스처의 일반적인 샘플링에 사용.

따라서, 정확한 픽셀 값을 가져와야 할 때texelFetch, 필터링과 샘플링이 필요할 때texture를 사용합니다.


근데 사실 texelFetch가 특정한 픽셀에 대해 처리해주기위해 사용한다지만, 프로그래밍으로 할 바엔 모델링 프로그램으로 진행해서 texture로 입히는것이 낫다.

대체로 texture 내장함수가 주로 쓰인다고 함.

강의를 들으며 작성했었던 texture 함수 대신 texelFetch로 사용했을 때는 좌하단(0,0) 에서부터 텍셀을 입히기 시작하기때문에 내가 원래 입히고자 했던 검은 사각형 영역이 모두 채워지지 못하는 문제가 있었다.

텍셀을 정규화된 좌표에 맞게 텍스처링해주는 texture 함수를 써야 저렇게 직사각형에 알맞는 형태로 텍스처가 입혀지게 된다.

0개의 댓글