8

GDI と D3D11 を使用してテキストをテクスチャに描画する際に助けが必要です。D2D/DirectWrite を使用してみましたが、必要に応じて D3D11 ではなく D3D10 のみをサポートしています。これまで試したことはすべて失敗しました... GDI メソッドを使用してテクスチャに書き込みたいと思います。だから私はこのパラメータでテクスチャを作成しました:

Usage = D3D11_USAGE_DEFAULT;
Format = DXGI_FORMAT_B8G8R8A8_UNORM;
BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
CPUAccessFlags = 0;
MiscFlags = D3D11_RESOURCE_MISC_GDI_COMPATIBLE

次に、マイクロソフトがここで言うように、このテクスチャから通常の RenderTargetView を作成しました

次のステップ: DXGI インターフェイスを取得します。

m_pTexFSText->QueryInterface(__uuidof(IDXGISurface1), (void **)(&m_pDXGISurface));

Render 関数では、次のようにします。

m_pDeviceContext->OMSetRenderTargets(1,&m_pTextRenderTarget,NULL);

HDC hDc = NULL;
if(FAILED(m_pDXGISurface->GetDC(TRUE,&hDc)))
    return E_FAIL;

COLORREF bla = SetPixel(hDc,1,1,RGB(255,255,255));
bool hmm = TextOutA(hDc, 10, 10, "LALALA!", 7);

if(FAILED(m_pDXGISurface->ReleaseDC(NULL)))
    return E_FAIL;

問題は、GDI 描画後もテクスチャがまだ空であることです (PIX でもテスト済み)。すべてが機能し、エラー メッセージはありません。

誰でもそれがどのように機能するかを説明できることを願っています。

ありがとう、ステファン

編集:(ドキュメントによると)でも試してみましたGetDC(FALSE,&hDc):同じ結果->何もありません。

4

3 に答える 3

7

私は実際に先週、この問題と何度も戦いましたが、すべてうまくいきました! すべてを機能させるために知っておくべき/行うべきことのリストを次に示します。

この方法を使用する場合は、次の点に注意してください。

サーフェスには D3D11_RESOURCE_MISC_GDI_COMPATIBLE フラグを使用するか、スワップ チェーンには DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE フラグを使用してサーフェスを作成する必要があります。そうしないと、このメソッドは失敗します。

新しい Direct3D コマンドを発行する前に、デバイスを解放し、IDXGISurface1::ReleaseDC メソッドを呼び出す必要があります。

•このメソッドによって未処理の DC が既に作成されている場合、このメソッドは失敗します。

•サーフェスまたはスワップ チェーンの形式は、DXGI_FORMAT_B8G8R8A8_UNORM_SRGB または DXGI_FORMAT_B8G8R8A8_UNORM である必要があります。

•GetDC では、Direct3D パイプラインの出力マージのレンダー ターゲットがサーフェスからバインド解除されます。GDI レンダリング後の Direct3D レンダリングの前に、デバイスで ID3D11DeviceContext::OMSetRenderTargets メソッドを呼び出す必要があります。

•バッファのサイズを変更する前に、すべての未処理の DC を解放する必要があります。

  • バック バッファーで使用する場合は、ReleaseDC を呼び出したにレンダー ターゲットを再バインドすることを忘れないでください。GetDC を呼び出す前に RT を手動でバインド解除する必要はありません。このメソッドがそれを行います。

  • サーフェスは DXGI for GDI によって排他的にロックアウトされているため、GetDC() と ReleaseDC() の呼び出しの間に Direct3D 描画を使用することはできません。ただし、D3D に移行する前に、GDI を使用する必要があるたびに GetDC()/ReleaseDC() を呼び出すことを条件に、GDI と D3D のレンダリングを混在させることができます。

  • この最後の部分は簡単に聞こえるかもしれませんが、多くの開発者がこの問題に陥っていることに驚かれることでしょう。バック バッファーで GDI を使用して描画する場合、これはフレーム バッファーではなくバックバッファーであることに注意してください。描画したら、RT を OM に再バインドし、swapChain->Present() メソッドを呼び出して、バックバッファがフレームバッファになり、その内容が画面に表示されるようにする必要があります。

于 2012-01-09T20:47:30.563 に答える
3

たぶん、あなたはすべてうまくやっているのでしょう。

COLORREF bla = SetPixel(hDc,1,1,RGB(255,255,255));
bool hmm = TextOutA(hDc, 10, 10, "LALALA!", 7);

これから、テキストの色として使用する必要があるTextOutAと推測する方法がわかりません。bla私の知る限り、新しく作成/取得したDCで使用されるデフォルトのテキストの色は黒です。背景の塗りつぶしモードについてはわかりませんが、TRANSPARENTデフォルトの場合 - これは何も描画されていない理由を完全に説明しています.

コードを次のように変更します。

COLORREF bla = SetPixel(hDc,1,1,RGB(255,255,255));
VERIFY(SetTextColor(hDc, bla) != CLR_INVALID);

CREct rc(0, 0, 30, 20); // put relevant coordinates
VERIFY(ExtTextOut(hDc, rc.left, rc.top, ETO_CLIPPED, &rc, "LALALA!", 7));
于 2011-05-16T09:19:25.317 に答える