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

n2k

Frischling

  • »n2k« ist der Autor dieses Themas
  • Private Nachricht senden

1

08.10.2014, 21:52

[DirectX11] Direct2D/Direct3D Interop: 2D-RenderTarget malt nicht

Hallo zusammen,

ich bastel gerade ein Projekt, welches Direct2D und Direct3D unterstützen soll.

Zuvor war der Plan, dass ich ein reines 2D-Projekt machen wollte. Was auch jetzt noch der Plan ist. Jedoch möchte ich die DirectXTK SpriteBatch-Klasse verwenden, welche aber ein Direct3D-DeviceContext benötigt.

Ich habe nun einige Artikel zum Thema 2D/3D Interop gelesen und mir ein Projekt dazu erstellt.

Darin erzeuge ich:

- D3D-Device + SwapChain
- 3D Render target view
- stencil 2d texture
- depth stencil view
- viewport
- sowie ein 2D render taget für die 2D-Malereien (mittles CreateDxgiSurfaceRenderTarget)

Das Initialisieren der Ressourcen funktioniert soweit auch (zumindest bekomme ich überall S_OK).

Nun möchte ich eine 2D-Textur über die SpriteBatch-Klasse und ein paar Linien (DrawLines) über das 2D Render target malen.

Die SpriteBatch-Textur wird gemalt. Die Linien jedoch nicht.

Hat einer eine Idee, woran das liegen kann?

Hier mein Init-Source:

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
void DeviceResources::InitDeviceDependentResources()
{
  HRESULT hr = S_OK;

  UINT createDeviceFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;

#ifdef _DEBUG
  createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif

  D3D_DRIVER_TYPE driverTypes[] =
  {
    D3D_DRIVER_TYPE_HARDWARE,
    D3D_DRIVER_TYPE_WARP,
    D3D_DRIVER_TYPE_REFERENCE,
  };

  UINT numDriverTypes = ARRAYSIZE(driverTypes);

  D3D_FEATURE_LEVEL featureLevels[] =
  {
    D3D_FEATURE_LEVEL_11_1,
    D3D_FEATURE_LEVEL_11_0,
    D3D_FEATURE_LEVEL_10_1,
    D3D_FEATURE_LEVEL_10_0,
    D3D_FEATURE_LEVEL_9_3,
    D3D_FEATURE_LEVEL_9_2,
    D3D_FEATURE_LEVEL_9_1
  };

  UINT numFeatureLevels = ARRAYSIZE(featureLevels);

  DXGI_SWAP_CHAIN_DESC swapChainDesc;
  ZeroMemory(&swapChainDesc, sizeof(swapChainDesc));
  swapChainDesc.BufferCount = 1;
  swapChainDesc.BufferDesc.Width = m_winSize.width;
  swapChainDesc.BufferDesc.Height = m_winSize.height;
  swapChainDesc.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; //DXGI_FORMAT_B8G8R8A8_UNORM; // supported by Direct2D //DXGI_FORMAT_R8G8B8A8_UNORM;
  swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
  swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
  swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
  swapChainDesc.OutputWindow = m_hWnd;
  swapChainDesc.SampleDesc.Count = 1;
  swapChainDesc.SampleDesc.Quality = 0;
  swapChainDesc.Windowed = TRUE;

  for (UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++)
  {
    m_d3dDriverType = driverTypes[driverTypeIndex];

    hr = D3D11CreateDeviceAndSwapChain(
      nullptr, 
      m_d3dDriverType,
      nullptr, 
      createDeviceFlags, 
      featureLevels, 
      numFeatureLevels,
      D3D11_SDK_VERSION, 
      &swapChainDesc,
      m_dxgiSwapChain.GetAddressOf(),
      m_d3dDevice.GetAddressOf(),
      &m_d3dFeatureLevel,
      m_d3dContext.GetAddressOf()
      );
    
    if (SUCCEEDED(hr))
      break;
  }

  // Create a render target view
  ID3D11Texture2D* pBackBuffer = nullptr;
  hr = m_dxgiSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);

  hr = m_d3dDevice->CreateRenderTargetView(pBackBuffer, nullptr, &m_d3dRenderTargetView);
  pBackBuffer->Release();

  // Create depth stencil texture
  D3D11_TEXTURE2D_DESC depthDesc;
  ZeroMemory(&depthDesc, sizeof(depthDesc));
  depthDesc.Width = m_winSize.width;
  depthDesc.Height = m_winSize.height;
  depthDesc.MipLevels = 1;
  depthDesc.ArraySize = 1;
  depthDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
  depthDesc.SampleDesc.Count = 1;
  depthDesc.SampleDesc.Quality = 0;
  depthDesc.Usage = D3D11_USAGE_DEFAULT;
  depthDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
  depthDesc.CPUAccessFlags = 0;
  depthDesc.MiscFlags = 0;

  hr = m_d3dDevice->CreateTexture2D(&depthDesc, nullptr, m_d3dDepthStencil.GetAddressOf());

  // Create the depth stencil view
  D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc;
  ZeroMemory(&depthStencilViewDesc, sizeof(depthStencilViewDesc));
  depthStencilViewDesc.Format = depthDesc.Format;
  depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
  depthStencilViewDesc.Texture2D.MipSlice = 0;
  hr = m_d3dDevice->CreateDepthStencilView(m_d3dDepthStencil.Get(), &depthStencilViewDesc, &m_d3dDepthStencilView);

  m_d3dContext->OMSetRenderTargets(1, m_d3dRenderTargetView.GetAddressOf(), m_d3dDepthStencilView.Get());

  // Setup the viewport
  D3D11_VIEWPORT vp;
  vp.Width  = (FLOAT)m_winSize.width;
  vp.Height = (FLOAT)m_winSize.height;
  vp.MinDepth = 0.0f;
  vp.MaxDepth = 1.0f;
  vp.TopLeftX = 0;
  vp.TopLeftY = 0;
  m_d3dContext->RSSetViewports(1, &vp);


