4

SlimDXで画面にテキストを描画する方法を理解しようとしています。

初期の研究は勇気づけられません。私が見つけた唯一の具体的な例はこれでした:

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

私はこれを自分のコードに移植しようとしていますが、それは非常に困難であることが証明されており、4時間後にこれが正しい方法であるかどうか疑問に思い始めています。

基本的に、画面にテキストを書き込むような単純なことを行うのは非常に難しいようです。アーロンの方法は、現時点で実用的な唯一の方法のようです。他に比較のポイントはありません。

他に何かアドバイスはありますか?

PSこれまでに文字の個別の画像を作成し、文字列を一連のスプライトに変換するルーチンをコーディングできたのではないかと思います。しかし、これを行うのは少し狂気のようです。

4

2 に答える 2

4

確かに、テキストのレンダリングは少し複雑です。一般的なテキストをレンダリングする唯一の方法は、Direct2D/DirectWriteを使用することです。また、これはDirectX10でのみサポートされています。したがって、DirectX 10デバイス、DirectWriteおよびDirect2Dファクトリを作成する必要があります。次に、DirectX10デバイスと11デバイスの両方で使用できる共有テクスチャを作成できます。

このテクスチャには、レンダリング後のテキストが含まれます。アーロンはこのテクスチャを使用して、フルスクリーンとブレンドします。したがって、DirectWriteを使用して完全な文字列を描画できます。基本的に、これはテクスチャクワッドを描画するのと同じです。

これを行う別の方法は、すでに述べたように、スプライトシートを描画し、文字列をいくつかのスプライトに分割することです。後者の方が少し速いと思いますが、まだテストしていません。Sprite&Textエンジンでこのメソッドを使用しました。メソッドAssertDeviceを参照してくださいCreateCharTable

于 2012-09-04T09:03:14.280 に答える
3

http://fw1.codeplex.com/と呼ばれる素晴らしいDirectWriteラッパーがあります

これはc++ですが、混合モードラッパーを作成するのは非常に簡単です(これは私のc#プロジェクトで行ったことです)。

簡単な例を次に示します。

.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;
};

.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));
}
于 2012-09-06T09:38:35.473 に答える