Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@tomoyasup

DirectX のテクスチャにGDI のデバイスコンテキストを使用して描画した画像を割り当てる

GDI ではアルファを書き込めないので何を書いても透明(アルファ0)にで塗りつぶされるので使い物にならないかも。要調査

GDI+ を使えばアルファも書き込める
アルファを反映するには以下のコードでモードを変更する必要あり。

Graphics myGraphics(hDC);
myGraphics.SetCompositingMode(Gdiplus::CompositingModeSourceCopy);

前提

GDI を使用して描画する仕組みを知っている
http://www.kumei.ne.jp/c_lang/sdk/sdk_24.htm とか

フルカラーのみ。カラーテーブルは考慮していません。

ビットマップ形式のヘッダ、ピクセル情報の格納先はメモリ上に作成、確保しておく必要があります。ヘッダ情報の後ろにピクセル情報をコピーします。
参考 http://www.kumei.ne.jp/c_lang/sdk2/sdk_169.htm

CImage が超便利

考え方

  1. デバイスコンテキストを取得
  2. ビットマップ割り当て
  3. 描画
  4. ビットマップ形式でメモリ上にコピー
  5. メモリ上のデータをテクスチャに割り当て

1 と 2 と 4 について

メモリデバイスコンテキストにビットマップを割り当てる方法

メモリデバイスコンテキストを作成(CreateCompatibleDC)して、ビットマップを割り当てる(CreateCompatibleBitmap)場合

メモリコピーは、GetDIBits でピクセル情報をコピーできるらしい。未確認

GetDIBits は推奨されていないっぽいのでこの方法は使わない方がよさそう

画像を読み込む場合、CImage クラスを使用する方法

CImage クラスで、Load メソッドを使用して読み込んだ場合、ビットマップが割り当て済みのデバイスコンテキストも同時に作成されるので、それを使用して描画すれば読み込んだ画像の上に描画することができる。

メモリコピーは、ピクセル情報は、GetBits メソッドでピクセルの先頭アドレスが取得できるので memcpy で丸ごとコピーできる。
ただし、GetPitch メソッドでマイナスが返ってきた場合、先頭のアドレスでは無く画像の最終行の先頭アドレスを示しているので、本当の先頭アドレスを計算する必要がある。

3 については取得したデバイスコンテキストで描画するだけ

割愛

5 について

コピーしたデータを
D3DXCreateTextureFromFileInMemory または D3DXCreateTextureFromFileInMemoryEx に渡すだけ。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?