none
Shadow-Mapping mittels DirectX 12 RRS feed

  • Frage

  • Hi allerseits!

    Bin gerade dabei Shadow-Mapping mittels DX12 zu erstellen. Die Frage, die sich mir jetzt stellt, ist wie ich den Depth-Buffer aus dem 1. Renderpass als Shadow-Map für den 2. Render-Pass verwenden kann.

    Meine Idee war, dass ich mit der Funktion CreateShaderRessourceView() einen View für den 2. Renderpass auf den DepthStencilBuffer des ersten Renderpasses erstelle. Also irgendwie so was:

    		DXGI_SAMPLE_DESC sampledesc;
    		sampledesc.Count = 1; 
    		sampledesc.Quality = 0; 
    
    		D3D12_RESOURCE_DESC resourcedesc = {};
    		resourcedesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; // Eine Shadow-Map ist eine 2D-Textur 
    		resourcedesc.Alignment = 0; // Wählt bei 0 von selbst bestes Alignement aus.  
    		resourcedesc.Width = uxShadowMap; // Texels in x-Richtung
    		resourcedesc.Height = uyShadowMap; // ...und y-Richtung 
    		resourcedesc.DepthOrArraySize = 1; 
    		resourcedesc.MipLevels = 0; // Es sollen keine Mipmaps erzeugt werden
    		resourcedesc.Format = DXGI_FORMAT_D32_FLOAT; // Das ist das Format des Depth Buffers
    		resourcedesc.SampleDesc = sampledesc;
    		resourcedesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;  
    		resourcedesc.Flags = D3D12_RESOURCE_FLAG_NONE; 
    
    		D3D12_SHADER_RESOURCE_VIEW_DESC shaderresourceviewdesc = {};
    		ZeroMemory(&shaderresourceviewdesc, sizeof(shaderresourceviewdesc));
    		shaderresourceviewdesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
    		shaderresourceviewdesc.Format = resourcedesc.Format;
    		shaderresourceviewdesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
    		shaderresourceviewdesc.Texture2D.MipLevels = 1;
    		shaderresourceviewdesc.Texture2D.MostDetailedMip = 0;
    		shaderresourceviewdesc.Texture2D.ResourceMinLODClamp = 0.0f;
    
    		m_pdevice->CreateShaderResourceView(m_pressourceDepthStencilShadow, &shaderresourceviewdesc, m_pdescriptorheapDepthStencilShadow->GetCPUDescriptorHandleForHeapStart());
    

    m_pressourceDepthStencilShadow ist dabei der Ressourcenpointer des Depth-Stencil-Buffers des 1. Shadow-Renderpasses. Der ShaderResourceView soll dann als Texturbuffer in den 2. Renderpass eingebunden werden.

    Irgendwie scheint das aber nicht zu funktionieren. Was mache ich falsch?

    Die verständlichen Beispiele im Internet sind alle für DX11, welche aber nicht übertragbar sind.  

    Vielen Dank im Voraus!

     

    Samstag, 26. Januar 2019 18:13

Alle Antworten

  • Hallo HeyaHockUndZock,

    Funktioniert es, wenn Du DXGI_FORMAT_R8G8B8A8_UNORM als Format festlegst?

        resourcedesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;

    Wenn es auch dann nicht klappt, würdest Du es mit einem anderen Wert für MipLevels probieren, auch wenn die MipMaps unnötig sind?

        resourcedesc.MipLevels = 1;

    Sieh Dir dazu den Beispielcode in folgendem Thread an:
    What is the D3D12 equivalent of D3D11 CreateTexture2D?

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 28. Januar 2019 14:34
    Moderator
  • Hallo Dimitar,

    herzlichen Dank für Deine Antwort! Ich habe Deine Vorschläge ausprobiert.

    Bei  resourcedesc.MipLevels hast du recht, da sollte tatsächlich eine 1 statt 0 stehen.

    resourcedesc.Format = DXGI_FORMAT_D32_FLOAT sollte eigentlich richtig sein, da ja die Shadow-Map-Texture das gleiche Format haben muss wie der Depth-Buffer des vorherigen Renderpasses. Ich habe es mit resourcedesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM trotzdem einmal ausprobiert, aber der Fehler bleibt trotzdem bestehen.

    Ein kleiner weiterer Hinweis, der mir jetzt erst aufgefallen ist: Nach dem Aufruf der Methode m_pdevice->CreateShaderResourceView wird die Geräteinstanz der GPU angehalten. Keine Ahnung warum! 

    Viele Grüße!


    Donnerstag, 31. Januar 2019 17:22