Udostępnij za pośrednictwem


Wprowadzenie do etapu rastrowania

W tej sekcji opisano ustawianie obszaru widoku, prostokąta wycinania, stanu rasteryzatora i wielokrotnego próbkowania.

Ustaw okno widoku

Port widoków mapuje pozycje wierzchołków (w obszarze klipu) na pozycje docelowe renderowania. Ten krok skaluje pozycje 3D do przestrzeni 2D. Obiekt docelowy renderowania jest zorientowany na osie Y wskazujące w dół; wymaga to przerzucania współrzędnych Y podczas skalowania widoku. Ponadto zakresy x i y (zakres wartości x i y) są skalowane w celu dopasowania rozmiaru widoku do następujących formuł:

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) 

Samouczek 1 tworzy widok 640 × 480 przy użyciu D3D11_VIEWPORT oraz wywołując ID3D11DeviceContext::RSSetViewports.

    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 );

Opis okna określa rozmiar portu, zakres do mapowania głębokości (przy użyciu MinDepth i MaxDepth) oraz położenie lewej górnej części okna. MinDepth musi być mniejszy lub równy MaxDepth; zakres zarówno dla MinDepth, jak i dla MaxDepth wynosi od 0,0 do 1,0 włącznie. Często widok odwzorowuje się na obiekt docelowy renderowania, ale nie jest to konieczne; ponadto widok nie musi mieć tego samego rozmiaru ani położenia co obiekt docelowy renderowania.

Można utworzyć tablicę widoków, ale tylko jeden można zastosować do pierwotnych danych wyjściowych z cieniowania geometrii. Jednocześnie aktywne może być tylko jedno okno widoku. Pipeline używa domyślnego widoku (oraz prostokąta nożycowego, który zostanie omówiony w następnej sekcji) podczas procesu rasteryzacji. Wartość domyślna to zawsze pierwsze okienko widoku (lub prostokąt nożycowy) w tablicy. Aby wykonać selekcję według prymitywów w shaderze geometrii, określ semantykę ViewportArrayIndex dla odpowiedniego składnika wyjściowego GS w deklaracji sygnatury wyjściowej GS.

Maksymalna liczba przekrojów widoku oraz prostokątów nożycowych, które mogą być powiązane z etapem rasteryzacji jednocześnie, wynosi 16 (określone przez D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE).

Ustawianie prostokąta nożyczkowego

Prostokąt nożycy daje kolejną możliwość zmniejszenia liczby pikseli, które zostaną wysłane do etapu fuzji danych wyjściowych. Piksele poza prostokątem nożycowym są odrzucane. Rozmiar prostokąta nożycy jest określony w liczbach całkowitych. Tylko jeden prostokąt przycięcia (oparty na ViewportArrayIndex w semantyce wartości systemu ) można zastosować do trójkąta podczas rasteryzacji.

Aby włączyć prostokąt nożyc, użyj członka ScissorEnable (w D3D11_RASTERIZER_DESC1). Domyślny prostokąt nożycy jest pustym prostokątem; oznacza to, że wszystkie wartości rect są równe 0. Innymi słowy, jeśli nie skonfigurujesz prostokąta kadrowania i funkcja przycinania nie będzie aktywna, nie wyślesz żadnych pikseli do etapu scalania danych wyjściowych. Najczęstszą konfiguracją jest zainicjowanie prostokąta przycinania do rozmiaru obszaru widoku.

Aby ustawić tablicę prostokątów nożycowych na urządzenie, wywołaj metodę ID3D11DeviceContext::RSSetScisorRects za pomocą 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 );

Ta metoda przyjmuje dwa parametry: (1) liczbę prostokątów w tablicy i (2) tablicę prostokątów.

Potok używa domyślnego indeksu prostokąta nożycowego podczas rasteryzacji (wartość domyślna to prostokąt o zerowym rozmiarze z wyłączonym przycinaniem). Aby to przesłonić, określ semantykę SV_ViewportArrayIndex dla składnika wyjściowego GS w deklaracji sygnatury wyjściowej GS. Spowoduje to oznaczenie tego składnika wyjściowego GS jako składnika wygenerowanego przez system, z przypisaniem tej semantyki na etapie GS. Etap rasteryzatora rozpoznaje tę semantykę i użyje parametru, do którego jest dołączony, jako indeks prostokąta przycinania w celu uzyskania dostępu do tablicy prostokątów przycinania. Nie zapomnij poinformować etapu rasterizatora, aby użyć prostokąta nożycowego zdefiniowanego przez włączenie wartości ScissorEnable w opisie rasterizatora przed utworzeniem obiektu rasterizatora.

