Windows API를 사용하여 XNA에서 임의의 텍스트를 렌더링 하시겠습니까?


9

내 다른 질문에 대한 Andrew의 의견에서 그는 SpriteBatch로 직접 텍스트를 그리는 대신 Windows API를 사용하여 텍스트를 Texture2D로 렌더링 할 수 있다고 언급했습니다. 이것은 어떻게 이루어 집니까? 이미지 데이터를 Texture2D에 쓰기 전에 중간 단계가 있다고 생각합니다.

SpriteFont를 사용하여 필요한 모든 글리프를 미리 렌더링하는 대신 유니 코드 문자를 즉석에서 렌더링 할 수 있기 때문에 묻습니다. 감사!

답변:


4

약간의 반사를 사용하여 Texture2D에서 Direct3D 표면 포인터를 가져올 수 있습니다. 거기에서 DX 표면으로 렌더링 할 수있는 모든 API를 사용할 수 있습니다. 최근 WPF의 D3DImage (알파 채널 지원)로 XNA 컨텐츠를 호스팅하기 위해이 작업을 수행했습니다. DirectWrite는 DX 표면으로 렌더링 할 수 있으며 관리 형 API 를 사용할 수도 있습니다 . 해당 링크의 DirectX .NET 래퍼는 Direct3D 9 (XNA는 AFAIK를 사용)가 아닌 Direct3D 10 및 11 만 지원합니다. 그러나 여전히 작동시킬 수 있습니다. 참고로, 벡터 그래픽을 렌더링하려는 경우 비슷한 방법을 사용하여 Direct2D와 상호 운용 할 수 있습니다. 당연히이 중 어느 것도 Windows 이외의 XNA 지원 플랫폼에서는 작동하지 않습니다.


1
xna의 창 핸들을 가져 와서 대신 win32 패널과 같이 렌더링하도록 지시 할 수 있음을 지적하고 싶습니다. 그런 다음 단순히 백 버퍼를 win32 컨트롤에 그리기 때문에 게임 위에 렌더링하려는 모든 방법을 사용할 수 있습니다. 이것은 매우 더럽지 만 Tablet PC 입력 패널을 XNA와 병합 할 때 잘 작동했습니다. 결과는 표준 XNA 창으로 보이지만 필기 인식이 보이지 않았습니다. 나는 단순히 xna 위에 스트로크를 표시했습니다. 물론 텍스트 / 라벨 / 버튼도 작동합니다. 그러나 WPF로는 이것을 시도하지 않았습니다.
zfedoran

1
나는 당신의 방법에 "공공"문제가있을 것이라고 생각합니다, Arriu. 알파 채널을 그대로 사용하여 XNA 창 위에 내용을 렌더링 할 수 있었습니까? 일반적으로 픽셀은 하나의 그래픽 API에 의해서만 "소유"될 수있어 투명하거나 반투명 한 컨텐츠에 문제가 발생합니다. 이것이 메서드에도 적용된다면 단색 배경 이외의 텍스트 위에 텍스트를 렌더링하는 데 문제가 될 수 있습니다.
Mike Strobel

죄송합니다. 조금 혼란 스러웠을 수도 있습니다. 내가 설명한 방법은 패널에 배경에 텍스처를 그리도록 지시하는 것 이상입니다. 어떤 이미지를 그릴 지 이미지 상자에 알려주는 방법과 비슷합니다. 그러나 텍스처 / 이미지 대신 파일이 xna 백 버퍼입니다. 패널 / 창 위에 또는 위에 그려지지 않았습니다. 따라서 "공역"에는 문제가 없었습니다.
zfedoran

아, 알겠습니다 따라서 귀하의 접근 방식은 WPF에서 DNA를 사용하여 XNA 콘텐츠를 호스팅하는 방법과 매우 유사합니다. 일반적인 비트 맵 소스 대신 이미지 소스는 XNA / Direct3D 표면입니다. 공역에 문제가 없으며 불필요한 복사 / 블리 팅이 필요하지 않기 때문에 성능이 상당히 좋습니다.
Mike Strobel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.