#pragma region d2dRenderTarget

  // Create the DXGI Surface Render Target.
  FLOAT dpiX;
  FLOAT dpiY;
  m_d2dFactory1->GetDesktopDpi(&dpiX, &dpiY);

  D2D1_RENDER_TARGET_PROPERTIES props =
    D2D1::RenderTargetProperties(
    D2D1_RENDER_TARGET_TYPE_DEFAULT,
    D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED),
    dpiX,
    dpiY
    );

  IDXGISurface* surface;
  m_dxgiSwapChain->GetBuffer(0, __uuidof(IDXGISurface), (void**)&surface);

  hr = m_d2dFactory1->CreateDxgiSurfaceRenderTarget(
    surface,
    &props,
    &m_d2dRenderTarget
    );

  surface->Release();

#pragma endregion // d2dRenderTarget

}


Und hier mein Render-Source:

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
void Render(float elapsedTime)
{
  g_devResources->GetD2dRenderTarget()->CreateSolidColorBrush(
    D2D1::ColorF(D2D1::ColorF::Blue),
    &g_SolidBrush
    );
  
  g_devResources->GetD2dRenderTarget()->BeginDraw();
  {
    for (int x = 0; x < 640; x += 10)
    {
      // funktioniert nicht (wird nicht angezeigt)
      g_devResources->GetD2dRenderTarget()->DrawLine(
        D2D1::Point2F(static_cast<FLOAT>(x), 0.0f),
        D2D1::Point2F(static_cast<FLOAT>(x), 480),
        g_SolidBrush.Get(),
        0.3f
        );
    }
  }
  g_devResources->GetD2dRenderTarget()->BeginDraw();

  // Draw sprite
  g_SpriteBatch->Begin(SpriteSortMode_Deferred);
  {
    // funktioniert
    g_SpriteBatch->Draw(g_texture, XMFLOAT2(10, 75), nullptr, Colors::White);
  }
  g_SpriteBatch->End();

  HRESULT hr = g_devResources->GetSwapChain()->Present(1, 0);
  
}



Danke im Voraus.

Gruß
n2k

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

08.10.2014, 21:56

Soll in Zeile 21 wirklich "BeginDraw()" stehen?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

n2k

Frischling

  • »n2k« ist der Autor dieses Themas
  • Private Nachricht senden

3

08.10.2014, 22:06

Hallo BlueCobold,

ermmmm... Nee. Soll natürlich EndDraw() heißen :D

Ich sah den Wald vor lauter Bäumen nicht mehr.

Jetzt funktioniert alles! Danke!

Endlich. Nach einer Woche fummeln habe ich endlich mein Grundgerüst stehen, womit ich 2D+3D zeichnen kann. Ich freu mir :)

Endlich ein Erfolgserlebnis in diesem Dschungel. Und dann stand mir ein triviales, zweites BeginDraw im Wege :)

Gruß
n2k

Werbeanzeige