대부분의 경우 텍스처를 셰이더에서 샘플링할 때 텍스처 샘플링 상태는 텍스처 설정에서 나옵니다. 기본적으로 텍스처와 샘플러는 함께 결합되어 있습니다. 다음은 DX9 스타일 셰이더 구문을 사용할 때의 기본 동작입니다.
sampler2D _MainTex;
// ...
half4 color = tex2D(_MainTex, uv);
sampler2D, sampler3D, samplerCUBE HLSL 키워드를 사용하여 텍스처와 샘플러를 선언합니다.
대부분의 경우는 이 옵션이 적합하며, 구형 그래픽스 API(예: OpenGL ES)는 이 옵션만 지원합니다.
많은 그래픽스 API와 GPU에서는 텍스처보다 적은 샘플러를 사용할 수 있으며, 연결된 텍스처+샘플러 구문으로 인해 더 복잡한 셰이더를 작성하지 못할 수도 있습니다. 예를 들어, Direct3D 11은 한 셰이더에 최대 128개의 텍스처와 16개의 샘플러를 지원합니다.
Unity는 DX11 스타일 HLSL 구문으로 텍스처와 샘플러를 선언할 수 있으며, 특수한 명명 규칙으로 일치시킵니다. “sampler”+TextureName 형식의 이름을 가진 샘플러는 샘플링 상태를 해당 텍스처에서 가져옵니다.
위 섹션의 셰이더 스니핏은 DX11-style HLSL 구문으로 재작성해도 같은 동작을 합니다.
Texture2D _MainTex;
SamplerState sampler_MainTex; // "sampler" + "_MainTex"
// ...
half4 color = _MainTex.Sample(sampler_MainTex, uv);
그러나 이렇게 하면 한 개 이상의 텍스처를 샘플링하면서 샘플러를 다른 텍스처에서 “재사용”하게 셰이더를 작성할 수 있습니다. 아래 예제에서는 3개의 텍스처에 하나의 샘플러만을 사용합니다.
Texture2D _MainTex;
Texture2D _SecondTex;
Texture2D _ThirdTex;
SamplerState sampler_MainTex; // "sampler" + "_MainTex"
// ...
half4 color = _MainTex.Sample(sampler_MainTex, uv);
color += _SecondTex.Sample(sampler_MainTex, uv);
color += _ThirdTex.Sample(sampler_MainTex, uv);
그러나 DX11-style HLSL 구문은 일부 구형 플랫폼(예: OpenGL ES 2.0)에서는 동작하지 않는다는 점에 유의하십시오. 자세한 내용은 Unity에서 HLSL 사용를 참조하십시오. #pragma target 3.5
(셰이더 컴파일 타겟 참조)을 지정해 구형 플랫폼이 해당 셰이더를 건너뛰도록 할 수 있습니다.
Unity는 이 “분리된 샘플러” 접근 방법을 사용한 선언과 텍스처 샘플링에 도움이 될만한 여러 셰이더 매크로를 제공하고 있으니 빌트인 매크로를 참조하십시오. 위의 예제는 이 매크로를 사용해 이렇게 재작성할 수 있습니다.
UNITY_DECLARE_TEX2D(_MainTex);
UNITY_DECLARE_TEX2D_NOSAMPLER(_SecondTex);
UNITY_DECLARE_TEX2D_NOSAMPLER(_ThirdTex);
// ...
half4 color = UNITY_SAMPLE_TEX2D(_MainTex, uv);
color += UNITY_SAMPLE_TEX2D_SAMPLER(_SecondTex, _MainTex, uv);
color += UNITY_SAMPLE_TEX2D_SAMPLER(_ThirdTex, _MainTex, uv);
위는 Unity가 지원하는 모든 플랫폼에서 컴파일할 수 있지만 DX9 같은 구형 플랫폼에서는 3개의 샘플러를 사용하도록 폴백합니다.
“sampler”+TextureName 이름의 HLSL SamplerState 오브젝트 외에도 Unity는 샘플러 이름의 다른 패턴도 인식합니다. 간단하게 하드코드된 샘플링 상태를 셰이더에 바로 선언할 때 유용합니다. 예를 들면, 다음과 같습니다.
Texture2D _MainTex;
SamplerState my_point_clamp_sampler;
// ...
half4 color = _MainTex.Sample(my_point_clamp_sampler, uv);
“my_point_clamp_sampler” 이름은 포인트(가장 가까운) 텍스처 필터링과 클램프 텍스처 랩 모드를 사용하는 샘플러로 인식됩니다.
샘플러 이름은 “inline” 샘플러 상태로 인식됩니다(대소문자 구분).
“Point”, “Linear” 또는 “Trilinear”(필수)는 텍스처 필터링 모드를 설정합니다.
“Clamp”, “Repeat”, “Mirror” 또는 “MirrorOnce”(필수)는 텍스처 랩 모드를 설정합니다.
“Compare”(선택)는 뎁스 비교용 샘플러를 설정합니다. HLSL SamplerComparisonState 타입과 SampleCmp/SampleCmpLevelZero 함수를 사용합니다.
“AnisoX”(X는 2/4/8 또는 16일 수 있음. 예: Ansio8
)를 추가하여 이방성 필터링을 요청할 수 있습니다.
다음은 각각 sampler_linear_repeat
샘플링 텍스처와 sampler_point_repeat
SamplerState의 예제로, 이름이 필터링 모드를 조절하는 방식을 보여줍니다.
다음은 각각 SmpClampPoint
, SmpRepeatPoint
, SmpMirrorPoint
, SmpMirrorOncePoint
, Smp_ClampU_RepeatV_Point
SamplerState의 예제로, 이름이 랩 모드를 조절하는 방식을 보여줍니다. 이 마지막 예제에서는 가로(U)와 세로(V) 축에 대해 다른 랩 모드가 설정되었습니다. 모든 경우에 텍스처 좌표는 –2.0 - +2.0입니다.
분리된 텍스처+샘플러 구문과 마찬가지로 인라인 샘플러 상태가 모든 플랫폼에서 지원되지는 않습니다. 현재는 Direct3D 11/12 및 Metal에서 구현됩니다.
참고로, “MirrorOnce” 텍스처 랩 모드는 대부분의 모바일 GPU/API에서 지원되지 않고, 이런 경우 Mirror 모드로 폴백합니다.
“AnisoX” 필터링 모드는 플랫폼 기능과 일부 API에서 최선의 수단입니다. 실제 값은 지원되는 최대 이방성 수준에 기반하여 고정됩니다(이방성 필터링이 지원되지 않는 경우의 비활성화 포함).
2017–06–01 페이지 게시됨
Unity 2017.1의 새로운 기능NewIn20171