Komma igång med rastreringssteget

I det här avsnittet beskrivs hur du ställer in visningsporten, saxrektangeln, rastreringstillståndet och multisampling.

Ange Viewport

En vyport mappar hörnpositioner (i klipputrymme) till rendera målpositioner. Det här steget skalar 3D-positionerna till 2D-utrymme. Ett återgivningsmål är inriktat med Y-axlarna som pekar nedåt. Detta kräver att Y-koordinaterna vänds under viewport-skalan. Dessutom skalas x- och y-omfattningarna (intervallet för x- och y-värdena) så att de passar visningsportens storlek enligt följande formler:

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) 

Självstudie 1 skapar en 640 × 480-vyport med D3D11_VIEWPORT och genom att anropa 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 );

Beskrivningen av visningsporten anger storleken på visningsporten, det område som du vill mappa djup till (med hjälp av MinDepth och MaxDepth) och placeringen av det övre vänstra hörnet i visningsfältet. MinDepth måste vara mindre än eller lika med MaxDepth; intervallet för både MinDepth och MaxDepth är mellan 0.0 och 1.0, inklusive. Det är vanligt att visningsporten mappas till ett återgivningsmål, men det är inte nödvändigt. Dessutom behöver vyporten inte ha samma storlek eller position som återgivningsmålet.

Du kan skapa en matris med visningsportar, men bara en kan tillämpas på primitiva utdata från geometriskuggningen. Endast en visningsport kan anges aktiv åt gången. Pipelinen använder en standardvisningsport (och en klipprektangel som beskrivs i nästa avsnitt) under rastreringen. Standardvärdet är alltid den första visningsplatsen (eller saxrektangeln) i matrisen. Om du vill utföra ett per primitivt val av visningsporten i geometriskuggningen anger du semantiken ViewportArrayIndex för lämplig GS-utdatakomponent i GS-utdatasignaturdeklarationen.

Det maximala antalet visningsportar (och saxrektanglar) som kan bindas till rastreringssteget samtidigt är 16 (anges av D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE).

Ange scissor-rektangeln

En saxrektangel ger dig en annan möjlighet att minska antalet bildpunkter som skickas till fusionsfasen för utdata. Bildpunkter utanför klipprektangeln kastas bort. Storleken på saxrektangeln anges i heltal. Endast en saxrektangel (baserat på ViewportArrayIndex i systemvärdessemantik) kan tillämpas på en triangel under rasteriseringen.

Aktivera saxrektangeln genom att använda ScissorEnable medlemmen (i D3D11_RASTERIZER_DESC1). Standardrektangeln för sax är en tom rektangel. Dvs. alla rect-värden är 0. Med andra ord, om du inte konfigurerar saxrektangeln och saxen är aktiverad, skickar du inga bildpunkter till fasen för sammanslagning av utdata. Den vanligaste konfigurationen är att ställa in saxrektangeln efter storleken på vyporten.

Om du vill ange en matris med saxrektanglar till enheten anropar du ID3D11DeviceContext::RSSetScissorRects med 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 );

Den här metoden tar två parametrar: (1) antalet rektanglar i matrisen och (2) en matris med rektanglar.

Pipeline använder ett standardsaxklippsrektangelindex under rastreringen (standardvärdet är en rektangel med storlek noll med klippning avaktiverad). För att åsidosätta detta, ange semantiken för SV_ViewportArrayIndex till en GS-utdatakomponent i GS-utdatasignaturdeklarationen. Detta gör att GS-stadiet markerar den här GS-utdatakomponenten som en systemgenererad komponent med den här semantiken. Rastreringssteget identifierar den här semantiken och använder den parameter som den är kopplad till som scissor-rektangelindex för att komma åt matrisen med saxrektanglar. Glöm inte att tala om för rastreringssteget att använda den saxrektangel som du definierar genom att aktivera värdet ScissorEnable i rastreringsbeskrivningen innan du skapar rastreringsobjektet.

Ange rastreringstillstånd

Från och med Direct3D 10 kapslas rastreringstillståndet in i ett rastreringstillståndsobjekt. Du kan skapa upp till 4096 rasteriseringsstatusobjekt som sedan kan konfigureras för enheten genom att skicka en referens till statusobjektet.

Använd ID3D11Device1::CreateRasterizerState1 för att skapa ett rastreringstillståndsobjekt från en rastreringsbeskrivning (se 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 );

Den här exempeluppsättningen av tillstånd åstadkommer kanske den mest grundläggande rastreringskonfigurationen:

  • Läge för fast fyllning
  • Gallra ut eller ta bort bakytor; anta motsols lindningsordning för primitiva objekt
  • Stäng av djupförskjutning men aktivera djupbuffrering och aktivera scissorrektangeln
  • Inaktivera flersampling och kantutjämning av linjer

Dessutom innehåller grundläggande rasteriseringsprocesser alltid följande: klippning (till vyfrustret), perspektivdelning och vyportskalan. När du har skapat rastreringstillståndsobjektet ställer du in det på enheten så här:

    g_pd3dContext->RSSetState(g_pRasterState);

Multisampling

Flerasamplingsexempel på vissa eller alla komponenter i en bild med högre upplösning (följt av nedsampling till den ursprungliga upplösningen) för att minska den mest synliga formen av alias som orsakas av ritning av polygonkanter. Även om multisampling kräver delpunktsexempel implementerar den moderna GPU:n multisampling så att en pixelskuggning körs en gång per pixel. Detta ger en acceptabel kompromiss mellan prestanda (särskilt i ett GPU-bundet program) och aliasutjämning av den slutliga avbildningen.

Om du vill använda multisampling anger du fältet aktivera i rastreringsbeskrivning, skapa ett flersamplingsåtergivningsmål och antingen läs återgivningsmålet med en shader för att sammanfoga proverna till en enda pixelfärg eller anropa ID3D11DeviceContext::ResolveSubresource för att lösa proverna med grafikkortet. Det vanligaste scenariot är att rita till ett eller flera flersamplade återgivningsmål.

Multisampling är oberoende av om en exempelmask används, alfa-till-täckning är aktiverad eller stencilåtgärder (som alltid utförs per exempel).

Djuptestning påverkas av multisampling:

  • När multisampling är aktiverat interpoleras djup per prov och djup-/stenciltestet görs per prov. pixelskuggningsfärgen dupliceras för alla exempel som skickas. Om pixelskuggaren matar ut djup dupliceras djupvärdet för alla exempel (även om det här scenariot förlorar fördelen med multisampling).
  • När multisampling är inaktiverat utförs djup-/stenciltestning fortfarande per exempel, men djupet interpoleras inte per exempel.

Det finns inga begränsningar för att blanda rendering med multisampling och utan multisampling inom ett enda återgivningsmål. Om du aktiverar multisampling och ritar till ett icke-multisamplerat återgivningsmål får du samma resultat som om multisampling inte var aktiverat. sampling görs med ett enda exempel per pixel.

Rasterizersteg