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
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