DirectX 11 ConsntanBufferの更新について

このQ&Aのポイント
  • マルチスレッドでConsntanBufferの更新を行うときにエラーが出てしまいます。
  • DirectXをDebugモードで実行すると以下のようなエラーが出てしまいました。
  • エラーの解決方法をご存知の方はいらっしゃいますでしょうか?
回答を見る
  • ベストアンサー

DirectX 11のConsntanBuffer

DirectX 11 ConsntanBufferの更新について マルチスレッドでConsntanBufferの更新を行うときにエラーが出てしまいます。 基本的な設計ですが、 1. メインのシーケンスを行うスレッド 2.DeviceContextに描画コマンドを詰むスレッド のスレッド2本構成です。 1から2へのスレッドへは仮想的な描画コマンドを発行し、 ダブルバッファリングを行い並列性を高めています。 # よくある方式だと思います。 HLSLで簡単なシェーダを作りポリゴンを表示することはできたのですが、 DirectXをDebugモードで実行すると以下のようなエラーが出てしまいました。 D3D11: CORRUPTION: ID3D11DeviceContext::Map: Two threads were found to be executing functions associated with the same Device at the same time. This will cause corruption of memory. Appropriate thread synchronization needs to occur external to the Direct3D API. 3516 and 5376 are the implicated thread ids. [ MISCELLANEOUS CORRUPTION #28: CORRUPTED_MULTITHREADING ] 内容はスレッド間で同じバッファに対してID3D11DeviceContext::Mapを実行しているため、 中身が破壊される可能性があるというものです。 先述の通り、基本的にDeviceContextを取り扱うのは2のスレッドです。 しかし、内容が動的に変更されるバッファについては 1のスレッドでID3D11DeviceContext::Mapを実行し、 取得したアドレスを直接書き換えるようにしています。 エラーではID3D11DeviceContext::Mapが2つのスレッドで実行されているというのですが、 初期化時は別として、通常のアップデート処理を行っている間は1のスレッドでしか使っていません。 書き込み先のバッファもダブルバッファ化しており、 またCPUAccess / USAGE / BIND / MAPのフラグも D3D11_CPU_ACCESS_WRITE / D3D11_USAGE_DYNAMIC / D3D11_BIND_CONSTANT_BUFFER / D3D11_MAP_WRITE_DISCARD と、動的バッファを使うときの標準的な組み合わせで使用しています。 いろいろとサンプルプログラムを見ているのですが、 出回っているのは大抵がシングルスレッドで作られており、 今回の件に関してはあまり参考になりませんでした。 プログラム中ID3D11DeviceContext::Mapを呼び出しているところは かなり限定できるため、おそらく間違いないありません。 いろいろ調べては見たのですがエラーが出てしまう原因が特定できずに困っています。 エラーの解決方法をご存知の方はいらっしゃいますでしょうか? ■補則 D3D11_MAP_WRITE_DISCARDはCPUとGPUの同期を制御するフラグですので、 CPUとCPUの競合がおきている今回の件とは別のはずです。 他にはID3D11DeviceContextのメソッド中の何かが 内部でID3D11DeviceContext::Mapを呼び出している可能性がありそうです。 2のスレッドで問題のバッファにアクセスしているメソッドは ID3D11DeviceContext::VSSetConstantBuffersぐらいです。 (これが内部でMapを呼び出しているとは思えませんが…)

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

  • ベストアンサー
  • sygh
  • ベストアンサー率76% (42/55)
回答No.1

デバイス コンテキストID3D11DeviceContextのメソッドはいずれもスレッド セーフではありません。 呼び出しがスレッド セーフになったのはID3D11Deviceだけです。そのため、デバイス コンテキストはスレッドごとに作成する必要があります。 具体的には、メインスレッドではイミディエイト コンテキスト(Immediate Context)、サブスレッドではディファード コンテキスト(Deferred Context)として、それぞれスレッドごとに作成する必要があります。 Direct3D 11のマルチスレッド レンダリングは、サブスレッド側で遅延された描画コマンドのリストを記録(作成)し、メインスレッド側で再生(実行)する、という方式になっています。 DirectX SDKにMultithreadedRendering11サンプルが付いているので、(例のごとくDXUTやら大量のグローバル変数やらで少し読みづらいですが)それが参考になるかと思います。Map/Unmapは各スレッドごとに独立して実行しています。 http://msdn.microsoft.com/ja-jp/library/ee422102.aspx http://wlog.flatlib.jp/archive/1/2008-11-7

