Skapa ett holografiskt DirectX-projekt

Anteckning

Den här artikeln handlar om äldre inbyggda WinRT-API:er. För nya interna appprojekt rekommenderar vi att du använder OpenXR-API:et.

En holografisk app som du skapar för en HoloLens blir en Universell Windows-plattform-app (UWP). Om du riktar in dig på stationära Windows Mixed Reality headset kan du skapa en UWP-app eller en Win32-app.

Den holografiska UWP-appmallen DirectX 11 liknar UWP-appmallen DirectX 11. Mallen innehåller en programloop, en DeviceResources-klass för att hantera Direct3D-enheten och kontexten och en förenklad innehållsåtergivningsklass. Den har också en IFrameworkView, precis som alla andra UWP-appar.

Mixed Reality-appen har dock vissa ytterligare funktioner som inte finns i en typisk Direct3D UWP-app. Den Windows Mixed Reality appmallen kan:

  • Hantera Direct3D-enhetsresurser som är associerade med holografiska kameror.
  • Hämta tillbaka kamerabuffertar från systemet. När det gäller Direct3D12 skapar du holografiska buffertresurser och hanterar resurslivslängder.
  • Hantera blickindata och identifiera en gest.
  • Gå till stereoåtergivningsläge i helskärmsläge.

Hur kommer jag igång?

Installera först verktygen genom att följa anvisningarna för att ladda ned Visual Studio 2019 och Windows Mixed Reality appmallar. Appmallarna för mixad verklighet är tillgängliga på Visual Studio Marketplace som en webbnedladdning eller genom att installera dem som ett tillägg via Visual Studio-användargränssnittet.

Nu är du redo att skapa din DirectX 11-Windows Mixed Reality-app! Observera att om du vill ta bort exempelinnehållet kommenterar du ut DRAW_SAMPLE_CONTENT preprocessor-direktivet i pch.h.

Skapa ett UWP-projekt

När verktygen har installerats kan du sedan skapa ett holografiskt DirectX UWP-projekt.

Så här skapar du ett nytt projekt i Visual Studio 2019:

  1. Starta Visual Studio.
  2. I avsnittet Kom igång till höger väljer du Skapa ett nytt projekt.
  3. I listrutorna i dialogrutan Skapa ett nytt projekt väljer du C++, Windows Mixed Reality och UWP.
  4. Välj Holographic DirectX 11 App (Universal Windows) (C++/WinRT). Skärmbild av projektmallen Holographic DirectX 11 C++/WinRT UWP-app i Visual Studio 2019
    Holographic DirectX 11 C++/WinRT UWP-appprojektmall i Visual Studio 2019

    Viktigt

    Se till att projektmallens namn innehåller "(C++/WinRT)". Annars har du en äldre version av de holografiska projektmallarna installerade. Om du vill hämta de senaste projektmallarna installerar du dem som ett tillägg till Visual Studio 2019.

  5. Välj Nästa.
  6. Fyll i textrutorna Projektnamn och Plats och välj eller tryck på Skapa. Det holografiska appprojektet skapas.
  7. För utveckling som endast är HoloLens 2 kontrollerar du att målversionen och lägsta version är inställda på Windows 10 version 1903. Om du även riktar in dig på HoloLens (1:a generationen) eller stationära Windows Mixed Reality headset kan du ange Lägsta version till Windows 10 version 1809. Detta kräver vissa versionsanpassade kontroller i koden när du använder nya funktioner i HoloLens 2. Skärmbild av inställningen Windows 10 version 1903 som målversion och lägsta version
    Ange Windows 10 version 1903 som målversion och lägsta version

    Viktigt

    Om du inte ser Windows 10 version 1903 som ett alternativ har du inte den senaste Windows 10 SDK installerad. Om du vill att det här alternativet ska visas installerar du version 10.0.18362.0 eller senare av Windows 10 SDK.

