• ベストアンサー

GDIからDirectXへの移行

描画速度を向上させるため、DirectXを使いたいと思っているのですが、裏画面を作成して、線を引いて、文字を書いて、画面に転送するだけの簡単なCでのサンプルはどこかにないでしょうか? サイトや本を探しても、3Dや複雑なサンプルばっかりで、Hello Worldのような超簡単なサンプルを探しています。 今は、CreateCompatibleBitmapで裏画面を作成して、GDIで描画して、BitBltで画面に転送しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

DirectXSDKはダウンロードしましたか? インストールしたフォルダの中にSampleというフォルダ があると思いますが更にそのの中にTutorialというフォルダがあります。 その中にはDirectXの初期化だけとか 三角形を表示するだけとか、 Cで書かれた100行程度のサンプルプログラムが入っています。 http://www.microsoft.com/japan/msdn/directx/downloads.aspx 現在のDirectX SDKを使うにはVisual Studio .NET 2003か Visual Studio 2005が必要です。

関連するQ&A

  • GDI+について

    いつもお世話になっております。 今回教えていただきたいことは、GDI+についてです。 今まで GDI と OpenGL を組み合わせてプログラミングをしていましたが、GDIでは自前でアンチエリアス処理をしなければならないなど面倒な部分が多く困っていました。 そこで GDI+ を使用して楽にプログラミングしようと考えて色々とプログラムをしてみたのですが、ここにきて壁にぶち当たりましたので、先人の方にご教授していただきたいのです。 《 GDI でプログラムしていた時 》 (1)画像バッファを作成しておく  //ディスクトップのDCを取得  HDC hdcTmp = GetDC( GetDesktopWindow() );  //ビットマップのハンドルと、作成したバッファの先頭アドレスを取得  hBitmap = CreateDIBSection( hdcTmp, &bmi, DIB_RGB_COLORS, (void**)&buffer, 0, 0 );  //HBITMAPにHDCを結び付ける  hdc = CreateCompatibleDC( hdcTmp );     //DIBSection用メモリデバイスコンテキスト作成  hOldHandle = SelectObject( hdc, hBitmap );       //画像バッファ(m_hBitmap)をメモリデバイスコンテキストに選択 (GDIでも描画出来るようにするため) (2)画像バッファ上にGDIで描画する  hdcに対してGDIの関数を使用して描画 (3)BitBlt()でウィンドウに転送する  WM_PAINTのメッセージのときだけウィンドウに対して転送 上記(1)(2)(3)のようにして描画を行っていました。 ■したいこと(1)■ 今したい事は 上記(1)で作成したGDI の画像バッファのhdcを使ってGDI+関数で描画したいのです。 そうするといままで使っていたGDIの知識を生かして両方使えます。 ■したいこと(2)■ したいこと(1)がもし出来ないのであればGDI+での画像バッファがつくれるかどうか、その画像バッファのデバイスコンテキスト は取得できるのかどうか教えていただきたいと思います 情報不足かもしれませんが、ご教授よろしくお願いいたします。

  • タブをオーナードローすると、ちらついてしまいます

    質問させていただきます。 WindowsSDKを用いて、画面を作成しています。 MFCは使用していません。 タブを使っていますが、タブは作成時にTCS_OWNERDRAWFIXEDを指定しています。 WM_DRAWITEMメッセージが来たら、タブを描画していますが どうしてもちらつきが目立ってしまいます。 WM_DRAWITEMでの処理は、初めにタブの裏画面に描画し 最後にタブに通知された、DRAWITEMSTRUCTのhDCに裏画面の内容をBitBltで転送しています。 メイン画面もダブルバッファリングを行っておりますが、メイン画面はちらついていません。 タブ側で、WM_ERASEBKGNDで何もせずreturnすると、ちらつきはなくなりますが 背景色で塗りつぶされなくなるため、タブが表示される箇所にウィンドウを上に置いたりすると そこが残ってしまいます。 WM_DRAWITEMが頻繁によばれているため、これはちらついているのでしょうか? 解消方法に頭を悩ませております。 どうぞご教授の程お願いいたします。

  • MFC DirectXのデバイスの再設定

    MFCのMDIで、DirectXおよびWinAPIを仕様して領域に描画を行うものを作っています。 環境ですが、 VS2008 DirectX9.0 です。 子ウィンドウは4分割しており、(0,0)と(1,0)が描画領域で、(0,1)(1,1)はフォームです。 そこで、以前は各子ウィンドウごとに、デバイスを取得し、描画をおこなっていたのですが、ファイルを5個以上作成すると、WinAPIで描画されるものが表示されなくなりました。 それは、デバイスコンテキストは、5個以上もてないことが発覚したためとわかったので、デバイスは親で持つことにし、共通化することになりました。 しかし、それでは、親ウィンドウで取得しているため、描画のウィンドウサイズなどが異なるため、意図した領域にかけておりません。 そこで、各領域に再設定を行いたいのですが、どうすればよいのでしょうか? 対策として、下記のように考えたのですが、検討違いでしょうか? ・デバイスの画面の設定をResetなどをつかって、リセットし、描画領域の再設定を行う。(Resetだと、再度デバイスの取得を行うと思っているのですが、これだとファイルごとにもっているのと変わらないような気がします。) ・CreateOffscreenPlainSurface等でオフスクリーン サーフェイスを作成し、描画する。(描画の座標情報等の微調整がいるような気がします。) ・単純に再設定できるから再設定を行う。 アドバイスを御願い致します。

  • DirectX LPDIRECT3DDEVICE9のマルチスレッドでの使用について

    お世話になっております。 さて、現在DirectX 9.0cを用いたゲームを製作しています。 このゲーム内で、いわゆるNowLoadingの画面を作成しているのですが、ここで気になることがあります。 ここでのNowLoadingの要件は、"描画とは別にスレッドを作成し、そのスレッドでロード処理を行う"ことです。 そこで、ドキュメント(古いDirectXの日本語ドキュメント)でマルチスレッドについて言及している箇所を検索してみると、CreateDeviceの引数にD3DCREATE_MULTITHREADEDを入れると、マルチスレッドに対応すると書いてあります。しかし、同時にパフォーマンスを下げるとの記述もあります。 しかし、D3DXCreateTextureFromFileなどD3DXCreate**系の関数が、LPDIRECT3DDEVICE9に対して参照だけを行い、BeginSceneなど描画に関する関数の挙動には(LPDIRECT3DDEVICE9に同時にアクセスしたとしても)、なんら影響がないならば、わざわざこのD3DCREATE_MULTITHREADEDフラグを使いたくありません。 そこで、サンプルを作成してみました。 http://briefcase.yahoo.co.jp/bc/multithreaddevicesrc/lst?&.dir=/&.src=bc&.view=l このサンプルは、上記の処理をD3DCREATE_MULTITHREADEDフラグをいれず、そのまま行っているもので、テクスチャを別スレッドで、ひたすらロードと、解放を行っています。これを実行した結果、特に問題ない(強制終了などしない)ように見えました。 この結果は、"たまたま動いている"だけなのでしょうか、それとも"必然的"なもので、別段行ってもいいものなのでしょうか?もしくは、状況による(SetRenderStateなどの使い方による、など)ものなのでしょうか? ご教授よろしくお願いします。 環境は、DirectX9.0c (2008March)、XP sp3 になります。

  • DirectXを使用したゲームでの画面取得

    特定のオンラインFPSゲームで、画面が特定の状況になった一瞬のスクリーンショットを自動的に保存するプログラムを作成しています。 現在なんとかBitBltを使って画面を取得して状況の判別と画像の保存を行うプログラムができ、このプログラムであるゲームAでは正常に動作していることが確認できました。 しかし、別のゲームBでは上手く動作せず、確認したところBitBltでの取得が上手くいっていないようでBitBltで取得している画面全体が黒一色(RGB値ですべて0)と成っていることが分かりました。 おそらくゲームBに採用されているゲームガードなどとの競合だと思うのですが、検索エンジンで調べてみたところDxtoryなどのソフトではゲームBのプレイの動画が取れるようなので原理的にはプレイ中の画像を取得することもできるはずです。 DxtoryはDirectXを使用しているゲームに使用が限定されているようなので、おそらくDirextX関連(DirectDrawとかでしょうか?)で画面を読み取る方法があるのだとおもうのですが、具体的には一体どのような関数?を使って画面の取得を行えばいいのでしょうか? 参考になるサイトや使用する関数などをご存知の方、DirectX関連の知識をお持ちのかたはぜひご教授いただけたらと思います。よろしくお願いします。

  • GDI+で高速な描画

    GDI+を利用してお絵かきツールのようなものを作成しようと思っています。 しかしdrawImage()での画面への描画が非常に遅いようで、描いてみると線がカクカクしてしまいます。 アンチエイリアスやアルファブレンドが必要なのでGDI+を利用したいのですが、どうにか高速に描画させる方法はないでしょうか? 下記は現在のソースの一部です。 static Bitmap *offscreenBitmap //描画処理はこっちに static Graphics *offscreen; static Graphics *onscreen; //画面表示用 static RECT rect; //クライアント領域 static POINTS posPts,pts; //一つ前と現在のマウス座標 static BOOL bLButtonDown; Pen nomalPen(Color(100,0,0,0), 1); //描画用ペン switch(msg){  case WM_CREATE:   GetClientRect(hWnd,&rect);   offscreenBitmap = new Bitmap(rect.right, rect.bottom); //ビットマップ生成   offscreen = new Graphics(offscreenBitmap);   offscreen->SetCompositingMode(Gdiplus::CompositingModeSourceOver);   offscreen->SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);//アンチエイリアス有効化   offscreen->Clear(Color(255,255,255)); //初期化   onscreen = new Graphics(hWnd); //ウインドウ表示用   onscreen->SetCompositingMode(CompositingModeSourceCopy);   break;  case WM_LBTTONDOWN:   bLButtonDown = TRUE;   posPts=MAKEPOINTS(lp)   break;  case WM_MOVE:   pts=MAKEPOINTS(lp)   if(bLButtonDown){    offscreen->DrawLine(&nomalPen, posPts.x, posPts.y, pts.x, pts.y);//線描画    posPts.x=pts.x;    posPts.y=pts.y;   }   InvalidateRect(hWnd,&rect,0);//ウインドウを更新   break;  case WM_PAINT:   onscreen->DrawImage(offscreenBitmap,0,0);//画面に書き出し   break; }

  • クライアント領域の保存

     初歩的な質問でごめんなさい。 VC.netのMFCで、OnLButtonDownで描画の処理をしているのですが、これだと画面を最小化したりするとクライアント領域に描画していたものが消去されてしまうので、画面全体のビットマップをメモリに保存しておきOnPaint関数でブロック転送すればよいと参考書に載っているのですが、このメモリに保存してブロック転送というのがうまくできません。  BitBltを使うのはわかるのですが、どうもうまくいきません。よろしければ、恐縮ですがソースを教えていただきたいです。お願いします。

  • BitBltについて。

    どなたか経験のある方、わかる方居られましたら教えてください。 プリンタのデバイスコンテキストからメモリDCに描画してビットマップを作成したいと思っているのですが、プリンタDCからメモリDCへのBitBltがうまくいっていないのか、完成イメージが真っ黒になります。 hMemDC = CreateCompatibleDC(hPrinterDC); hBitmap = CreateCompatibleBitmap(hPrinterDC,lnWidth,lnHeight); Obj = (HBITMAP)SelectObject(hMemDC,hBitmap); iRet = GetDeviceCaps(hMemDC,RASTERCAPS); // iRet の戻り値は 28313(10進)でした。 // コピー iRet = BitBlt(hMemDC,0,0,lnWidth,lnHeight,hPrinterDC,0,0,SRCCOPY); // iRet の戻り値は 1 になってました。 本来は lnHeight の値が BitBlt の戻り値になるのかと思いますがうまくいきません。 hPrinterDC はもともと印刷用の関数で使用しているものなので、そこには問題が無いのではないかと自分では思っていますが、わかる方居られましたら教えていただけませんでしょうか?

  • jspとはなにか?

    jspがよくわかりません。 サイトにはjspはサーバ側でなんらかの処理をしてhtmlを返すと書いていました。 そしてサンプルとして以下のようなコードがのっていました。 1: <html> 2: <head><title>Hello World!</title></head> 3: <body> 4: <h1>Hello World!</h1> 5: <p> 6: <% 7: String hello = "Hello World!";//ここはJSPの処理 8: out.println(hello); 9: %> 10: </p> 11: </body> 12: </html> ためしにこのソースでhtmlを作ってダブルクリックした(つまり、Tomcat等のサーバをつかわなかった)ところ、画面にhello Worldが表示されました。しかし私はこの現象がよく理解できません。 jspはサーバ側でうまいこと解釈して、そこから作成されたhtmlをクライアントに送ってくる仕組みなのなら、jspを直接ブラウザに読み込ませてもブラウザが理解できるとおもえません。 なぜこのようなことができるのでしょうか?

    • ベストアンサー
    • Java
  • ドローソフトのダブルバッファリングプログラム

    現在、MFCを使ったドローソフトを作成しています。 仕様はキャンバス上にい色々な部品をマウスで配置するといったものです。 画面描画の際の画面チラつき防止にダブルバッファリングという手法があり 裏画面でキャンバスの背景と部品を作成し、表画面に転送するものがある事を知りました。 そこで質問なのですが マウスで一つの部品を選択し移動する場合、背景はどのように描画すべきなのでしょか? もしも、キャンバス上に部品がたくさん有る場合、毎回、全てを描画し直していたら処理が 遅くなってしまいます。 選択した部品だけ再描画する効率的な方法をご存知の方がいました教えて下さい。 どうぞ宜しくお願い致します。

専門家に質問してみよう