D3D11: zeichnen mit GDI Text zu einem GXDI Oberfläche? (Ohne D2D)
Brauche ich etwas Hilfe mit der Zeichnung einen text auf eine textur mit GDI und D3D11. Ich habe versucht, mit D2D/DirectWrite, aber es unterstützt nur D3D10 und nicht D3D11, wie ich brauche. Alles was ich versuchte scheiterte bisher...
Jetzt will ich mit GDI-Methoden zu schreiben, in der textur.
So habe ich eine textur mit diesem params:
Usage = D3D11_USAGE_DEFAULT;
Format = DXGI_FORMAT_B8G8R8A8_UNORM;
BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
CPUAccessFlags = 0;
MiscFlags = D3D11_RESOURCE_MISC_GDI_COMPATIBLE
Dann ich habe ein normales RenderTargetView von dieser Struktur, wie Sie Microsoft ORKB hier: http://msdn.microsoft.com/en-us/library/ff476203%28v=vs.85%29.aspx
Nächsten Schritt: Holen Sie sich Die DXGI-Schnittstelle:
m_pTexFSText->QueryInterface(__uuidof(IDXGISurface1), (void **)(&m_pDXGISurface));
Auf die Render-Funktion habe ich genau dies tun:
m_pDeviceContext->OMSetRenderTargets(1,&m_pTextRenderTarget,NULL);
HDC hDc = NULL;
if(FAILED(m_pDXGISurface->GetDC(TRUE,&hDc)))
return E_FAIL;
COLORREF bla = SetPixel(hDc,1,1,RGB(255,255,255));
bool hmm = TextOutA(hDc, 10, 10, "LALALA!", 7);
if(FAILED(m_pDXGISurface->ReleaseDC(NULL)))
return E_FAIL;
Das problem ist, dass die textur immer noch leer ist, nach, dass GDI-Zeichnung (getestet Auch mit PIX).
Alles funktioniert und es gibt keine Fehlermeldungen.
Ich hoffe, jemand kann erklären, wie es funktioniert.
Dank, Stefan
EDIT: Versucht es auch mit GetDC(FALSE,&hDc)
(entsprechend der Dokumentation): dieselben Ergebnisse -> nichts.
- haben Sie versucht, ein format von
DXGI_FORMAT_R8G8B8A8_UINT
? - laut der Doku auf den link oben, um einen gdi-kompatiblen Texturen braucht man spezielle Formate "müssen Sie das textur-format auf eine der folgenden Arten: DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_TYPELESS, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB"
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich eigentlich bekämpft dieses problem eine Menge während der letzten Woche - aber ich habe Sie alle arbeiten! Hier ist eine Liste der Dinge, die Sie wissen sollten/tun, damit es überhaupt funktioniert:
Wenn du gehst, um es in den back-buffer, denken Sie daran, re-bind-render-target nach, die Sie angerufen haben ReleaseDC. Es ist nicht notwendig manuell Bindung, die RT vor dem Aufruf GetDC da diese Methode übernimmt das für Sie.
Können Sie nicht verwenden, alle Direct3D Zeichnung zwischen GetDC() und ReleaseDC () - Aufrufe, da die Oberfläche excusively gesperrt von DXGI für GDI. Jedoch können Sie mischen GDI und D3D-rendering zur Verfügung gestellt, die Sie aufrufen GetDC()/ReleaseDC() jedes mal, wenn Sie verwenden müssen, GDI, bevor Sie zu D3D.
Dieser Letzte bit kann klingt einfach, aber Sie wären überrascht, wie viele Entwickler lassen sich in dieser Frage -, wenn Sie beim zeichnen mit GDI auf den back-buffer, denken Sie daran, dass dies die zurück Puffer, nicht einen framebuffer, so um tatsächlich sehen, was Sie gezeichnet haben, müssen Sie erneut binden RT to OM und rufen swapChain->Vorhanden() Methode, so dass der backbuffer wird ein framebuffer und sein Inhalt wird auf dem Bildschirm angezeigt.
Vielleicht sind Sie tun alles in Ordnung, es ist nur der text der Zeichnung nicht tut, was Sie erwarten?
Ich verstehe nicht, von diesem wie kann Sie erwarten, dass
TextOutA
zu erraten, dassbla
verwendet werden sollte, da die Farbe des Textes. AFAIK ist die Standard-Textfarbe verwendet in der neu geschaffenen/erhaltenen DC ist schwarz. Nicht sicher über den hintergrund füllen-Modus, aber wenn esTRANSPARENT
standardmäßig - das erklärt voll und ganz, warum nichts zeichnen.Ich würde den code ändern, um die folgenden:
Werde ich es in den back-buffer. Ich bin nicht sicher, ob es richtig gemacht. Ich kann nicht sehen, die Zeichnung. Es zeigt schwarz.
Benutzt habe ich die swap-Kette desc: