래스터라이저 스테이지를 사용하여 시작
이 섹션에서는 뷰포트, 가위 사각형, 래스터라이저 상태 및 다중 샘플링 설정에 대해 설명합니다.
뷰포트 설정
뷰포트는 꼭짓점 위치(클립 공간)를 렌더링 대상 위치에 매핑합니다. 이 단계에서는 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 );
뷰포트 설명은 뷰포트의 크기, 깊이를 매핑할 범위( MinDepth 및 MaxDepth 사용) 및 뷰포트의 왼쪽 위 배치를 지정합니다. MinDepth 는 MaxDepth보다 작거나 같아야 합니다. MinDepth 와 MaxDepth 의 범위는 0.0에서 1.0 사이입니다( 포함). 뷰포트가 렌더링 대상에 매핑되는 것은 일반적이지만 필요하지는 않습니다. 또한 뷰포트의 크기나 위치가 렌더링 대상과 동일할 필요는 없습니다.
뷰포트 배열을 만들 수 있지만 기하 도형 셰이더의 기본 출력에는 하나만 적용할 수 있습니다. 한 번에 하나의 뷰포트만 활성으로 설정할 수 있습니다. 파이프라인은 래스터화 중에 기본 뷰포트(및 다음 섹션에서 설명하는 가위 사각형)를 사용합니다. 기본값은 항상 배열의 첫 번째 뷰포트(또는 가위 사각형)입니다. 기하 도형 셰이더에서 뷰포트의 기본별 선택을 수행하려면 GS 출력 서명 선언의 적절한 GS 출력 구성 요소에 ViewportArrayIndex 의미 체계를 지정합니다.
한 번에 래스터라이저 단계에 바인딩할 수 있는 뷰포트(및 가위 사각형)의 최대 수는 16개( D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE 지정됨)입니다.
가위 사각형 설정
가위 사각형은 출력 병합기 단계로 전송될 픽셀 수를 줄일 수 있는 또 다른 기회를 제공합니다. 가위 사각형 외부의 픽셀은 삭제됩니다. 가위 사각형의 크기는 정수로 지정됩니다. 래스터화 중에 하나의 가위 사각형(시스템 값 의미 체계의ViewportArrayIndex 기반)만 삼각형에 적용할 수 있습니다.
가위 사각형을 사용하도록 설정하려면 ScissorEnable 멤버( D3D11_RASTERIZER_DESC1)를 사용합니다. 기본 가위 사각형은 빈 사각형입니다. 즉, 모든 사각형 값은 0입니다. 즉, 가위 사각형을 설정하지 않고 가위를 사용하도록 설정하면 출력 병합기에 픽셀을 보내지 않습니다. 가장 일반적인 설정은 가위 사각형을 뷰포트 크기로 초기화하는 것입니다.
가위 사각형 배열을 디바이스로 설정하려면 D3D11_RECT 사용하여 ID3D11DeviceContext::RSSetScissorRects를 호출합니다.
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 );
이 상태 집합 예제는 아마도 가장 기본적인 래스터라이저 설정을 수행합니다.
- 단색 채우기 모드
- 백 페이스를 제거하거나 제거합니다. 기본 형식에 대해 시계 반대 방향으로 구불구불한 순서를 가정합니다.
- 깊이 바이어스를 해제하지만 깊이 버퍼링을 사용하도록 설정하고 가위 사각형을 사용하도록 설정
- 다중 샘플링 및 줄 앤티앨리어싱 끄기
또한 기본 래스터라이저 작업에는 항상 클리핑(보기 frustum), 원근 분할 및 뷰포트 배율을 포함합니다. 래스터라이저 상태 개체를 성공적으로 만든 후 다음과 같이 디바이스로 설정합니다.
g_pd3dContext->RSSetState(g_pRasterState);
다중 샘플링
다중 샘플링은 다각형 가장자리를 그리기 때문에 가장 눈에 띄는 형태의 별칭을 줄이기 위해 이미지의 구성 요소 중 일부 또는 전부를 더 높은 해상도(원래 해상도로 다운샘플링)로 샘플링합니다. 다중 샘플링에는 하위 픽셀 샘플이 필요하지만 최신 GPU는 픽셀 셰이더가 픽셀당 한 번 실행되도록 다중 샘플링을 구현합니다. 이렇게 하면 성능(특히 GPU 바인딩된 애플리케이션)과 최종 이미지의 앤티앨리어싱 간에 적절한 절충이 가능합니다.
다중 샘플링을 사용하려면 래스터화 설명에서 사용 필드를 설정하고, 다중 샘플링된 렌더링 대상을 만들고, 셰이더를 사용하여 렌더링 대상을 읽어 샘플을 단일 픽셀 색으로 resolve 또는 ID3D11DeviceContext::ResolveSubresource를 호출하여 비디오 카드 사용하여 샘플을 resolve. 가장 일반적인 시나리오는 하나 이상의 다중 샘플링 렌더링 대상에 그리는 것입니다.
다중 샘플링은 샘플 마스크 사용 여부, 알파-검사 사용 여부 또는 스텐실 연산(항상 샘플별로 수행됨)과는 별개입니다.
깊이 테스트는 다중 샘플링의 영향을 받습니다.
- 다중 샘플링을 사용하도록 설정하면 깊이가 샘플당 보간되고 깊이/스텐실 테스트는 샘플별로 수행됩니다. 픽셀 셰이더 출력 색은 전달되는 모든 샘플에 대해 중복됩니다. 픽셀 셰이더가 깊이를 출력하는 경우 깊이 값은 모든 샘플에 대해 중복됩니다(이 시나리오는 다중 샘플링의 이점을 상실하지만).
- 다중 샘플링을 사용하지 않도록 설정하면 깊이/스텐실 테스트는 여전히 샘플별로 수행되지만 깊이는 샘플당 보간되지 않습니다.
단일 렌더링 대상 내에서 다중 샘플링된 렌더링과 다중 샘플링되지 않은 렌더링을 혼합하는 데는 제한이 없습니다. 다중 샘플링을 사용하도록 설정하고 다중 샘플링되지 않은 렌더링 대상에 그리는 경우 다중 샘플링을 사용하도록 설정하지 않은 경우와 동일한 결과를 생성합니다. 샘플링은 픽셀당 단일 샘플로 수행됩니다.
관련 항목