Kết xuất văn bản tùy ý trong XNA bằng API Windows?


9

Trong nhận xét của Andrew về câu hỏi khác của tôi , anh ấy lưu ý rằng có thể kết xuất văn bản thành Texture2D bằng API Windows, thay vì vẽ văn bản trực tiếp bằng SpriteBatch. Làm thế nào được thực hiện? Tôi đoán có một bước trung gian trước khi ghi dữ liệu hình ảnh vào Texture2D.

Tôi đang hỏi bởi vì điều này sẽ cho phép tôi hiển thị các ký tự Unicode một cách nhanh chóng, thay vì cần phải kết xuất trước tất cả các glyph cần thiết bằng SpriteFont (quá nhiều glyphs trong tiếng Hàn và tiếng Nhật để khiến tuyến này không thể thực hiện được, thật đáng buồn). Cảm ơn!

Câu trả lời:


4

Sử dụng một số phản chiếu, bạn có thể lấy con trỏ bề mặt Direct3D từ Texture2D. Từ đó, bạn có thể sử dụng bất kỳ API nào có thể kết xuất lên bề mặt DX. Tôi đã làm điều này gần đây để lưu trữ nội dung XNA với D3DImage của WPF (có hỗ trợ kênh alpha). DirectWrite có thể hiển thị lên bề mặt DX và thậm chí bạn có thể sử dụng các API được quản lý . Các trình bao bọc DirectX .NET trong liên kết đó chỉ hỗ trợ Direct3D 10 và 11, chứ không hỗ trợ Direct3D 9 (XNA sử dụng AFAIK). Tuy nhiên, bạn vẫn có thể làm cho nó hoạt động. Mặt khác, nếu bạn muốn kết xuất đồ họa vector, bạn có thể sử dụng một cách tiếp cận tương tự để tương tác với Direct2D. Đương nhiên, không cái nào trong số này sẽ hoạt động trên bất kỳ nền tảng nào được XNA hỗ trợ ngoài Windows.


1
Tôi chỉ muốn chỉ ra rằng bạn cũng có thể lấy tay cầm cửa sổ cho xna và bảo nó kết xuất thành một cái gì đó giống như bảng win32 thay thế. Sau đó, bạn có thể sử dụng bất kỳ phương thức nào bạn muốn kết xuất trên đầu trò chơi vì bạn chỉ đơn giản là vẽ backbuffer thành điều khiển win32. Điều này rất bẩn nhưng nó hoạt động tốt với tôi khi tôi hợp nhất bảng nhập liệu của Tablet PC với XNA. Kết quả là những gì dường như là một cửa sổ XNA tiêu chuẩn nhưng với nhận dạng chữ viết tay vô hình. Tôi chỉ đơn giản là hiển thị các nét trên đầu xna. Tất nhiên văn bản / nhãn / nút cũng sẽ hoạt động. Tuy nhiên, tôi chưa thử điều này với WPF.
zfedoran

1
Tôi nghĩ sẽ có vấn đề "không phận" với phương pháp của bạn, Arriu. Bạn có thể kết xuất nội dung trên đầu cửa sổ XNA với kênh alpha nguyên vẹn không? Nguyên tắc chung là một pixel chỉ có thể được "sở hữu" bởi một API đồ họa, điều này gây ra vấn đề với nội dung trong suốt hoặc mờ. Nếu điều này cũng đúng với phương pháp của bạn, thì nó sẽ có vấn đề khi hiển thị văn bản trên bất kỳ thứ gì khác ngoài nền màu.
Mike Strobel

Xin lỗi, tôi có thể đã có một chút bối rối. Phương pháp tôi mô tả không có gì khác hơn là bảo bảng điều khiển vẽ một kết cấu trên nền của nó. Tương tự như cách bạn có thể nói với một hộp hình ảnh những hình ảnh cần vẽ. Nhưng thay vì kết cấu / hình ảnh là một tập tin, nó là backbuffer xna. Tôi đã không vẽ ontop của hoặc trên bảng điều khiển / cửa sổ. Vì vậy, không có vấn đề với "không phận".
zfedoran

Ah tôi thấy. Vì vậy, cách tiếp cận của bạn rất giống với cách tôi đã lưu trữ nội dung XNA trong WPF (sử dụng D3DImage). Thay vì nguồn bitmap thông thường, nguồn hình ảnh là bề mặt XNA / Direct3D. Tôi đồng ý rằng đây là cách tiếp cận tốt nhất được cung cấp các tùy chọn có sẵn - không có vấn đề về không phận và hiệu suất khá tốt vì không cần sao chép / xóa không cần thiết.
Mike Strobel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.