Renderizando texto arbitrário no XNA usando a API do Windows?

9

No comentário de Andrew sobre minha outra pergunta , ele observou que era possível renderizar texto para um Texture2D usando a API do Windows, em vez de desenhar o texto diretamente com um SpriteBatch. Como isso é feito? Suponho que haja uma etapa intermediária antes de gravar os dados da imagem em um Texture2D.

Estou perguntando porque isso me permitiria renderizar caracteres Unicode on-the-fly, em vez de precisar pré-renderizar todos os glifos necessários usando um SpriteFont (muitos glifos em coreano e japonês para tornar essa rota inviável, infelizmente). Obrigado!

ThatsGobbles
fonte

Respostas:

4

Usando alguma reflexão, você pode pegar o ponteiro de superfície do Direct3D a partir de um Texture2D. A partir daí, você pode usar qualquer API que possa renderizar em uma superfície DX. Fiz isso recentemente para hospedar conteúdo XNA com o D3DImage do WPF (com suporte ao canal alfa). O DirectWrite pode renderizar em uma superfície DX e você pode até usar APIs gerenciadas . Os wrappers do DirectX .NET nesse link oferecem suporte apenas ao Direct3D 10 e 11, e não ao Direct3D 9 (que o XNA usa o AFAIK). No entanto, você ainda poderá fazê-lo funcionar. Em uma nota lateral, se você quiser renderizar gráficos vetoriais, poderá usar uma abordagem semelhante para interoperar com o Direct2D. Naturalmente, nada disso funcionará em qualquer plataforma suportada por XNA que não seja o Windows.

Mike Strobel
fonte
11
Eu só quero ressaltar que você também pode obter o identificador da janela para o xna e dizer para renderizar para algo como um painel win32. Em seguida, você pode usar qualquer método que queira renderizar no topo do jogo, pois está simplesmente desenhando o backbuffer em um controle win32. Isso está muito sujo, mas funcionou bem para mim quando mesclei o painel de entrada do Tablet PC com o XNA. O resultado foi o que parecia ser uma janela XNA padrão, mas com reconhecimento de escrita invisível. Simplesmente exibi traços em cima do xna. Obviamente, texto / etiquetas / botões também funcionarão. No entanto, eu não tentei isso com o WPF.
Zfedoran 01/10/10
11
Eu acho que haveria problemas de "espaço aéreo" com seu método, Arriu. Você conseguiu renderizar o conteúdo em cima de uma janela XNA com o canal alfa intacto? A regra geral é que um pixel só pode ser "pertencente" a uma API gráfica, o que causa problemas com conteúdo transparente ou translúcido. Se isso também se aplica ao seu método, seria problemático renderizar texto sobre algo além de um plano de fundo de cor sólida.
Mike Strobel
Desculpe, eu posso ter sido um pouco confuso. O método que descrevi nada mais é do que dizer ao painel para desenhar uma textura em segundo plano. Semelhante a como você pode dizer a uma caixa de imagens qual imagem desenhar. Mas, em vez de a textura / imagem ser um arquivo, é o xna backbuffer. Eu não estava desenhando em cima ou sobre o painel / janela. Portanto, não houve problemas com o "espaço aéreo".
Zfedoran 18/10/10
Ah entendo. Portanto, sua abordagem é muito semelhante à maneira como eu hospedei o conteúdo XNA no WPF (usando D3DImage). Em vez de uma fonte de bitmap típica, a fonte da imagem é uma superfície XNA / Direct3D. Concordo que esta é a melhor abordagem, dadas as opções disponíveis - não há problemas de espaço aéreo e o desempenho é muito bom porque não é necessária cópia / distorção desnecessária.
quer