다음을 통해 공유


래스터라이저 단계 시작하기

이 섹션에서는 뷰포트, 가위 사각형, 래스터라이저 상태 및 다중 샘플링 설정에 대해 설명합니다.

뷰포트 설정

뷰포트는 꼭짓점 위치(클립 공간)를 렌더링 대상 위치에 매핑합니다. 이 단계에서는 3D 위치를 2D 공간으로 확장합니다. 렌더링 대상은 Y축이 아래쪽을 가리키는 방향으로 지정됩니다. 이렇게 하려면 뷰포트 배율 중에 Y 좌표가 대칭 이동되어야 합니다. 또한 x 및 y 익스텐트(x 및 y 값 범위)는 다음 수식에 따라 뷰포트 크기에 맞게 크기가 조정됩니다.

X = (X + 1) * Viewport.Width * 0.5 + Viewport.TopLeftX
Y = (1 - Y) * Viewport.Height * 0.5 + Viewport.TopLeftY
Z = Viewport.MinDepth + Z * (Viewport.MaxDepth - Viewport.MinDepth) 

자습서 1에서는 D3D11_VIEWPORT 사용하여 ID3D11DeviceContext::RSSetViewports호출하여 640 × 480 뷰포트를 만듭니다.

    D3D11_VIEWPORT vp[1];
    vp[0].Width = 640.0f;
    vp[0].Height = 480.0f;
    vp[0].MinDepth = 0;
    vp[0].MaxDepth = 1;
    vp[0].TopLeftX = 0;
    vp[0].TopLeftY = 0;
    g_pd3dContext->RSSetViewports( 1, vp );

뷰포트 설명은 뷰포트의 크기, 깊이를 매핑할 범위(MinDepthMaxDepth사용) 및 뷰포트의 왼쪽 위 배치를 지정합니다. MinDepthMaxDepth;보다 작거나 같아야 합니다. MinDepthMaxDepth 모두에 대한 범위는 0.0에서 1.0 사이입니다. 뷰포트가 렌더링 대상에 매핑되는 것이 일반적이지만 필요하지는 않습니다. 또한 뷰포트의 크기나 위치가 렌더링 대상과 같을 필요는 없습니다.

뷰포트 배열을 만들 수 있지만 기하 도형 셰이더의 기본 출력에는 하나만 적용할 수 있습니다. 한 번에 하나의 뷰포트만 활성으로 설정할 수 있습니다. 파이프라인은 래스터화 중에 기본 뷰포트(및 다음 섹션에서 설명하는 가위 사각형)를 사용합니다. 기본값은 항상 배열의 첫 번째 뷰포트(또는 가위 사각형)입니다. 기하 도형 셰이더에서 뷰포트의 기본별 선택을 수행하려면 GS 출력 서명 선언에서 적절한 GS 출력 구성 요소에 ViewportArrayIndex 의미 체계를 지정합니다.

한 번에 래스터라이저 스테이지에 바인딩할 수 있는 뷰포트(및 가위 사각형)의 최대 수는 16(D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE지정됨)입니다.

가위 사각형 설정

가위 사각형은 출력 병합 단계로 전송될 픽셀 수를 줄일 수 있는 또 다른 기회를 제공합니다. 가위 사각형 외부의 픽셀은 무시됩니다. 가위 사각형의 크기는 정수로 지정됩니다. 래스터화 중에 하나의 가위 사각형(시스템 값 의미 체계의 ViewportArrayIndex 기반으로)만 삼각형에 적용할 수 있습니다.

가위 사각형을 활성화하려면 D3D11_RASTERIZER_DESC1ScissorEnable 멤버를 사용합니다. 기본 가위 사각형은 빈 사각형입니다. 즉, 모든 사각형 값은 0입니다. 즉, 가위 사각형을 설정하지 않고 가위를 사용하도록 설정하면 출력-병합 단계에 픽셀을 보내지 않습니다. 가장 일반적인 설정은 가위 사각형을 뷰포트 크기로 초기화하는 것입니다.

디바이스에 가위 사각형 배열을 설정하려면 ID3D11DeviceContext::RSSetScissorRects를 사용하여 D3D11_RECT을(를) 호출합니다.

  D3D11_RECT rects[1];
  rects[0].left = 0;
  rects[0].right = 640;
  rects[0].top = 0;
  rects[0].bottom = 480;

  g_pd3dContext->RSSetScissorRects( 1, rects );

이 메서드는 (1) 배열의 사각형 수와 (2) 사각형 배열의 두 매개 변수를 사용합니다.

파이프라인은 래스터화 중에 기본 가위 사각형 인덱스를 사용합니다(기본값은 클리핑을 사용하지 않도록 설정된 0사이즈 사각형임). 이를 재정의하려면 GS 출력 서명 선언에서 GS 출력 구성 요소에 대한 SV_ViewportArrayIndex 의미 체계를 지정합니다. 이렇게 하면 GS 단계에서 이 GS 출력 구성 요소를 이 의미 체계를 사용하여 시스템 생성 구성 요소로 표시합니다. 래스터라이저 단계에서는 이 의미 체계를 인식하고 가위 사각형 인덱스로 연결된 매개 변수를 사용하여 가위 사각형 배열에 액세스합니다. 래스터라이저 개체를 만들기 전에 래스터라이저 설명에서 ScissorEnable 값을 사용하도록 설정하여 정의한 가위 사각형을 사용하도록 래스터라이저 스테이지에 지시하는 것을 잊지 마세요.

