2012-09-03 3 views
4

J'essaie de comprendre comment dessiner du texte à l'écran dans SlimDX.Rendu de texte avec DX11

La recherche initiale n'est pas encourageante. Le seul exemple concret que j'ai trouvé ceci:

http://www.aaronblog.us/?p=36

Je suis en train de le port à mon code, mais il est la preuve extrêmement difficile, et je commence à me demander après 4 heures si cela est la bonne façon aller. Essentiellement, il semble assez difficile de faire quelque chose d'aussi simple que d'écrire du texte à l'écran. La méthode d'Aaron semble la seule qui soit pratique en ce moment. Il n'y a pas d'autres points de comparaison.

Quelqu'un d'autre a-t-il des conseils à offrir?

P.S. Je soupçonne que j'aurais pu créer des images individuelles pour des lettres maintenant, et j'ai codé une routine pour convertir une chaîne en une série de sprites. Cela semble un peu fou de le faire cependant.

Répondre

4

Rendu de texte est un peu complexe, en effet. La seule façon de rendre le texte général est d'utiliser Direct2D/DirectWrite. Et ceci est seulement supporté dans DirectX10. Vous devez donc créer un périphérique DirectX 10, DirectWrite et Direct2D Factories. Vous pouvez ensuite créer une texture partagée pouvant être utilisée par les périphériques DirectX 10 et 11.

Cette texture contiendra le texte après le rendu. Aaron utilise cette texture pour la fondre en plein écran. Par conséquent, vous pouvez utiliser DirectWrite pour dessiner des chaînes complètes. Essentiellement, c'est comme dessiner un quad texturé. Une autre façon de procéder est, comme vous l'avez déjà mentionné, de dessiner une feuille de sprites et de scinder des chaînes en plusieurs sprites. Je suppose que la dernière méthode est un peu plus rapide, mais je ne l'ai pas encore testé. J'ai utilisé cette méthode dans mon Sprite & Text engine. Voir les méthodes AssertDevice et CreateCharTable

+0

Merci Nico! On dirait que vous êtes en avance sur celui-ci. Je mettrai à jour ma classe d'image-objet personnalisée une fois que j'ai porté la fonctionnalité d'Aaron dans mon framework. 8D – CdrTomalak

3

Il y a une enveloppe de DirectWrite belle appelé http://fw1.codeplex.com/

Il est en C++, mais il est très simple de faire un emballage en mode mixte pour (ce qui est ce que je l'ai fait pour mes projets C#).

Voici exemple simple:

fichier .H

#pragma once 
#include "Lib/FW1FontWrapper.h" 
using namespace System::Runtime::InteropServices; 

public ref class DX11FontWrapper 
{ 
public: 
    DX11FontWrapper(SlimDX::Direct3D11::Device^ device); 
    void Draw(System::String^ str,float size,int x,int y,int color); 
private: 
    SlimDX::Direct3D11::Device^ device; 
    IFW1FontWrapper* pFontWrapper; 
}; 

fichier .cpp

#include "StdAfx.h" 
#include "DX11FontWrapper.h" 

DX11FontWrapper::DX11FontWrapper(SlimDX::Direct3D11::Device^ device) 
{ 
    this->device = device; 

    IFW1Factory *pFW1Factory; 
    FW1CreateFactory(FW1_VERSION, &pFW1Factory); 
    ID3D11Device* dev = (ID3D11Device*)device->ComPointer.ToPointer(); 

    IFW1FontWrapper* pw; 

    pFW1Factory->CreateFontWrapper(dev, L"Arial", &pw); 
    pFW1Factory->Release(); 

    this->pFontWrapper = pw; 
} 

void DX11FontWrapper::Draw(System::String^ str,float size,int x,int y, int color) 
{ 
    ID3D11DeviceContext* pImmediateContext = 
     (ID3D11DeviceContext*)this->device->ImmediateContext->ComPointer.ToPointer(); 

    void* txt = (void*)Marshal::StringToHGlobalUni(str); 
    pFontWrapper->DrawString(pImmediateContext, (WCHAR*)txt, size, x, y, color, 0); 
    Marshal::FreeHGlobal(System::IntPtr(txt)); 
} 
+0

Génial! Je vous remercie! – MHGameWork