Så här skapar du ett nytt projekt i Visual Studio 2017:

  1. Starta Visual Studio.
  2. Peka på NyttArkiv-menyn och välj Projekt på snabbmenyn. Dialogrutan Nytt projekt öppnas.
  3. Expandera Installerat till vänster och expandera språknoden Visual C++ .
  4. Gå till noden Windows Universal > Holographic och välj Holographic DirectX 11 App (Universal Windows) (C++/WinRT). Skärmbild av projektmallen Holographic DirectX 11 C++/WinRT UWP-app i Visual Studio 2017
    Holographic DirectX 11 C++/WinRT UWP-appprojektmall i Visual Studio 2017

    Viktigt

    Se till att projektmallens namn innehåller "(C++/WinRT)". Annars har du en äldre version av de holografiska projektmallarna installerade. Om du vill hämta de senaste projektmallarna installerar du dem som ett tillägg till Visual Studio 2017.

  5. Fyll i textrutorna Namn och Plats och välj eller tryck på OK. Det holografiska appprojektet skapas.
  6. För utveckling som endast är HoloLens 2 kontrollerar du att målversionen och lägsta version är inställda på Windows 10 version 1903. Om du även riktar in dig på HoloLens (1:a generationen) eller stationära Windows Mixed Reality headset kan du ange Lägsta version till Windows 10 version 1809. Detta kräver vissa versionsanpassade kontroller i koden när du använder nya funktioner i HoloLens 2. Skärmbild av inställningen Windows 10 version 1903 som målversion och lägsta version
    Ange Windows 10 version 1903 som målversion och lägsta version

    Viktigt

    Om du inte ser Windows 10 version 1903 som ett alternativ har du inte den senaste Windows 10 SDK installerad. Om du vill att det här alternativet ska visas installerar du version 10.0.18362.0 eller senare av Windows 10 SDK.

Mallen genererar ett projekt med C++/WinRT, en C++17-språkprojektion av Windows Runtime API:er som stöder alla standardkompatibla C++17-kompilatorer. Projektet visar hur du skapar en världslåst kub som placeras 2 meter från användaren. Användaren kan lufttrycka eller trycka på en knapp på styrenheten för att placera kuben i en annan position som anges av användarens blick. Du kan ändra det här projektet för att skapa valfri mixed reality-app.

Du kan också skapa ett nytt projekt med hjälp av den holografiska projektmallen Visual C# som baseras på SharpDX. Om ditt holografiska C#-projekt inte startade från Windows Holographic-appmallen måste du kopiera filen ms.fxcompile.targets från ett Windows Mixed Reality C#-mallprojekt och importera den i filen your.csproj för att kompilera HLSL-filer som du lägger till i projektet. En Direct3D 12-mall finns också i tillägget Windows Mixed Reality appmallar till Visual Studio.

Läs Använda Visual Studio för att distribuera och felsöka för information om hur du skapar och distribuerar exemplet till HoloLens, pc med avancerad enhet ansluten eller en emulator.

Resten av anvisningarna nedan förutsätter att du använder C++ för att skapa din app.

Startpunkt för UWP-app

Din holografiska UWP-app startar i funktionen wWinMain i AppView.cpp. Funktionen wWinMain skapar appens IFrameworkView och startar CoreApplication med den.

Från AppView.cpp:

// The main function bootstraps into the IFrameworkView.
int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int)
{
    winrt::init_apartment();
    CoreApplication::Run(AppViewSource());
    return 0;
}

Från och med då hanterar AppView-klassen interaktion med grundläggande Indatahändelser i Windows, CoreWindow-händelser och meddelanden och så vidare. Den skapar även HolographicSpace som används av din app.

Skapa ett Win32-projekt

Det enklaste sättet att komma igång med att skapa ett Win32-holografiskt projekt är att anpassa Exemplet BasicHologram Win32.

Det här Win32-exemplet använder C++/WinRT, en C++17-språkprojektion av Windows Runtime API:er som stöder alla standardkompatibla C++17-kompilatorer. Projektet visar hur du skapar en världslåst kub som placeras 2 meter från användaren. Användaren kan trycka på en knapp på styrenheten för att placera kuben i en annan position som anges av användarens blick. Du kan ändra det här projektet för att skapa valfri mixed reality-app.

Startpunkt för Win32-app

