Rendering di testo arbitrario in XNA usando l'API di Windows?


9

Nel commento di Andrew sull'altra mia domanda , ha osservato che era possibile eseguire il rendering del testo in un Texture2D utilizzando l'API di Windows, invece di disegnare il testo direttamente con uno SpriteBatch. Come si fa? Immagino che ci sia un passaggio intermedio prima di scrivere i dati dell'immagine su un Texture2D.

Lo sto chiedendo perché ciò mi consentirebbe di rendere al volo i caratteri Unicode, invece di dover eseguire il pre-rendering di tutti i glifi necessari usando uno SpriteFont (troppi glifi in coreano e giapponese per rendere questa strada impossibile, purtroppo). Grazie!

Risposte:


4

Usando alcuni riflessi, puoi prendere il puntatore di superficie Direct3D da un Texture2D. Da lì, puoi utilizzare qualsiasi API in grado di eseguire il rendering su una superficie DX. L'ho fatto di recente per ospitare contenuti XNA con D3DImage di WPF (con supporto del canale alfa). DirectWrite può eseguire il rendering su una superficie DX e potresti persino essere in grado di utilizzare le API gestite . I wrapper DirectX .NET in quel collegamento supportano solo Direct3D 10 e 11 e non Direct3D 9 (che XNA utilizza AFAIK). Tuttavia, potresti essere ancora in grado di farlo funzionare. In una nota a margine, se si desidera eseguire il rendering di grafica vettoriale, potrebbe essere possibile utilizzare un approccio simile per interagire con Direct2D. Naturalmente, nulla di tutto ciò funzionerà su qualsiasi piattaforma supportata da XNA diversa da Windows.


1
Voglio solo sottolineare che puoi anche ottenere la maniglia della finestra per xna e dirgli invece di renderizzare qualcosa come un pannello win32. Quindi puoi usare qualsiasi metodo tu voglia renderizzare in cima al gioco dato che stai semplicemente disegnando il backbuffer su un controllo win32. Questo è molto sporco ma ha funzionato bene per me quando ho unito il pannello di input del Tablet PC con XNA. Il risultato fu quello che sembrava essere una finestra XNA standard ma con un riconoscimento della scrittura invisibile. Ho semplicemente visualizzato i tratti sopra xna. Ovviamente funzioneranno anche testo / etichette / pulsanti. Tuttavia, non ho provato questo con WPF.
zfedoran,

1
Penso che ci sarebbero problemi di "spazio aereo" con il tuo metodo, Arriu. Sei riuscito a visualizzare il contenuto sopra una finestra XNA con il canale alfa intatto? La regola generale è che un pixel può essere "posseduto" solo da un'API grafica, che causa problemi con contenuti trasparenti o traslucidi. Se questo vale anche per il tuo metodo, sarebbe problematico renderizzare il testo su qualcosa di diverso da uno sfondo a tinta unita.
Mike Strobel,

Scusa, potrei essere stato un po 'confuso. Il metodo che ho descritto non fa altro che dire al pannello di disegnare una trama sullo sfondo. Simile a come si può dire a un imagebox quale immagine disegnare. Ma invece che la trama / immagine sia un file è il backbuffer xna. Non stavo disegnando sopra o sopra il pannello / finestra. Quindi non ci sono stati problemi con "spazio aereo".
zfedoran,

Ah, capisco. Quindi il tuo approccio è molto simile a come ho ospitato il contenuto XNA in WPF (usando D3DImage). Invece di una tipica sorgente bitmap, la sorgente dell'immagine è una superficie XNA / Direct3D. Concordo sul fatto che questo sia l'approccio migliore date le opzioni disponibili: non ci sono problemi di spazio aereo e le prestazioni sono piuttosto buone perché non sono necessarie copie / blitting non necessarie.
Mike Strobel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.