Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Blandningsåtgärder utförs på varje pixelshaderresultat (RGBA-värde) innan utdatavärdet skrivs till ett mål för rendering. Om multisampling är aktiverat görs blandning på varje multisample. annars utförs blandning på varje pixel.
Skapa blandningstillståndet
Blandningstillståndet är en samling tillstånd som används för att styra blandning. Dessa tillstånd (definieras i D3D11_BLEND_DESC1) används för att skapa blandningstillståndsobjektet genom att anropa ID3D11Enhet1::CreateBlendState1.
Här är till exempel ett mycket enkelt exempel på skapande av blandningstillstånd som inaktiverar alfablandning och inte använder någon pixelmaskering per komponent.
ID3D11BlendState1* g_pBlendStateNoBlend = NULL;
D3D11_BLEND_DESC1 BlendState;
ZeroMemory(&BlendState, sizeof(D3D11_BLEND_DESC1));
BlendState.RenderTarget[0].BlendEnable = FALSE;
BlendState.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
pd3dDevice->CreateBlendState1(&BlendState, &g_pBlendStateNoBlend);
Det här exemplet liknar HLSLWithoutFX10 Sample.
Binda blandningstillståndet
När du har skapat blend-state-objektet binder du blend-state-objektet till fasen output-merger genom att anropa ID3D11DeviceContext::OMSetBlendState.
float blendFactor[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
UINT sampleMask   = 0xffffffff;
pd3dDevice->OMSetBlendState(g_pBlendStateNoBlend, blendFactor, sampleMask);
Det här API:et tar tre parametrar: blandningstillståndsobjektet, en blandningsfaktor med fyra komponenter och en exempelmask. Du kan skicka in NULL- för blandningstillståndsobjektet för att ange standardblandningstillståndet eller skicka in ett blandningstillståndsobjekt. Om du har skapat blend-state-objektet med D3D11_BLEND_BLEND_FACTOR eller D3D11_BLEND_INV_BLEND_FACTORkan du skicka en blandningsfaktor för att modulera värden för pixelskuggningen, rendera mål eller båda. Om du inte skapade blandningstillståndsobjektet med D3D11_BLEND_BLEND_FACTOR eller D3D11_BLEND_INV_BLEND_FACTORkan du fortfarande skicka en icke-NULL-blandningsfaktor, men blandningssteget använder inte blandningsfaktorn. körningen lagrar blandningsfaktorn och du kan senare anropa ID3D11DeviceContext::OMGetBlendState för att hämta blandningsfaktorn. Om du skickar NULL, använder eller lagrar körningen en blandningsfaktor som är lika med { 1, 1, 1, 1 }. Exempelmasken är en användardefinierad mask som avgör hur det befintliga återgivningsmålet ska samplas innan det uppdateras. Standardsamplingsmasken är 0xffffffff som anger punktsampling.
I de flesta djupbuffertningsscheman är pixeln närmast kameran den som ritas. När konfigurerar djupstenciltillståndetkan DepthFunc medlem i D3D11_DEPTH_STENCIL_DESC vara valfri D3D11_COMPARISON_FUNC. Normalt skulle du vilja att DepthFunc vara D3D11_COMPARISON_LESS, så att pixlarna närmast kameran skriver över bildpunkterna bakom dem. Beroende på programmets behov kan dock någon av de andra jämförelsefunktionerna användas för att göra djuptestet.
Avancerade blandningsteman
Alfa-To-Coverage
Alfa-till-täckning är en multisamplingsteknik som är mest användbar för situationer som t.ex. tätt lövverk där det finns flera överlappande polygoner som använder alfatransparens för att definiera kanter inom ytan.
Du kan använda AlphaToCoverageEnable medlem i D3D11_BLEND_DESC1 eller D3D11_BLEND_DESC för att växla om körningen konverterar .a-komponenten (alfa) i utdataregistret SV_Target0 från pixelskuggningen till en n-stegs täckningsmask (givet ett n-exempel RenderTarget). Körningen utför en OCH drift av masken med den typiska exempeltäckningen för pixeln i primitiven (förutom exempelmasken) för att avgöra vilka exempel som ska uppdateras i alla aktiva RenderTargets.
Om pixelshadern ger ut SV_Coverage, så stänger körningen av alfa-till-täckning.
Notera
I multisampling delar runtime-miljön endast en täckning för alla RenderTargets. Körtiden läser och konverterar .a från utdata SV_Target0 till täckning när AlphaToCoverageEnable är TRUE, men det ändrar inte .a-värdet som kommer till blandaren på RenderTarget 0 (om en RenderTarget sätts där). Om du aktiverar alfa-till-täckning påverkar du i allmänhet inte hur alla färgutdata från pixelskuggningar interagerar med RenderTargetgenom utdatasammanslagningssteg förutom att körningen utför en OCH åtgärd av täckningsmasken med alfa-till-täckningsmasken. Alfa-till-täckning fungerar oberoende av om körningen kan blanda RenderTarget eller om du använder dig av blandning på RenderTarget.
Grafikmaskinvaran anger inte exakt hur den konverterar pixelskuggning SV_Target0.a (alfa) till en täckningsmask, förutom att alfa på 0 (eller mindre) måste mappas till ingen täckning och alfa på 1 (eller större) måste mappas till full täckning (innan körningen utför en OCH åtgärd med faktisk primitiv täckning). När alfa går från 0 till 1 bör den resulterande täckningen i allmänhet öka monotont. Maskinvara kan dock utföra områdesdithering för att ge en bättre kvantisering av alfavärden på bekostnad av rumslig upplösning och brus. Ett alfavärde för NaN (inte ett tal) resulterar i en mask utan täckning (noll).
Alfa-till-täckning används också traditionellt för skärmdörrstransparens eller definiera detaljerade silhuetter för annars ogenomskinliga sprites.
Blanda Pixel Shader-utdata
Med den här funktionen kan utdatasammanslagningen använda både pixelskuggningsutdata samtidigt som indatakällor till en blandningsåtgärd med det enskilda återgivningsmålet på plats 0.
Det här exemplet tar två resultat och kombinerar dem i ett steg, där ett blandas in i destinationen genom att multiplicera det och det andra adderas.
SrcBlend = D3D11_BLEND_ONE;
DestBlend = D3D11_BLEND_SRC1_COLOR;
I det här exemplet konfigureras den första pixel shader-utdatan som källfärg och det andra utdata som en blandningsfaktor per färgkomponent.
SrcBlend = D3D11_BLEND_SRC1_COLOR;
DestBlend = D3D11_BLEND_INV_SRC1_COLOR;
Det här exemplet illustrerar hur blandningsfaktorerna måste matcha skuggningssvaggningarna:
SrcFactor = D3D11_BLEND_SRC1_ALPHA;
DestFactor = D3D11_BLEND_SRC_COLOR;
OutputWriteMask[0] = .ra; // pseudocode for setting the mask at
                          // RenderTarget slot 0 to .ra
Tillsammans innebär blandningsfaktorerna och skuggningskoden att pixelskuggningen krävs för att mata ut minst o0.r och o1.a. Extra utdatakomponenter kan matas ut av shaddern, men de skulle ignoreras, medan färre komponenter skulle ge odefinierade resultat.
Relaterade ämnen