Din holografiska Win32-app startar i funktionen wWinMain i AppMain.cpp. Funktionen wWinMain skapar appens HWND och startar dess meddelandeloop.

Från AppMain.cpp:

int APIENTRY wWinMain(
    _In_     HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_     LPWSTR    lpCmdLine,
    _In_     int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    winrt::init_apartment();

    App app;

    // Initialize global strings, and perform application initialization.
    app.Initialize(hInstance);

    // Create the HWND and the HolographicSpace.
    app.CreateWindowAndHolographicSpace(hInstance, nCmdShow);

    // Main message loop:
    app.Run(hInstance);

    // Perform application teardown.
    app.Uninitialize();

    return 0;
}

Från och med då hanterar Klassen AppMain interaktion med grundläggande fönstermeddelanden och så vidare. Den skapar även HolographicSpace som används av din app.

Rendera holografiskt innehåll

Projektets innehållsmapp innehåller klasser för återgivning av hologram i det holografiska utrymmet. Standardhologrammet i mallen är en snurrande kub som placeras 2 meter från användaren. Ritningen av den här kuben implementeras i SpinningCubeRenderer.cpp, som har följande nyckelmetoder:

Metod Förklaring
CreateDeviceDependentResources Läser in skuggningar och skapar kubnätet.
PositionHologram Placerar hologrammet på den plats som anges av den tillhandahållna SpatialPointerPose.
Update Roterar kuben och anger modellmatrisen.
Render Renderar en ram med hörn- och pixelskuggarna.

Shaders-undermappen innehåller fyra standardimplementeringar för skuggning:

Shader Förklaring
GeometryShader.hlsl En genomströmning som lämnar geometrin oförändrad.
PixelShader.hlsl Passerar genom färgdata. Färgdata interpoleras och tilldelas till en pixel i rasteriseringssteget.
VertexShader.hlsl Enkel skuggning för att utföra hörnbearbetning på GPU:n.
VPRTVertexShader.hlsl Enkel skuggning för hörnbearbetning på GPU:n, som är optimerad för Windows Mixed Reality stereorendering.

VertexShaderShared.hlsl innehåller vanlig kod som delas mellan VertexShader.hlsl och VPRTVertexShader.hlsl.

Obs! Direct3D 12-appmallen innehåller ViewInstancingVertexShader.hlslockså . Den här varianten använder valfria D3D12-funktioner för att återge stereobilder mer effektivt.

Shaders kompileras när projektet skapas och läses in i metoden SpinningCubeRenderer::CreateDeviceDependentResources .

Interagera med dina hologram

Användarindata bearbetas i klassen SpatialInputHandler , som hämtar en SpatialInteractionManager-instans och prenumererar på händelsen SourcePressed . Detta gör det möjligt att identifiera lufttrycksgesten och andra rumsliga indatahändelser.

Uppdatera holografiskt innehåll

Din mixed reality-app uppdateras i en spelloop, som som standard implementeras i metoden Update i AppMain.cpp. Metoden Update uppdaterar scenobjekt, t.ex. den snurrande kuben, och returnerar ett HolographicFrame-objekt som används för att hämta uppdaterade vy- och projektionsmatriser och för att presentera växlingskedjan.

Metoden Render i AppMain.cpp tar HolographicFrame och återger den aktuella ramen till varje holografisk kamera, enligt den aktuella appen och det rumsliga placeringstillståndet.

Kommentarer

Windows Mixed Reality-appmallen har nu stöd för kompilering med Spectre-åtgärdsflaggan aktiverad (/Qspectre). Se till att installera Den Spectre-minimerade versionen av Microsoft Visual C++ (MSVC) körningsbibliotek innan du kompilerar en konfiguration med Spectre-åtgärd aktiverad. Om du vill installera Spectre-minimerade C++-bibliotek startar du Installationsprogrammet för Visual Studio och väljer Ändra. Gå till Enskilda komponenter och sök efter "spectre". Markera de rutor som motsvarar målplattformarna och MSVC-versionen som du behöver kompilera Spectre-minimerad kod för och klicka på Ändra för att påbörja installationen.

Se även