emuesuenu
質問者

お礼

話は脱線しましたが、 ID3D11DeviceContextがスレッドセーフでないことは理解しました。 # もっとわかりやすい警告を出してくれれば速く気づけたのですが… 大変助かりました。 どうもありがとうございました。

emuesuenu
質問者

補足

>デバイス コンテキストID3D11DeviceContextのメソッドはいずれもスレッド セーフではありません。 >呼び出しがスレッド セーフになったのはID3D11Deviceだけです。そのため、デバイス コンテキストはスレッドごとに作成する必要があります。 なるほど。Direct3D 9ではMULTITHREADオプションでスレッドセーフに出来ましたが、 おっしゃるとおりスレッド単位でコンテキストを分けた方が クリティカルセクションのロスが減らせそうです。 DeferredContextはDirect 3D 10では使えないようですね。 今作っているプログラムはマルチプラットホーム対応を検討しているため、 できるだけ標準化されたAPIで実装しようとしています。 となればリソースの更新も仮想コマンドを投げて 2のスレッドで行うことにします。 ただ、この方法ですと書き込み先のアドレスが、 書き込み元のスレッドで取得できなくなります。 1のスレッドではテンポラリバッファを用意し、 そこに書き込んだ後、2のスレッドでMapをしmemcpyをします。 メモリが余分に必要なのに加えてmemcpy分の処理が上積みされてしまいます。 残るは毎フレームID3D11Device::CreateBuffer/ID3D11Buffer::Releaseを呼び出す方法です。 D3D11_SUBRESOURCE_DATAに1のスレッドで操作しているバッファをセットするので、 コピー処理は不要です。 # Direct3D 9ではコピーが必須ですし、 # Direct3D 10以降であっても内部的にコピー処理が走るかも知れないので # 気休めではありますが… バッファの生成と破棄が大量に呼び出されることになりますが メモリ容量と処理速度と汎用化のバランスが一番とれている気がします。 初期化時にSINGLETHREADフラグがセットできるので、 実質Direct3D 9と同じ扱いになりそうです。