래스터라이저 상태 설정

Direct3D 10부터 래스터라이저 상태는 래스터라이저 상태 개체에 캡슐화됩니다. 최대 4096개 래스터라이저 상태 개체를 만들 수 있으며, 이 개체는 상태 개체에 핸들을 전달하여 디바이스로 설정할 수 있습니다.

ID3D11Device1::CreateRasterizerState1 사용하여 래스터라이저 설명에서 래스터라이저 상태 개체를 만듭니다(D3D11_RASTERIZER_DESC1참조).

    ID3D11RasterizerState1 * g_pRasterState;

    D3D11_RASTERIZER_DESC1 rasterizerState;
    rasterizerState.FillMode = D3D11_FILL_SOLID;
    rasterizerState.CullMode = D3D11_CULL_FRONT;
    rasterizerState.FrontCounterClockwise = true;
    rasterizerState.DepthBias = false;
    rasterizerState.DepthBiasClamp = 0;
    rasterizerState.SlopeScaledDepthBias = 0;
    rasterizerState.DepthClipEnable = true;
    rasterizerState.ScissorEnable = true;
    rasterizerState.MultisampleEnable = false;
    rasterizerState.AntialiasedLineEnable = false;
    rasterizerState.ForcedSampleCount = 0;
    g_pd3dDevice->CreateRasterizerState1( &rasterizerState, &g_pRasterState );

이 상태 집합 예제에서는 아마도 가장 기본적인 래스터라이저 설정을 수행합니다.

  • 단색 채우기 모드
  • 뒷면을 걸러내거나 제거합니다. 원시 형태에 대해 시계 반대 방향으로 권선되는 순서를 가정합니다.
  • 깊이 바이어스를 해제하지만 깊이 버퍼링을 사용하도록 설정하고 가위 사각형을 사용하도록 설정합니다.
  • 다중 샘플링 및 줄 앤티앨리어싱 해제

또한 기본 래스터라이저 작업에는 클리핑(뷰 프러스텀에 대한), 원근 분할 및 뷰포트 배율이 항상 포함됩니다. 래스터라이저 상태 개체를 성공적으로 만든 후 다음과 같이 디바이스로 설정합니다.

    g_pd3dContext->RSSetState(g_pRasterState);

다중 샘플링

다중 샘플링은 다각형 가장자리를 그리기 때문에 가장 눈에 띄는 형태의 별칭을 줄이기 위해 이미지의 일부 또는 전부를 고해상도(원래 해상도로 다운샘플링)하는 샘플입니다. 다중 샘플링에는 하위 픽셀 샘플이 필요하지만 픽셀 셰이더가 픽셀당 한 번 실행되도록 최신 GPU는 다중 샘플링을 구현합니다. 이렇게 하면 성능(특히 GPU 바인딩된 애플리케이션)과 최종 이미지의 앤티앨리어싱 간에 적절한 절충이 제공됩니다.

다중 샘플링을 사용하려면 래스터화 설명의 enable 필드를 설정하고, 다중 샘플링된 렌더 타겟을 생성한 후, 셰이더로 렌더 타겟을 읽어 샘플을 단일 픽셀 색상으로 해결하거나, ID3D11DeviceContext::ResolveSubresource을 호출하여 비디오 카드를 사용해 샘플을 해결합니다. 가장 일반적인 시나리오는 하나 이상의 다중 샘플링 렌더링 대상에 그리는 것입니다.

다중 샘플링은 샘플 마스크 사용 여부, 알파-검사 사용 또는 스텐실 연산(항상 샘플별로 수행됨)과는 독립적입니다.

깊이 테스트는 다중 샘플링의 영향을 받습니다.

  • 다중 샘플링을 사용하도록 설정하면 깊이가 샘플당 보간되고 깊이/스텐실 테스트는 샘플당 수행됩니다. 픽셀 셰이더 출력 색은 전달되는 모든 샘플에 대해 복제됩니다. 픽셀 셰이더가 깊이를 출력하는 경우 모든 샘플에 대해 깊이 값이 중복됩니다(이 시나리오에서는 다중 샘플링의 이점을 상실하지만).
  • 다중 샘플링을 사용하지 않도록 설정하면 깊이/스텐실 테스트는 여전히 샘플별로 수행되지만 깊이는 샘플당 보간되지 않습니다.

단일 렌더링 대상 내에서 다중 샘플링된 렌더링과 다중 샘플링되지 않은 렌더링을 혼합하는 데는 제한이 없습니다. 다중 샘플링을 사용하도록 설정하고 다중 샘플링되지 않은 렌더링 대상에 그리는 경우 다중 샘플링을 사용하도록 설정하지 않은 경우와 동일한 결과를 생성합니다. 샘플링은 픽셀당 단일 샘플로 수행됩니다.

래스터라이저 스테이지