Merender teks sewenang-wenang dalam XNA menggunakan Windows API?

9

Dalam komentar Andrew pada pertanyaan saya yang lain , ia mencatat bahwa adalah mungkin untuk membuat teks ke Texture2D menggunakan Windows API, alih-alih menggambar teks secara langsung dengan SpriteBatch. Bagaimana ini dilakukan? Saya menduga ada langkah menengah sebelum menulis data gambar ke Texture2D.

Saya bertanya karena ini akan memungkinkan saya untuk membuat karakter Unicode on-the-fly, alih-alih perlu pra-render semua mesin terbang yang diperlukan menggunakan SpriteFont (terlalu banyak mesin terbang di Korea dan Jepang untuk membuat rute ini tidak layak, dengan sedih). Terima kasih!

ThatsGobbles
sumber

Jawaban:

4

Menggunakan beberapa refleksi, Anda bisa mengambil pointer permukaan Direct3D dari Texture2D. Dari sana, Anda dapat menggunakan API apa pun yang dapat merender ke permukaan DX. Saya melakukan ini baru-baru ini untuk meng-host konten XNA dengan D3DImage WPF (dengan dukungan saluran alpha). DirectWrite dapat merender ke permukaan DX, dan Anda bahkan mungkin dapat menggunakan API yang dikelola . Pembungkus DirectX .NET di tautan itu hanya mendukung Direct3D 10 dan 11, dan bukan Direct3D 9 (yang XNA menggunakan AFAIK). Namun, Anda mungkin masih bisa membuatnya bekerja. Sebagai catatan, jika Anda ingin membuat grafik vektor, Anda mungkin dapat menggunakan pendekatan yang sama untuk beroperasi dengan Direct2D. Secara alami, semua ini tidak akan bekerja pada platform apa pun yang didukung XNA selain Windows.

Mike Strobel
sumber
1
Saya hanya ingin menunjukkan bahwa Anda juga bisa mendapatkan pegangan jendela untuk xna dan menyuruhnya membuat sesuatu seperti panel win32. Kemudian Anda dapat menggunakan metode apa pun yang ingin Anda render di atas permainan karena Anda hanya menggambar backbuffer ke kontrol win32. Ini sangat kotor tetapi bekerja dengan baik ketika saya menggabungkan panel input Tablet PC dengan XNA. Hasilnya adalah apa yang tampak sebagai jendela XNA standar tetapi dengan pengenalan tulisan tangan yang tidak terlihat. Saya hanya menampilkan sapuan di atas xna. Tentu saja teks / label / tombol akan berfungsi juga. Namun, saya belum mencoba ini dengan WPF.
zfedoran
1
Saya akan berpikir akan ada masalah "wilayah udara" dengan metode Anda, Arriu. Apakah Anda dapat membuat konten di atas jendela XNA dengan saluran alpha tetap utuh? Aturan umum adalah bahwa piksel hanya dapat "dimiliki" oleh satu grafik API, yang menyebabkan masalah dengan konten yang transparan atau tembus cahaya. Jika ini berlaku untuk metode Anda juga, maka akan bermasalah untuk rendering teks di atas apa pun selain latar belakang warna solid.
Mike Strobel
Maaf, saya mungkin agak membingungkan. Metode yang saya jelaskan tidak lebih dari memberitahu panel untuk menggambar tekstur pada latar belakangnya. Mirip dengan bagaimana Anda dapat memberitahu imagebox gambar apa yang harus digambar. Tapi alih-alih tekstur / gambar menjadi file itu adalah xna backbuffer. Saya tidak menggambar di atas atau di atas panel / jendela. Jadi tidak ada masalah dengan "wilayah udara".
zfedoran
Ah, begitu. Jadi pendekatan Anda sangat mirip dengan bagaimana saya meng-host konten XNA di WPF (menggunakan D3DImage). Alih-alih sumber bitmap yang khas, sumber gambar adalah permukaan XNA / Direct3D. Saya setuju bahwa ini adalah pendekatan terbaik mengingat pilihan yang tersedia - tidak ada masalah wilayah udara, dan kinerjanya cukup baik karena tidak perlu menyalin / menggertak diperlukan.
Mike Strobel