다음을 통해 공유


깊이 바이어스

3D 공간에서 평면인 다각형은 각 평면에 z-바이어스(또는 깊이 바이어스)를 추가하여 행성이 아닌 것처럼 표시할 수 있습니다.

이는 장면의 그림자가 제대로 표시되도록 하는 데 일반적으로 사용되는 기술입니다. instance 경우 벽의 그림자는 벽과 동일한 깊이 값을 가질 수 있습니다. 애플리케이션이 먼저 벽을 렌더링한 다음 그림자를 렌더링하면 그림자가 표시되지 않거나 깊이 아티팩트가 표시될 수 있습니다.

애플리케이션은 평면 다각형 집합을 렌더링할 때 시스템에서 사용하는 z-값에 바이어스(D3D11_RASTERIZER_DESC1DepthBias 멤버)를 추가하여 coplanar 다각형이 제대로 렌더링되도록 할 수 있습니다. z 값이 큰 다각형은 z 값이 작은 다각형 앞에 그려집니다.

깊이 바이어스 계산에는 두 가지 옵션이 있습니다.

  1. 현재 출력 병합 단계에 바인딩된 깊이 버퍼에 UNORM 형식이 있거나 깊이 버퍼가 바인딩되지 않은 경우 바이어스 값은 다음과 같이 계산됩니다.

    Bias = (float)DepthBias * r + SlopeScaledDepthBias * MaxDepthSlope;
    

    여기서 rfloat32로 변환된 깊이 버퍼 형식의 최소 표현 가능 값 > 0입니다. DepthBiasSlopeScaledDepthBias 값은 D3D11_RASTERIZER_DESC1 구조체 멤버입니다. MaxDepthSlope 값은 픽셀에서 깊이 값의 가로 및 세로 기울기의 최대값입니다.

  2. 부동 소수점 깊이 버퍼가 출력 병합기 단계에 바인딩된 경우 바이어스 값은 다음과 같이 계산됩니다.

    Bias = (float)DepthBias * 2**(exponent(max z in primitive) - r) +
                SlopeScaledDepthBias * MaxDepthSlope;
    

    여기서 r 은 부동 소수점 표현의 매니타사 비트 수입니다(숨겨진 비트 제외). 예를 들어 float32의 경우 23입니다.

그런 다음 바이어스 값이 다음과 같이 고정됩니다.

if(DepthBiasClamp > 0)
    Bias = min(DepthBiasClamp, Bias)
else if(DepthBiasClamp < 0)
    Bias = max(DepthBiasClamp, Bias)

그런 다음 바이어스 값을 사용하여 픽셀 깊이를 계산합니다.

if ( (DepthBias != 0) || (SlopeScaledDepthBias != 0) )
    z = z + Bias

깊이 바이어스 작업은 클리핑 후 꼭짓점에서 발생하므로 깊이 바이어스는 기하학적 클리핑에 영향을 주지 않습니다. 바이어스 값은 지정된 기본 형식에 대해 상수이며 보간기 설정 전에 각 꼭짓점의 z 값에 추가됩니다. 기능 수준 10.0 이상을 사용하는 경우 모든 바이어스 계산은 32비트 부동 소수점 산술을 사용하여 수행됩니다. 바이어스는 와이어프레임 모드로 그려진 선을 제외하고는 점 또는 선 기본 형식에 적용되지 않습니다.

그림자 버퍼 기반 그림자가 있는 아티팩트 중 하나는 그림자 여드름이거나 셰이더의 깊이 계산과 그림자 버퍼의 동일한 표면 깊이 간의 사소한 차이로 인해 표면 그림자 자체입니다. 이를 완화하는 한 가지 방법은 섀도 버퍼를 렌더링할 때 DepthBiasSlopeScaledDepthBias 를 사용하는 것입니다. 섀도 버퍼를 렌더링하는 동안 표면을 충분히 밀어 내어 비교 결과(섀도 버퍼 z와 셰이더 z 사이)가 표면 전체에서 일관되고 로컬 자체 그림자가 드리우지 않도록 하는 것이 좋습니다.

그러나 DepthBiasSlopeScaledDepthBias 를 사용하면 매우 날카로운 각도로 보이는 다각형으로 인해 바이어스 수식이 매우 큰 z 값을 생성할 때 새로운 렌더링 문제가 발생할 수 있습니다. 이는 실제로 다각형을 그림자 맵의 원래 표면에서 매우 멀리 밀어 줍니다. 이 특정 문제를 완화하는 한 가지 방법은 계산된 z 바이어스의 크기에 상한(긍정 또는 음수)을 제공하는 DepthBiasClamp을 사용하는 것입니다.

참고

기능 수준 9.1, 9.2, 9.3의 경우 DepthBiasClamp이 지원되지 않습니다.

 

출력 병합기 단계