Metal에서 밉맵 레벨은 어떻게 계산됩니까?


14

내 질문은 구체적으로 Metal과 관련이 있습니다. 왜냐하면 다른 API에 대한 답변이 변경되는지 알 수 없기 때문입니다.

내가 지금까지 이해하고 있다고 생각하는 것은 다음과 같습니다.

  • mipmapped 텍스처는 사전 계산 된 "세부 정보 수준"으로, 원래의 텍스처를 의미있는 방식으로 다운 샘플링하여 더 낮은 수준의 세부 사항을 만듭니다.

  • 밉맵 레벨은 세부적인 내림차순으로 참조되며, 레벨 0은 원래 텍스처이고 높은 레벨은 2의 거듭 제곱입니다.

  • 대부분의 GPU는 삼선 형 필터링을 구현하여 각 샘플에 대해 두 개의 인접한 밉맵 레벨, 이중 선형 필터링을 사용하여 각 레벨의 샘플을 선택한 다음 해당 샘플을 선형 혼합합니다.

내가 이해하지 못하는 것은 이러한 밉맵 레벨이 어떻게 선택되는지입니다. Metal 표준 라이브러리 의 문서 에서 lod_options유형 의 인스턴스를 지정하거나 지정하지 않고 샘플을 가져올 수 있음을 알았습니다 . 이 인수가 밉맵 레벨 선택 방법을 변경한다고 가정하고 lod_options2D 텍스처 에는 세 가지 종류가 있습니다 .

  • bias(float value)
  • level(float lod)
  • gradient2d(float2 dPdx, float2 dPdy)

불행히도 설명서에는 이러한 옵션의 기능에 대한 설명이 필요하지 않습니다. 나는 bias()자동으로 선택된 세부 수준의 편향을 추측 하지만 그 편향 value은 무엇을 의미합니까? 어떤 규모로 작동합니까? 마찬가지로, 어떻게한다 lod의는 level()이산 밉맵 레벨로 번역? 그리고 gradient2d()텍스처 좌표의 그라디언트 를 사용 하는 가정하에 그 그라디언트를 사용하여 밉맵 레벨을 선택하는 방법은 무엇입니까?

더 중요한 것은를 생략 lod_options하면 밉맵 레벨은 어떻게 선택됩니까? 실행되는 기능의 유형에 따라 다른가요?

그리고 sample()함수 의 기본 no-lod-options 지정 작업이 gradient2D()(적어도 조각 쉐이더에서) 같은 작업을 수행 하는 경우 간단한 화면 공간 파생을 사용하거나 래스터 라이저 및 보간 된 텍스처 좌표와 직접 작동합니까 정확한 기울기를 계산하려면?

마지막으로, 장치마다이 동작이 얼마나 일관성이 있습니까? 이전 기사 (DirectX 9에서와 같이 오래된 기사)에서 복잡한 장치 별 밉맵 선택을 언급했지만 최신 아키텍처에서 밉맵 선택이 더 잘 정의되어 있는지 알 수 없습니다.

답변:


17

밉 선택은 오늘날 각 장치에서 잘 표준화되어 있습니다. 예외적으로 이방성 필터링에 대한 세부 사항 중 일부는 예외로, 개별 GPU 제조업체가 정의해야합니다 (정확한 세부 사항은 일반적으로 공개적으로 문서화되지 않음).

밉 선택에 대한 자세한 내용은 OpenGL 사양의 섹션 8.14, "텍스처 축소"에 있습니다. Metal에서 동일한 방식으로 작동한다고 가정합니다. (애플 하드웨어와 API를 모두 만드는 것을 고려할 때 무언가를 바꿀 는 있지만 ... 그것을 의심합니다.) 여기에 요약하겠습니다.

lod_options수정자를 사용하지 않는 기본 밉 선택 은 텍스처 좌표의 화면 공간 그라디언트를 사용하여 밉 레벨을 선택합니다. 기본적으로 픽셀과 텍셀의 1 : 1 매핑에 최대한 근접한 밉 레벨을 선택하려고합니다. 예를 들어 그라디언트의 픽셀 당 길이가 4 텍셀 인 경우 밉 레벨 2 (레벨 0 크기의 1/4에 해당하므로 픽셀 당 1 개의 텍셀을 제공함)를 선택합니다.

삼선 형 필터링을 사용하면 일반적으로 정확한 1 : 1 매핑 에 도달하지 않으므로 가장 가까운 두 레벨을 선택하고 그 사이에 선형 보간하므로 장면의 카메라 또는 객체가 움직일 때 밉 레벨간에 부드럽게 전환됩니다. 주위에.

λλλλ=2.8

λ로그2(1/4)=2

이제 수정 자 옵션에 관해서는 :

  • biasλ
  • levelλλlod
  • gradient2d텍스처 좌표의 암시 적 화면 공간 그라디언트를 대체하는 고유 한 그라디언트 벡터를 넣을 수 있습니다. 나머지 밉 선택 및 샘플링 프로세스는 정상적으로 진행되지만 그래디언트가 변경됩니다. 이를 통해 이방성 필터링을 사용자 정의 할 수 있습니다.

프래그먼트 셰이더 외에 다른 유형의 셰이더에는 "스크린 공간 그라디언트"라는 개념이 없으므로 후자의 두 작업은 일반적으로 허용되는 유일한 작업입니다. 암시 적 그라디언트를 사용하려는 작업은 컴파일 오류를 발생시킵니다. 금속이 그렇게하는 것은 긍정적이지 않지만 다른 API를 사용하여 기대하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.