Dela via


Använda skuggningar i Direct3D 10

Pipelinen har tre shadersteg och varje steg är programmerat med en HLSL-shader. Alla Direct3D 10-skuggningar är skrivna i HLSL och riktar in sig på skuggningsmodell 4.

Skillnader mellan Direct3D 9 och Direct3D 10:

  • Till skillnad från Direct3D 9-skuggningsmodeller som kan redigeras i ett mellanliggande sammansättningsspråk, redigeras skuggningsmodell 4.0-skuggningar endast i HLSL. Offlinekompilering av skuggningar till enhetsförbrukningsbar bytekod stöds fortfarande och rekommenderas för de flesta scenarier.

I det här exemplet används endast en hörnskuggning. Eftersom alla skuggningar är byggda från den gemensamma skuggningskärnan är det mycket likt att lära sig att använda en hörnskuggning med hjälp av en geometri eller pixelskuggning.

När du har skapat en HLSL-skuggning (i det här exemplet används vertexskuggningen HLSLWithoutFX.vsh) måste du förbereda den för den specifika pipeline-fas som ska använda den. För att göra detta måste du:

De här stegen måste upprepas för varje skuggning i pipelinen.

Kompilera en Shader

Det första steget är att kompilera skuggningen för att kontrollera att du har kodat HLSL-uttrycken korrekt. Detta görs genom att anropa D3D10CompileShader och förse den med flera parametrar som visas här:

    IPD3D10Blob * pBlob;
    
        
    // Compile the vertex shader from the file
    D3D10CompileShader( strPath, strlen( strPath ), "HLSLWithoutFX.vsh", 
        NULL, NULL, "Ripple", "vs_4_0", dwShaderFlags, &pBlob, NULL );

Den här funktionen tar följande parametrar:

  • Namnet på filen ( och längden på namnsträngen i byte ) som innehåller skuggningen. I det här exemplet används endast en hörnskuggning (i filen HLSLWithoutFX.vsh-filen där filnamnstillägget .vsh är en förkortning för hörnskuggning).

  • Skuggningsfunktionens namn. Det här exemplet kompilerar en vertex shader från funktionen Ripple som tar en enda indata och returnerar en utdata-struktur (funktionen finns i HLSLWithoutFX-exemplet).

    VS_OUTPUT Ripple( in float2 vPosition : POSITION )
    
  • En pekare till alla makron som används av skuggningen. Använd D3D10_SHADER_MACRO för att definiera dina makron. skapa helt enkelt en namnsträng som innehåller alla makronamn (med varje namn avgränsat med ett blanksteg) och en definitionssträng (med varje makrotext avgränsad med ett blanksteg). Båda strängarna måste vara NULL-avslutade.

  • En pekare till andra filer som du behöver inkludera för att få skuggningsfilerna att kompilera. Detta använder gränssnittet ID3D10Include som har två användarindelade metoder: Öppna och Stäng. För att det här ska fungera måste du implementera brödtexten i metoderna Öppna och Stäng. I metoden Öppna lägger du till den kod som du använder för att öppna de inkluderingsfiler du vill ha. I funktionen Stäng lägger du till koden för att stänga filerna när du är klar med dem.

  • Namnet på skuggningsfunktionen som ska kompileras. Den här skuggningen kompilerar Ripple-funktionen.

  • Skuggningsprofilen som ska användas vid kompilering. Eftersom du kan kompilera en funktion till ett hörn, geometri eller pixelskuggning, anger profilen för kompilatorn vilken typ av skuggning och vilken skuggningsmodell som koden ska jämföras med.

  • Shader-kompilatorflaggor. Dessa flaggor talar om för kompilatorn vilken information som ska läggas till i kompilerade utdata och hur du vill att utdatakoden ska optimeras: för hastighet, för felsökning osv. Se Effect Constants (Direct3D 10) för en lista över tillgängliga flaggor. Exemplet innehåller kod som du kan använda för att ange kompilatorns flaggvärden för projektet – det här är främst en fråga om du vill generera felsökningsinformation eller inte.

  • En pekare till bufferten som innehåller den kompilerade skuggningskoden. Bufferten innehåller även all inbäddad felsöknings- och symboltabellinformation som begärs av kompilatorflaggor.

  • En pekare till en buffert som innehåller en lista över fel och varningar som påträffades under kompileringen, vilket är samma meddelanden som du skulle se i felsökningsutdata om du körde felsökningsprogrammet när du kompilerade skuggningen. NULL- är ett acceptabelt värde när du inte vill att felen ska returneras till en buffert.

Om shadern kompileras framgångsrikt returneras en pekare till shaderkoden som ett ID3D10Blob-gränssnitt. Det kallas blobgränssnittet eftersom pekaren är till en plats i minnet som består av en matris med DWORD. Gränssnittet tillhandahålls så att du kan få en pekare till den kompilerade skuggning som du behöver i nästa steg.

Från och med december 2006 SDK är DirectX 10 HLSL-kompilatorn nu standardkompilatorn i både DirectX 9 och DirectX 10. Mer information finns i Effect-Compiler Tool.

Hämta en pekare till en kompilerad skuggning

Flera API-metoder kräver en pekare till en kompilerad skuggning. Det här argumentet kallas vanligtvis pShaderBytecode eftersom det pekar på en kompilerad skuggning som representeras som en sekvens med bytekoder. Om du vill hämta en pekare till en kompilerad skuggning kompilerar du först skuggningen genom att anropa D3D10CompileShader eller en liknande funktion. Om kompileringen lyckas returneras den kompilerade skuggningen i ett ID3D10Blob--gränssnitt. Använd slutligen metoden GetBufferPointer för att returnera pekaren.

Skapa ett skuggningsobjekt

När skuggningen har kompilerats anropar du CreateVertexShader för att skapa skuggningsobjektet:

    ID3D10VertexShader ** ppVertexShader
    ID3D10Blob pBlob;


    // Create the vertex shader
    hr = pd3dDevice->CreateVertexShader( (DWORD*)pBlob->GetBufferPointer(),
        pBlob->GetBufferSize(), &ppVertexShader );

    // Release the pointer to the compiled shader once you are done with it
    pBlob->Release();

Om du vill skapa skuggningsobjektet skickar du pekaren till den kompilerade skuggningen till CreateVertexShader. Eftersom du var tvungen att kompilera shadert först kommer det här anropet nästan säkert att fungera, om det inte finns ett minnesproblem på din dator.

Du kan skapa så många skuggningsobjekt som du vill och bara hålla pekare mot dem. Samma mekanism fungerar för geometri- och pixelskuggare förutsatt att du matchar skuggningsprofilerna (när du anropar kompileringsmetoden) med gränssnittsnamnen (när du anropar metoden create).

Ange skuggningsobjektet

Det sista steget är att ställa in skuggningen på pipelinesteget. Eftersom det finns tre skuggningssteg i pipelinen måste du göra tre API-anrop, ett för varje steg.

    // Set a vertex shader
    pd3dDevice->VSSetShader( g_pVS10 );

Anropet till VSSetShader tar pekaren till vertexshadern som skapades i steg 1. Detta ställer in shadern i enheten. Hörnskuggningssteget initieras nu med dess hörnskuggningskod, allt som återstår initierar alla skuggningsvariabler.

Upprepa för alla tre skuggningsstegen

Upprepa samma uppsättning steg för att skapa en vertexshader, pixelshader eller till och med en geometrishader som skickar ut till pixelshadern.

kompilering av skuggor

programmeringsguide för HLSL