Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

04.10.2016, 17:03

D3D11 Multi-Sampled Render Target (GELÖST)

Hallo zusammen, ich könnte mal wieder eure Hilfe gebrauchen.

Ich arbeite gerade zum ersten Mal mit multi-sampled render targets in D3D11 und das Ergebnis sieht nicht so ganz richtig aus :rolleyes:
Anbei die Bilder: 1. zeigt das render target mit meinem OpenGL renderer (8x Multi-sampling) und das 2. zeigt das render target mit meinem Direct3D 11 renderer (auch 8x Multi-sampling).
Beide render targets haben zu Testzwecken eine Auflösung von 64x64 Texel.

Depth-Stencil, Depth-Stencil-View (DSV), Render-Target und das Render-Target-View (RTV) werden wie folgt erstellt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/* Create depth-stencil texture */
D3D11_TEXTURE2D_DESC dsDesc;
{
    dsDesc.Width              = 64;
    dsDesc.Height             = 64;
    dsDesc.MipLevels          = 1;
    dsDesc.ArraySize          = 1;
    dsDesc.Format             = DXGI_FORMAT_D24_UNORM_S8_UINT;
    dsDesc.SampleDesc.Count   = 8;
    dsDesc.SampleDesc.Quality = 0;
    dsDesc.Usage              = D3D11_USAGE_DEFAULT;
    dsDesc.BindFlags          = D3D11_BIND_DEPTH_STENCIL;
    dsDesc.CPUAccessFlags     = 0;
    dsDesc.MiscFlags          = 0;
}
ComPtr<ID3D11Texture2D> depthStencil;
auto hr = device_->CreateTexture2D(&dsDesc, nullptr, &depthStencil);
DXThrowIfFailed(hr, "failed to create texture 2D for D3D11 depth-stencil");

/* Create depth-stencil view */
ComPtr<ID3D11DepthStencilView> dsv;
hr = device_->CreateDepthStencilView(depthStencil.Get(), nullptr, &dsv);
DXThrowIfFailed(hr, "failed to create depth-stencil-view (DSV) for D3D11 depth-stencil");

/* Create render target texture */
D3D11_TEXTURE2D_DESC tex2DDesc;
{
    tex2DDesc.Width              = 64;
    tex2DDesc.Height             = 64;
    tex2DDesc.MipLevels          = 1;
    tex2DDesc.ArraySize          = 1;
    tex2DDesc.Format             = DXGI_FORMAT_R8G8B8A8_UNORM;
    tex2DDesc.SampleDesc.Count   = 8;
    tex2DDesc.SampleDesc.Quality = 0;
    tex2DDesc.Usage              = D3D11_USAGE_DEFAULT;
    tex2DDesc.BindFlags          = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
    tex2DDesc.CPUAccessFlags     = 0;
    tex2DDesc.MiscFlags          = 0;
}
ComPtr<ID3D11Texture2D> tex2D;
auto hr = device->CreateTexture2D(&tex2DDesc, nullptr, &tex2D);
DXThrowIfFailed(hr, "failed to create D3D11 2D-texture");

/* Create render-target view */
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
{
    rtvDesc.format        = DXGI_FORMAT_R8G8B8A8_UNORM;
    rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMS;
}
ComPtr<ID3D11RenderTargetView> rtv;
auto hr = renderSystem_.GetDevice()->CreateRenderTargetView(tex2D.Get(), &rtvDesc, &rtv);
DXThrowIfFailed(hr, "failed to create D3D11 render-target-view (RTV)");

Der obige Code ist natürlich für diesen Thread etwas zusammengefasst.
Für eine Texture (tex2D) wird z.B. immer noch ein Shader-Resource-View (SRV) erstellt, aber das sollte ja nicht stören.
Alle D3D Strukturen werden außerdem mit einer eigenen 'ZeroMemory' Funktion initialisiert.

Kann mir jemand sagen, ob ich bei dem ganzen Setup etwas vergessen oder nicht beachtet habe?
Normalerweise bekommt man bei falschen Eingaben ja immer ein E_FAIL als Resultat der D3D Funktionen, daher sollte der Teil doch eigentlich stimmen.

In OpenGL 'blitte' ich ein multi-sampled framebuffer immer in einen standard framebuffer.
Ich denke so etwas in der Art fehlt hier noch in meiner D3D Variante.

Danke im Voraus und Gruß,
Lukas

EDIT:
Habe noch einen Screenshot von RenderDoc hinzugefügt.
Im Render-target selbst sind diese 'Schlieren' nicht vorhanden, aber nach multi-sampling sehen mir die Kanten auch nicht aus.

EDIT:
Hab das Problem gelöst. Die Texture musste (genau wie bei OpenGL auch) geblittet werden.
In diesem Fall heißt die Funktion ID3D11DeviceContext::ResolveSubresource
»LukasBanana« hat folgende Bilder angehängt:
  • 01_RenderTarget_GL.png
  • 02_RenderTarget_D3D11.png
  • 03_RenderTarget_RenderDoc.png

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »LukasBanana« (04.10.2016, 19:36)