¿Representar texto arbitrario en XNA con la API de Windows?

9

En el comentario de Andrew sobre mi otra pregunta , señaló que era posible renderizar texto a un Texture2D usando la API de Windows, en lugar de dibujar el texto directamente con un SpriteBatch. ¿Cómo se hace esto? Supongo que hay un paso intermedio antes de escribir los datos de la imagen en un Texture2D.

Lo pregunto porque esto me permitiría renderizar caracteres Unicode sobre la marcha, en lugar de tener que renderizar previamente todos los glifos necesarios usando un SpriteFont (demasiados glifos en coreano y japonés para que esta ruta sea inviable, lamentablemente). ¡Gracias!

ThatsGobbles
fuente

Respuestas:

4

Usando un poco de reflexión, puede tomar el puntero de superficie Direct3D de un Texture2D. A partir de ahí, puede usar cualquier API que pueda renderizar en una superficie DX. Hice esto recientemente para alojar contenido XNA con D3DImage de WPF (con soporte de canal alfa). DirectWrite puede renderizar a una superficie DX, e incluso puede usar API administradas . Los contenedores DirectX .NET en ese enlace solo admiten Direct3D 10 y 11, y no Direct3D 9 (que XNA usa AFAIK). Sin embargo, aún puede lograr que funcione. En una nota al margen, si desea renderizar gráficos vectoriales, puede usar un enfoque similar para interactuar con Direct2D. Naturalmente, nada de esto funcionará en ninguna plataforma compatible con XNA que no sea Windows.

Mike Strobel
fuente
1
Solo quiero señalar que también puede obtener el identificador de ventana para xna y decirle que se procese en algo así como un panel win32. Luego puede usar cualquier método que desee representar en la parte superior del juego, ya que simplemente está dibujando el backbuffer en un control win32. Esto está muy sucio, pero funcionó bien para mí cuando fusioné el panel de entrada de Tablet PC con XNA. El resultado fue lo que parecía ser una ventana XNA estándar pero con reconocimiento invisible de escritura a mano. Simplemente mostré trazos encima de xna. Por supuesto, el texto / etiquetas / botones también funcionarán. Sin embargo, no he intentado esto con WPF.
zfedoran
1
Creo que habría problemas de "espacio aéreo" con su método, Arriu. ¿Pudiste renderizar contenido encima de una ventana XNA con el canal alfa intacto? La regla general es que un píxel solo puede ser "propiedad" de una API de gráficos, lo que causa problemas con el contenido transparente o translúcido. Si esto también es válido para su método, sería problemático representar el texto sobre cualquier otra cosa que no sea un fondo de color sólido.
Mike Strobel
Lo siento, puede que haya sido un poco confuso. El método que describí no hace más que decirle al panel que dibuje una textura en su fondo. Similar a cómo puedes decirle a un cuadro de imagen qué imagen dibujar. Pero en lugar de que la textura / imagen sea un archivo, es el xna backbuffer. No estaba dibujando encima o sobre el panel / ventana. Así que no hubo problemas con el "espacio aéreo".
zfedoran
Ah, ya veo. Entonces, su enfoque es muy similar a cómo he alojado contenido XNA en WPF (usando D3DImage). En lugar de una fuente típica de mapa de bits, la fuente de la imagen es una superficie XNA / Direct3D. Estoy de acuerdo en que este es el mejor enfoque, dadas las opciones disponibles: no hay problemas de espacio aéreo y el rendimiento es bastante bueno porque no se requiere copia / borrado innecesario.
Mike Strobel