関連するQ&A

  • Windows7とDirectX9.0cについて

    こんにちは。 現在DirectX9.0cでプログラムを書いているものです。 質問させてください。 私は普段は一人暮らしで、デスクトップで開発しています。 しかし今は年末ということもあり、帰省していてノートパソコンで開発しています。 デスクトップPCで開発していたアプリケーションをノートパソコンで実行してみたところ、実行速度がひどく落ちてしまって理由がわからず困っています。 デスクトップでは60しっかり出るのに対し、ノートパソコンで実行するとFPSは1(程度)です。 環境や設定などは以下のとおりです。 ・DirectXのデバイス生成時   D3DPRESENT_PARAMETERS d3dpp={};   d3dpp.BackBufferWidth = 1024;   d3dpp.BackBufferHeight = 768;   d3dpp.Windowed = true;   d3dpp.EnableAutoDepthStencil = true;   d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;   d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;   d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;   d3dpp.BackBufferCount = 1;   d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;   gpd3d = Direct3DCreate9( D3D_SDK_VERSION );   gpd3d->CreateDevice( D3DADAPTER_DEFAULT,                       D3DDEVTYPE_REF,                       hWnd,                       D3DCREATE_HARDWARE_VERTEXPROCESSING,                       &d3dpp,                       &gd3ddevice );. ・やってること ビルボードにテクスチャを貼って表示と4枚 CreateVertexBufferなどは使用せずSetFVFとDrawPrimitiveUPで描画。 D3DDEVTYPE_REFの部分をD3DDEVTYPE_HALにしてもデスクトップ、ノートパソコンともにエラーも出ずデバイスは生成できるのですが、ノートパソコン側でD3DDEVTYPE_HALで実行すると何も表示されないので仕方なくD3DDEVTYPE_REFで実行しています。 開発環境 VisualStudio2008 academic edition Microsoft DirectX SDK (June 2010) スペック /* ・デスクトップPC Core i7 920 2.66GHz Windows7 64bit Ultimate Memory 12GB Geforce 9800GTX */ /* ・ノートパソコン Core i7 Q720 1.60GHz Windows7 64bit Ultimate Memory 4GB Geforce GT 240M */ このスペックでFPSがまったくでないので何が問題かさっぱりです。 DirectXのControlPanelでDebugモードにして出力を見ましたが特に問題は見つけられませんでした。 ほかにもリビルドやReleaseモードでコンパイルなども試してみたのですが症状は変わらずです。 どのような問題があってノーとパソコンのWindows7 64bit上でのDirectX9.0cの実行速度が上がらないことが考えられますでしょうか? /* 現在の状態 ・シェーダー(HLSL)などは使用していません。 ・View行列とProjection行列とWorld行列をセットして座標変換して描画しています。 ・スレッドは立ち上げていません。 ・メッセージループは以下のような形です MSG msg={0}; while( msg.message != WM_QUIT ) {   if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )   {     TranslateMessage( &msg );     DispatchMessage( &msg );   }   else   {       /* アップデート処理や描画処理など */   } } */ わかりづらいかと思いますが、よろしくお願いします。

  • 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で質問です。

    お世話になります。 VC++6.0とDIRECTX9.0cを使ってゲームを作ろうとしています。 参考にと思い、MSDNサイトののDirectX によるゲームプログラミング入門の第1章3D ゲームプログラムの基礎をやることにしました。 そのサイトのサンプルプログラムをダウンロードし、VC++6.0でビルドをした後、デバッグを開始すると実行中に 「ハンドルされていない例外は○○.EXEにあります・・・」とエラーが発生しました。 しかし、ビルド後実行ファイルを単体で動かしてもエラーがでません。 調べてみると、LPD3DXBUFFERオブジェクトをリリースする時にエラーが発生しています。 LPD3DXBUFFER lpD3DBuf; HRESULT hres; hres = D3DXLoadMeshFromX( fn,D3DXMESH_SYSTEMMEM, lpD3DDevice,NULL, &lpD3DBuf, NULL, &m_nMaterials, &m_lpMesh); lpD3DBuf->Release(); ↑ これを実行したらエラー発生 何故このようなことが起こるのか、どうすればエラーが出ないのかわかりません。 皆さんのお知恵をお貸しください。 宜しくお願いします。

  • 巡回バッファを使用した生産者-消費者問題について

    ダイテル社のJavaプログラミングvol.2という本のサンプルコードなのですが、このプログラムは、5つの要素を持つ配列を共有バッファとし、それを生産者スレッドと消費者スレッドの共有資源とするものです。 ProduceIntegerクラスが生産者、ConsumeIntegerが消費者に対応しています。共有バッファは、HoldIntegerクラスのインスタンス変数holdvalue[]です。生産者は共有バッファに0~9の整数を書き込み、消費者は書き込まれた整数を読み込むことによって生産者-消費者を再現しています。実行結果について、正しく生産者が生産した0~9を漏れることなく消費しているのですが、ここで質問です。 生産者スレッドは、0~9の値を書き込むと、HoldIntegerクラスのmoreDataをfalseに設定して死亡します。 消費者スレッドは書き込まれた値を全て消費するまで58行目のwhile文で繰り返されます。生産者スレッドのほうが、消費者よりもsleep時間が短いので、大抵生産者スレッドは先に値を書き込み終わります。生産者スレッドが値を書き込み終わりmoreDataフラグをfalseにしたあたりのところ(実行結果26行目)で疑問があるのですが、まず生産者スレッドのwhile条件は(moreDataがfalse かつ writeLocとreadLocが同じ)でない時です。もし、生産者スレッドがmoreDataフラグをfalseにした次の瞬間に消費者スレッドのwhile条件が評価された場合は、実行結果を見て分かるようにreadLoc=0, writeLoc=0なのでそこでwhileを抜けて消費しおわってない状態でスレッドが死亡してしまうと思ったのですがどうでしょう?sleepTimeを乱数でとっているためタイミングによって左右されるのではないでしょうか。納得ができないので、どうか説明よろしくお願いします。説明分かりにくかったらすみません。 ソース:http://izumo.cool.ne.jp/precious7/SharedCell.java 実行結果:http://izumo.cool.ne.jp/precious7/result.txt

    • ベストアンサー
    • Java
  • DirectXについて 「d3dx9.hファイルが見つかりません」というエラー

    今後DirectXが必要になりそうなので そちらの勉強をはじめようと思っています。 ですがそもそもDirectXというものすら何なのかわからない 状態でしたのでまずは書籍を購入し、目を通しました。 やはり文章だけでは理解が難しかったので 付属のサンプルソースをCDからコピーし実行してみたのですが、 > fatal error C1083: include ファイルを開けません。 > 'd3dx9.h': No such file or directory とエラーが表示されビルドが中断されてしまい、 実行することができないようです。 「d3dx9.h」が見つからないということはわかるのですが、 「DirectX SDK 2007February」というものをインストール しているのですが、他にもなにか必要ということなのでしょうか? また、拡張子が「.x」のファイルを実行すると Direct3D Viewerが立ち上がるのですが全て読み込みエラーで 画面には何も表示されていません。 試にメタセコイアで作ってみたものも駄目でした。 これも上記の「d3dx9.h」というものが関係していたりしますか? ちなみにDirectXで作られたゲームはプレイできます。 やはり私の環境の問題なのでしょうか・・・。 お分かりの方がいらっしゃいましたら、アドバイスを いただければ幸いです。よろしくお願い致します。

  • DirectX診断ツールの「DirectXの機能」の項目がアクティブに

    DirectX診断ツールの「DirectXの機能」の項目がアクティブになりません 自分でも色々試してみましたが、行き詰って頭が破裂しそうなのでご助言お願いします…… 先日ノートパソコンのクリーンインストールを行い、メーカーサイトにアップされていたドライバを入れ(ディスプレイドライバを除く)、数年ぶりに遊ぼうとラグナロクオンライン(ネットゲームです)もパソコンにインストール。 IE8からゲーム起動→ゲーム開始をクリック でエラーがでました。(エラー内容:Cannot init d3d grf file has problem.) 因みに、数年前はこのパソコンでプレイ出来ていました。 そこで、DirectX診断ツールでディスプレイ情報を確認しました。 ディスプレイタブから、DirectXの機能の「DirectDrawアクセラレータ」「Direct3Dアクセラレータ」「AGPテクスチャアクセラレータ」以上3つの項目は「利用できません」と表示されています。 横のボタンは灰色文字で「無効」となっています。まずはここを有効にしたいのです。 調べた所、ディスプレイドライバを最新の物にインストールし直すと解決する例ばかりでしたが、その(多分)最新ドライバを入れた所です。他の原因は考えられないでしょうか。 これは試してみた?というのがありましたら、些細なことでもいいのでお伝えいただけると幸いです。 ノートパソコンは NEC の「LaVie C LC700/7」です。 【公式仕様】 http://121ware.com/psp/PA121/NECS_SUPPORT_SITE/CRM/s/WEBLIB_NECS_PRO.PRODUCT_ID.FieldFormula.IScript_Product_Spec_Details?prodId=PC-LC7007D 【DirectX診断ツールからの情報】 Operating System: Windows XP Home Edition (5.1, Build 2600) Service Pack 3 (2600.xpsp_sp3_gdr.100216-1514) System Manufacturer: NEC System Model: PC-LC7007D BIOS: BIOS Date: 09/01/03 19:04:16 Ver: 08.00.08 Processor: Mobile Intel(R) Pentium(R) 4 CPU 2.66GHz Memory: 510MB RAM Page File: 405MB used, 841MB available DirectX Version: DirectX 9.0c (4.09.0000.0904) DX Setup Parameters: Not found DxDiag Version: 5.03.2600.5512 32bit Unicode ディスプレイドライバのみこちら http://www.omegadrivers.net/index.php?option=com_phocadownload&view=category&id=3:windows-xp-2k&Itemid=65 の「Radeon Omega Drivers 4.8.442」をインストールしています。 (※パソコンに貼ってあるシールには「GRAPHICS BY ATi MOBILITY RADEON 9000」とあります) ディスプレイドライバに関して。 ATI公式サイトにダウンロードできるディスプレイドライバが無かったので、DELL公式サイトから「ATI MOBILITY RADEON 9000 Windows XP Video Driver」を見つけ、それをインストールしようとしましたがエラーダイアログが表示され出来ませんでした。 (※「INFエラー ビデオドライバが見つかりません。」「セットアップはインストールを完了できませんでした。ディスプレイアダプタをスタンダードディスプレイアダプタ(VGA)に変更してからセットアップを実行してください。」と表示されました) インストールにはATiWikiを参照し、ドライバのクリーンインストールを実行しています。 また、試しにセーフモードでインストールしようとしても上記のエラーが出ました。

  • DirectXとビデオドライバについて

    下記の状態のPCであるゲームをしようとすると 「Could not find compatible Direct3D devices.」 「グラフィックボードの初期化に失敗しました」と表示されます。 オフィシャルHPによると 「ご使用のパソコンのビデオ(グラフィック)が動作環境未満の可能性があります。この場合は動作環境を満たしていただくか、別の動作環境を満たした環境でプレイしてください。」 と出ています。 これはPCがDirectX 9.0cに対応していないということでしょうか? あまり詳しくないのでビデオボード、グラフィックドライバなどがどれなのか、またスペックの良し悪しや対応方法がわかりません。 このデータでわかりますでしょうか? ------------------ System Information ------------------ Machine name: FM-AFC020FC868C Operating System: Windows XP Home Edition (5.1, Build 2600) Service Pack 3 (2600.xpsp_sp3_gdr.090804-1435) Language: Japanese (Regional Setting: Japanese) System Manufacturer: FUJITSU System Model: FMVL70E BIOS: Phoenix FirstBIOS(tm) Desktop v1.00 Processor: Intel(R) Pentium(R) 4 CPU 2.60GHz (2 CPUs) Memory: 758MB RAM Page File: 230MB used, 1628MB available Windows Dir: C:\WINDOWS DirectX Version: DirectX 9.0c (4.09.0000.0904) DX Setup Parameters: Not found DxDiag Version: 5.03.2600.5512 32bit Unicode --------------- Display Devices --------------- Card name: Intel(R) 82865G Graphics Controller Manufacturer: Intel Corporation Chip type: Intel(R) 82865G Graphics Controller DAC type: Internal Device Key: Enum\PCI\VEN_8086&DEV_2572&SUBSYS_120C10CF&REV_02 Display Memory: 96.0 MB Current Mode: 1280 x 768 (32 bit) (60Hz) Monitor: Monitor Max Res: Driver Name: ialmrnt5.dll Driver Version: 6.14.0010.4396 (English) DDI Version: 9 (or higher) Driver Attributes: Final Retail Driver Date/Size: 9/20/2005 10:52:38, 36990 bytes WHQL Logo'd: Yes WHQL Date Stamp: n/a VDD: Mini VDD: ialmnt5.sys Mini VDD Date: 9/20/2005 11:00:54, 1302332 bytes Device Identifier: {D7B78E66-6632-11CF-5362-0632A3C2CB35} Vendor ID: 0x8086 Device ID: 0x2572 SubSys ID: 0x120C10CF Revision ID: 0x0002 Revision ID: 0x0002 Video Accel: Deinterlace Caps: n/a Registry: OK DDraw Status: Enabled D3D Status: Enabled AGP Status: Not Available DDraw Test Result: All tests were successful. D3D7 Test Result: All tests were successful. D3D8 Test Result: All tests were successful. D3D9 Test Result: All tests were successful.

  • ラグナロクエラー

    ラグナロクの実行ファイルを開くと「cannot init d3d!!」というエラー が出るんですが、どうすれば正常に動作するのでしょう?

  • Javaのマルチスレッド処理(スレッド数の上限)

    Tomcatを使用したWebアプリを作成しているのですがある処理を マルチスレッドで行う予定でいます。 画面でチェックボックスが100個チェックされたら100個スレッドを作成して それぞれのスレッドが通信を行うイメージです。 ここで以下の疑問があります。 1.一度に作成できるスレッドの数はTomcatがインストールされているOSに依存するのでしょうか。 2.もし100個が上限として101個スレッドを作成した場合、どうなるのでしょうか。 3.100個が上限とした場合、この数は一定でしょうか。何か別の全く関係のない重い処理が   実行されていてCPUに負荷がかかっていたりすると上限が10個になるということはあるので   しょうか。 4.一度に作成できるスレッドが100個とした場合、Tomcatが下記4人のリクエストを同時に処理   したらエラーという認識でよいでしょうか。それとも4人それぞれが100個ずつ(計400個)   スレッドを作成できるということでしょうか。   Aさん・・・30個のチェックボックスをONにして実行   Bさん・・・30個のチェックボックスをONにして実行    Cさん・・・30個のチェックボックスをONにして実行   Dさん・・・30個のチェックボックスをONにして実行 5.また、Javaプログラムで現時点で作成可能なスレッド数を取得することは可能でしょうか。

  • 未解決の外部シンボル

    Microsoft DirectX SDK (August 2009)\Samples\C++\Direct3\MultiAnimationをデスクトップにコピーして実行すると動くんですが、SampleBrowserからemptyprojectをインストールして MultiAnimationと同じcppとhをプロジェクトに追加すると、 1>DXUTgui.obj : error LNK2019: 未解決の外部シンボル _D3DX10CreateEffectFromMemory@56 が関数 "public: long __thiscall CDXUTDialogResourceManager::OnD3D10CreateDevice(struct ID3D10Device *)" (?OnD3D10CreateDevice@CDXUTDialogResourceManager@@QAEJPAUID3D10Device@@@Z) で参照されました。 1>DXUTcamera.obj : error LNK2001: 外部シンボル "_D3DX10CreateEffectFromMemory@56" は未解決です。 1>DXUTgui.obj : error LNK2019: 未解決の外部シンボル _D3DX10CreateSprite@12 が関数 "public: long __thiscall CDXUTDialogResourceManager::OnD3D10ResizedSwapChain(struct ID3D10Device *,struct DXGI_SURFACE_DESC const *)" (?OnD3D10ResizedSwapChain@CDXUTDialogResourceManager@@QAEJPAUID3D10Device@@PBUDXGI_SURFACE_DESC@@@Z) で参照されました。 1>DXUTgui.obj : error LNK2019: 未解決の外部シンボル _D3DX10CreateFontW@48 が関数 "protected: long __thiscall CDXUTDialogResourceManager::CreateFont10(unsigned int)" (?CreateFont10@CDXUTDialogResourceManager@@IAEJI@Z) で参照されました。 1>DXUTgui.obj : error LNK2019: 未解決の外部シンボル _D3DX10CreateTextureFromFileW@24 が関数 "protected: long __thiscall CDXUTDialogResourceManager::CreateTexture10(unsigned int)" (?CreateTexture10@CDXUTDialogResourceManager@@IAEJI@Z) で参照されました。 1>SDKmisc.obj : error LNK2001: 外部シンボル "_D3DX10CreateTextureFromFileW@24" は未解決です。 1>DXUTgui.obj : error LNK2019: 未解決の外部シンボル _D3DX10GetImageInfoFromFileW@16 が関数 "protected: long __thiscall CDXUTDialogResourceManager::CreateTexture10(unsigned int)" (?CreateTexture10@CDXUTDialogResourceManager@@IAEJI@Z) で参照されました。 1>SDKmisc.obj : error LNK2001: 外部シンボル "_D3DX10GetImageInfoFromFileW@16" は未解決です。 1>DXUTgui.obj : error LNK2019: 未解決の外部シンボル _D3DX10CreateTextureFromResourceW@28 が関数 "protected: long __thiscall CDXUTDialogResourceManager::CreateTexture10(unsigned int)" (?CreateTexture10@CDXUTDialogResourceManager@@IAEJI@Z) で参照されました。 1>DXUTgui.obj : error LNK2019: 未解決の外部シンボル _D3DX10GetImageInfoFromResourceW@20 が関数 "protected: long __thiscall CDXUTDialogResourceManager::CreateTexture10(unsigned int)" (?CreateTexture10@CDXUTDialogResourceManager@@IAEJI@Z) で参照されました。 1>DXUTres.obj : error LNK2019: 未解決の外部シンボル _D3DX10CreateTextureFromMemory@28 が 関数 "long __stdcall DXUTCreateGUITextureFromInternalArray10(struct ID3D10Device *,struct ID3D10Texture2D * *,struct D3DX10_IMAGE_INFO *)" (?DXUTCreateGUITextureFromInternalArray10@@YGJPAUID3D10Device@@PAPAUID3D10Texture2D@@PAUD3DX10_IMAGE_INFO@@@Z) で参照されました。 1>DXUTres.obj : error LNK2019: 未解決の外部シンボル _D3DX10GetImageInfoFromMemory@20 が関数 "long __stdcall DXUTCreateGUITextureFromInternalArray10(struct ID3D10Device *,struct ID3D10Texture2D * *,struct D3DX10_IMAGE_INFO *)" (?DXUTCreateGUITextureFromInternalArray10@@YGJPAUID3D10Device@@PAPAUID3D10Texture2D@@PAUD3DX10_IMAGE_INFO@@@Z) で参照されました。 1>Debug\GRAVITY ESCAPE.exe : fatal error LNK1120: 外部参照 9 が未解決です。 とでます(長くてすみません)。 追加のインクルードディレクトリにはDXUT\Optional;DXUT\Coreを指定しています。 独学で勉強しているんですが、このエラーの原因がまったく分かりません。 どなたかよろしくお願いします。

専門家に質問してみよう