Ustawianie stanu rasteryzatora

Począwszy od Direct3D 10, stan rasteryzatora jest hermetyzowany w obiekcie stanu rasterizatora. Można utworzyć do 4096 obiektów stanu rasteryzatora, które następnie można ustawić na urządzeniu, przekazując uchwyt do obiektu stanu.

Użyj ID3D11Device1::CreateRasterizerState1, aby utworzyć obiekt stanu rasterizatora na podstawie opisu rasterizatora (zobacz 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 );

Ten przykładowy zestaw stanu osiąga prawdopodobnie najbardziej podstawową konfigurację rasterizatora:

  • Tryb wypełnienia ciągłego
  • Wysuń lub usuń tylne twarze; przyjmij kolejność uzwojenia w kierunku wskazówek zegara dla elementów pierwotnych
  • Wyłącz odchylenie głębokości, ale włącz buforowanie głębokości i włącz prostokąt nożycy
  • Wyłącz wielokrotne próbkowanie i wygładzanie krawędzi linii

Ponadto podstawowe operacje rasteryzatora zawsze obejmują następujące elementy: przycinanie (do stożka widzenia), dzielenie perspektywy i skalowanie widoku. Po pomyślnym utworzeniu obiektu stanu rasteryzatora, zastosuj go w urządzeniu w następujący sposób:

    g_pd3dContext->RSSetState(g_pRasterState);

Wieloprzykładowe

Próbkowanie wieloprzykładowe próbkuje niektóre lub wszystkie składniki obrazu w wyższej rozdzielczości (a następnie downsampling do oryginalnej rozdzielczości), aby zmniejszyć najbardziej widoczną formę aliasowania spowodowanego rysowaniem krawędzi wielokątnych. Mimo że wieloprzykładowe próbkowanie wymaga próbek podpikselowych, nowoczesne GPU implementują wieloprzykładowe próbkowanie w taki sposób, że cieniowanie pikseli jest przeprowadzane raz na piksel. Zapewnia to akceptowalny kompromis między wydajnością (zwłaszcza w aplikacji powiązanej z procesorem GPU) i anty aliasowaniem końcowego obrazu.

Aby użyć wieloamplingu, ustaw pole włączania w opisie rasteryzacji , utwórz obiekt docelowy renderowania wieloprzykładowego i odczytaj obiekt docelowy renderowania z cieniowaniem, aby rozpoznać próbki w kolorze pojedynczego piksela lub wywołać ID3D11DeviceContext::ResolveSubresource, aby rozwiązać przykłady przy użyciu karty wideo. Najczęstszym scenariuszem jest rysowanie na jeden lub więcej wielokrotnie próbkowanych celów renderowania.

Multisampling jest niezależny od tego, czy jest używana maska próbki, funkcja alpha-to-coverage jest włączona, czy operacje wzornika (które są zawsze wykonywane dla każdej próbki).

Wieloprzykładowe próbkowanie wpływa na testowanie głębokości.

  • Po włączeniu wielopróbkowania, głębokość jest interpolowana na próbce, a test głębokości/wzornika odbywa się na próbce; kolor wyjściowy z cieniowania pikseli jest duplikowany dla wszystkich przejściowych próbek. Jeśli shader pikseli wyprowadza wartość głębokości, jest ona duplikowana dla wszystkich próbek (chociaż w tym scenariuszu traci się korzyść z wielokrotnego próbkowania).
  • Gdy wieloprzykładowe jest wyłączone, testowanie głębokości/wzornika jest nadal wykonywane na próbkę, ale głębokość nie jest interpolowana na próbkę.

Nie ma żadnych ograniczeń dotyczących mieszania renderowania wielopróbkowego i nie-wielopróbkowego w ramach pojedynczego elementu docelowego renderowania. Jeśli włączysz wieloprzykładowe próbkowanie i narysujesz obiekt docelowy renderowania bez wielu próbek, wynik będzie taki sam jak wtedy, gdy nie włączono wieloamplingu; Próbkowanie odbywa się przy użyciu pojedynczej próbki na piksel.

Etap rasteryzatora