[D3D11/D2D 1.1] Font rendern [gelöst]

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Andi
Beiträge: 81
Registriert: 12.03.2009, 00:19

[D3D11/D2D 1.1] Font rendern [gelöst]

Beitrag von Andi »

Hallöchen

Da ich wieder Zeit und Muse gefunden habe an meinem Projekt weiter zu arbeiten, habe ich, um Text auf den Bildschirm zu bekommen, D2D 1.1 in meinem D3D11 Projekt eingebunden. Auf Windows 8/8.1/10 klappt auch alles, auf Windows 7 (mit KB2670838) sehe ich den Text nicht und bekomme auch keine Fehlermeldung zurück. Muss ich für Win7 irgend was spezielles beachten oder kann das ein Treiber Problem sein?

Die Initialisierung sieht im wesentlich so aus:

Code: Alles auswählen

if (FAILED(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, options, &factory)))
	MessageBox(0, "[D2D1] Create Factory", "Error", MB_OK | MB_ICONERROR);

if (FAILED(swapchain->GetBuffer(0, IID_PPV_ARGS(&back_buffer)))) 
	MessageBox(0, "[D2D1] Get Back Buffer", "Error", MB_OK | MB_ICONERROR);


if (FAILED(factory->CreateDxgiSurfaceRenderTarget(back_buffer,
	D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_DEFAULT, D2D1::PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED)
	), &render_target))) 
	MessageBox(0, "[D2D1] Create Render Target", "Error", MB_OK | MB_ICONERROR);
und den Text rendern:

Code: Alles auswählen

render_target->BeginDraw();
render_target->DrawText(.....);
render_target->EndDraw();
Falls jemand eine Idee hat an was es liegt könnte, immer raus damit.
Zuletzt geändert von Andi am 03.03.2016, 18:28, insgesamt 1-mal geändert.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [D3D11/D2D 1.1] Font rendern

Beitrag von Krishty »

Keine Idee, bloß stochern im Trüben:
  • Erzwingst du Flushing via device11->ClearState(), device11->Flush(); bevor und nachdem D2D arbeitet? Sollte man bei jeder Art von DXGI-Interoperabilität machen.
  • Nutzt du irgendwo BGR-Formate? BGR wurde mit 11.1 und Windows 8 gepusht, ist aber unter Windows 7 bloß eingeschränkt unterstützt … testweise zu RGB ändern.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Andi
Beiträge: 81
Registriert: 12.03.2009, 00:19

Re: [D3D11/D2D 1.1] Font rendern

Beitrag von Andi »

Hmm, ne mach ich nicht. Wird ich gleich setten.

Ja um Interoperabilität zu haben muss ich device11 mit D3D11_CREATE_DEVICE_BGRA_SUPPORT erstellen.

Edit:
Mir fällt noch auf, kann es Probleme machen wen ich Hardware bedingt im Feater Level 10 bin?
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [D3D11/D2D 1.1] Font rendern

Beitrag von Krishty »

Ich muss zugeben, dass ich nichts davon wiedererkenne. Als ich das vor zwei oder drei Jahren angefangen (aber nie fertiggemacht habe), musste man in den vftables von Direct3D herumschreiben, sofern man nicht exakt eine spezielle D3D-Version nutzte. Das hier ist total anders :(

Ich würde vor dem BeginDraw() sowohl ClearState() als auch Flush() platzieren.

Nachtrag: Hier ist, wie ich es damals gemacht habe. Also sowohl ein 10er-Device erzeugen als auch ein 11er; Keyed Mutex zur Synchronisierung. Man konnte das 10er-Device sparen indem man D2D ein 11er übergeben hat, dessen vftable den eines 10ers vorgetäuscht hat.

Ist das ungefähr dein Ablauf oder haben sie es seitdem vereinfacht?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Andi
Beiträge: 81
Registriert: 12.03.2009, 00:19

Re: [D3D11/D2D 1.1] Font rendern

Beitrag von Andi »

Ich bin erst seit vor paar Stunden dran, also Aussagen ohne Gewehr :D

Seit dem Windows 8 SDK für VS2013 braucht man den Umweg nicht mehr mit D2D 1.1. Über die/das Swap Chain holt man sich den Backbuffer und erstellt sich davon ein D2D Render Target, dann kann es schon los gehen mit dem Zeichnen. Zumindest ab Windows 8 geht das so ohne Probleme oder Umwege und ist in paar Minuten implementiert. Für Windows 7, so hab ich es aus der MSDN, soll dies mit dem Update auch ohne Umwege klappen. Für VS2010 muss man noch diverse Sachen mache, da ich den nicht nutze, hab ich nicht weiter gelesen.

So nun geht's zum Test. Und muss gucken das ich das auf ne D3D11 kompatible Hardware Testen kann.

Sorry das ich oben nochmals editiert haben, bezüglich wo ich ClearState und Flush platzieren soll.
Benutzeravatar
Andi
Beiträge: 81
Registriert: 12.03.2009, 00:19

Re: [D3D11/D2D 1.1] Font rendern

Beitrag von Andi »

Leider Bringt das Setzen von ClearState und Flush auch nichts, hab es jetzt auch auf Win7 mit DX11 Hardware getestet bekommen mit gleichen enttäuschendem Ergebnis. Irgend wo muss ich was banales vergessen haben, ab in die Suchmaschine :P

Jedenfalls Danke fürs stochern :D
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [D3D11/D2D 1.1] Font rendern

Beitrag von Krishty »

Kein Debug Output vorhanden? Eigentlich ist der seit 10 zur Stelle, wenn man ihn braucht.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Andi
Beiträge: 81
Registriert: 12.03.2009, 00:19

Re: [D3D11/D2D 1.1] Font rendern

Beitrag von Andi »

Entwickle auf Win10, müsste ich mir alles auf den Win7 Rechner rüber ziehen. Peinlicherweise schaff ich es aber nicht das Device mit D3D11_CREATE_DEVICE_DEBUG zu erstellen da er mir den SDK Layer nicht installieren will.

Versuchen könnt ich noch folgendes
- Stencil rausnehmen (da bin ich mir nicht ganz sicher ob ich das richtig anstelle mit Stencil)
- Text in eine Textur rendern
Benutzeravatar
Andi
Beiträge: 81
Registriert: 12.03.2009, 00:19

Re: [D3D11/D2D 1.1] Font rendern

Beitrag von Andi »

Debuger sagt leider auch nichts dazu. Ich belasse es erst mal bei und nehme in kauf das auf Windows 7 kein Text gerendert wird. Auf meinem Produktiv System läuft es und will jetzt erst mal Produktiv sein :D Ich bedank mich nochmals für die Hilfestellung.

Sollte ich was neues raus finden verewige ich es hier.

Edit:
Hab mir aus Langeweile die Doku gelesen, und fand dann schnell den Übeltäter. Ziemlich peinlich, es lag an der Option D2D1_DRAW_TEXT_OPTIONS _ENABLE_COLOR_FONT die erst ab Windows 8.1 zur Verfügung steht. Schade das mir der Debugger das nicht mitteilen wollte, aber nun klappt es immer hin :D
Antworten