• 締切済み

DirectXでのプログラミング

はじめまして。シンといいます。 現在VC++.NET(2002)とDirectX9.0を 使用してプログラミングをしております。 タスク処理の形式でプログラムを組んでいるのですが 描写処理として頂点バッファに定義したモデルデータを 出力するタスクを登録したのですがまったく描写がされず いきずまってしましました・・。 タスク処理は描写毎に初期処理→タスク処理→タスク後処理といった フローで処理を行っており 初期処理でClear、BeginScene タスク処理でSetStreamSource、SetFVF、DrawPrimitive 後処理でEndScene、Present を行っております。 頂点バッファより画面へ描写する場合にCreateWindo、Direct3DCreate9、CreateDevice等で 宣言しておかなくてはいけない事があるのでしょうか? 元々はスプライト描写のみをしていたプログラムを改造して作成しています。 (先々でスプライトと頂点モデルデータを合成したい為) なにかお気づきのことがありましたらご教授お願い致します。

みんなの回答

  • aho0xff
  • ベストアンサー率12% (218/1772)
回答No.1

まったく描画がされない・・・と・・うーん・・その時点で「実際どこまでは大丈夫なのか?」 を出した方がいいかと思います。ウインドウは?フルスクリーン?画面は真っ暗?それによっても変わってくるかと・・・・ たとえば Clear は確か色を指定できませんでしたっけ?それで色が変わるようなら、初期処理と後処理は問題なさそうです。 それもダメなら、実際はどこかで何か(またあいまいですが)のエラーが出されていると思うのですが・・・・ または、カメラは指定してますか?座標は?ライトは?そこら辺のミスでもないですよね? もっと絞っていった方がいいかと思います。

sin002
質問者

お礼

ご回答ありがとうございます。 原因がどうしても分からないのでまた頭から一つずつ 作成しなおしております。 もう少し原因が絞れるよう頑張ります。 またなにか分かりましたら相談させて下さい。

関連するQ&A

  • DirectXのポリゴンモデルの表示について。

    DirectXの勉強を始めたばかりの者です。 3Dポリゴンモデルの表示をさせたいと思いWeb上の解説記事を読んでいるのですが 何枚かの板ポリゴンで構成される「ポリゴンモデル」のデータを「プログラム内で記述」して描画させるにはどうしたら良いのか、ということが分かりません。 解説記事を読んでいて、まず、DrawPrimitive()等で一枚ずつポリゴンを描画させることを知りました。 それから「メッシュモデル」という単位で、3Dモデリングソフトで作成した「xファイル」からロードして描画できることを知りました。 (http://princess-tiara.biz/directx/?chapter=12)  ただし「メッシュモデル」のような単位のポリゴン群データを「xファイル」からロードするのでは無く、プログラム内での配列データのセットのような感じで記述したいと思っています。  こういう場合、頂点の繋がりや法線などのデータを全く自前の構造体で定義して、各ポリゴンをforループで一枚ずつDrawPrimitiveなどで描画するというのも、それも1つの手だとは思うのですが、それは何となく本筋という訳でも無いのではと思えます。  また、別のモデリングソフトで「xファイル」を作って、というのも例えば幾何学的な多面体モデルを作りたいと思う場合にはあまり適していないように思います。(その場合、頂点の座標値は是非コンピュータ自身に計算させてセットしたいものです。)  メッシュモデルのようなデータをプログラム上に記述したい場合、プログラム自身に座標値をセットさせたい場合、どうしたら良いのでしょうか?  何か特定の記述のフォーマットなどがあるのでしょうか。またそれを描画する方法はあるでしょうか。解説されているページなどありましたらリンクのみでも助かります。  

  • バッファオーバーフロー攻撃について

    こんにちは 以下は、バッファオーバーフロー攻撃の引用です まず攻撃の第一段階として、ターゲットの環境上で脆弱性を発動させる必要があります。 具体的には、脆弱性を含むプログラム箇所まで処理を進めさせる。 次に、脆弱性の原因となっているバッファを処理するコード部分に、バッファを溢れさせるためのデータを渡す という記事を読んだのですが、どうやって「ターゲットの環境上で」処理するのでしょうか どうやって「プログラム箇所まで処理を進めさせる」のでしょうか どうやって「データを渡す」のでしょうか つまり、どんなコードを書くのでしょうか C 言語でお願いします プログラマーではないのでピンとこないのです よろしくお願いします

  • DirectX シェーダプログラムについて

    今、個人的にゲームを製作するため「DirectX シェーダプログラミング 仕組みからわかるゲームエフェクトテクニック」という本を用いて勉強しています。ここでサンプルプログラムをデバックしてみると 「0x013c230b でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000000 を読み込み中にアクセス違反が発生しました。」 という警告がでて失敗します。ここでの問題はプログラムが // シェーダプログラムへテクニックへのハンドルの取得 m_hTech = m_pFX->GetTechniqueByName("BasicTech"); // シェーダープログラムのグローバル変数のハンドルの取得 m_hWvp = m_pFX->GetParameterByName(0, "g_wvp"); m_hColor = m_pFX->GetParameterByName(0, "g_color"); 上記にさしかかると警告がでてきます。どうやら「m_hTech]、「m_hWvp」、「m_hColor」が問題あるようです。ここでこれを宣言しているヘッダーファイルを下記に表記します。 void Destroy(); private: D3DXMATRIX m_proj; // プロジェクション行列 D3DXMATRIX m_view; // ビューイング行列 // 頂点データ構造体 struct MY_VERTEX_POS{ D3DXVECTOR3 p; // 位置 }; // 頂点デクラレーション LPDIRECT3DVERTEXDECLARATION9 m_pVertexDecl; // 頂点バッファへのポインタ LPDIRECT3DVERTEXBUFFER9 m_pVB_POS; // エフェクト LPD3DXEFFECT m_pFX; // テクニックへのハンドル D3DXHANDLE m_hTech; // シェーダプログラムのグローバル変数へのハンドル D3DXHANDLE     m_hWvp; D3DXHANDLE        m_hColor; }; #endif // _Scene_h_ ここで、なぜハンドルが取得できないのか教えていただけると幸いです。 よろしくおねがいします。

  • 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を呼び出しているとは思えませんが…)

  • 大きいサイズの画面の更新とキーカラー付の画像表示

    SXGAとかUXGAぐらいの大きいサイズの画面で、背景の前をキャラクターが動き回るプログラムを作ろうとしています。キャラクターはキーカラーをつけてスプライトのように、 1背景をバックバッファに転送 2キャラクターをキーカラーを抜きつつ転送 3バックバッファを描画 という風に処理しています。 この場合、バックバッファを描画するときが結局大きい画像を転送することになるので処理が遅くなってしまいます。 質問したいことは、このやり方が正しいかということで、ゲームとかで大きいサイズの画面を扱う一般的な方法をご存知でしたらアドバイスをお願いします。 あと追加で、DirectGraphicsを使っているのですが、IDirect3DTexture9とかだと読み込める画像のサイズが正方形で2の累乗になってしまうと思うのですが、320x240とかの変形のサイズの画像をキーカラー付で描画できる方法をご存知でしたら教えていただけるとありがたいです。

  • データ転送の違い

    データ転送 プログラム転送 バッファ転送 DMA転送 以上のうち、バッファ転送はCPUを介さずに直接データをやりとりすることでCPUの負担を減らす転送、 バッファ転送は処理速度や転送速度を補うための一時的に保存する領域からの転送だと認知しておりますが、プログラム転送はそれらとはどのような違いがあるのでしょうか? これらの違いをお願い致します。

  • OracleからSQLServer 2008へのデータのインポート

    Oracleからデータを取得し、SQL Server 2008へデータをインポートした際に、下記のエラーが発生します。これはどういう状態でしょうか? データ長がオーバーしているという事はないはずですので、何か別の問題がおきているのかと思われますが。。 どなたか是非、ご教授お願い致します。 メッセージ エラー 0xc02020c5: データ フロー タスク 1: 列 "xxxxxxxxx" (41) を列 "xxxxxxxxx" (485) に変換しているときに、データ変換に失敗しました。この変換により、状態値 4 と状態を示すテキスト "テキストが切り捨てられたか、または対象になるコード ページで 1 つ以上の文字が一致しませんでした。" が返されました。 (SQL Server インポートおよびエクスポート ウィザード) エラー 0xc020902a: データ フロー タスク 1: "出力列 "xxxxxxxxx" (485)" が切り捨ての発生により失敗しました。"出力列 "xxxxxxxxx" (485)" の切り捨て行の処理により、切り捨てによる失敗が示されます。ここに示されたコンポーネントのオブジェクトで切り捨てエラーが発生しました。 (SQL Server インポートおよびエクスポート ウィザード) エラー 0xc0047022: データ フロー タスク 1: SSIS エラー コード DTS_E_PROCESSINPUTFAILED。入力 "データ変換の入力" (446) の処理中に、コンポーネント "データ変換 0 - 0" (445) の ProcessInput メソッドがエラー コード 0xC020902A で失敗しました。このコンポーネントは、ProcessInput メソッドからエラーを返しました。このエラーはコンポーネントに固有のものですが、致命的なエラーであるため、データ フロー タスクの実行は停止されます。このエラーの前に、エラーの詳細が記載されたエラー メッセージが報告されている可能性があります。 (SQL Server インポートおよびエクスポート ウィザード) エラー 0xc02020c4: データ フロー タスク 1: エラー コード 0xC0047020 により、データ フロー タスク バッファに行を追加できませんでした。 (SQL Server インポートおよびエクスポート ウィザード) エラー 0xc0047038: データ フロー タスク 1: SSIS エラー コード DTS_E_PRIMEOUTPUTFAILED。コンポーネント "変換元 - xxxxxxxxx" (1) の PrimeOutput メソッドからエラー コード 0xC02020C4 が返されました。パイプライン エンジンが PrimeOutput() を呼び出したときに、このコンポーネントからエラー コードが返されました。このエラー コードの意味はコンポーネントで定義されていますが、これは致命的なエラーであるため、パイプラインの実行は停止されました。このエラーの前に、エラーの詳細が記載されたエラー メッセージが報告されている可能性があります。 (SQL Server インポートおよびエクスポート ウィザード)

  • 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   {       /* アップデート処理や描画処理など */   } } */ わかりづらいかと思いますが、よろしくお願いします。

  • CSVファイルのデータをDBに取り込みたい。

    お世話になります。 現在、日本郵便が提供している「郵便番号データダウンロード」を利用して、全国の郵便番号をダウンロードして、SQL Serverのデータベースに新しくテーブルとして追加しようとしています。 しかし、データをインポートしようとすると必ずエラーが起こってしまい・・・同じようなエラー解決法をネットで探したのですが、現在起こっているエラーの解決法と違う?もしくは私が理解していないだけかもしれないのですが、もし解決法がお分かりになれば、噛み砕いてご教授願えればと思います。 以下環境およびエラー文章です。 開発環境:SQL Server2005 動作環境:Windows XP 「フラットファイルソース」からダウンロードしてきたCSVファイルを取り込み、先頭データ行を列名とし「SQL Native Client」のサーバに変換しようとしてエラーが出ました。 - 実行しています (エラー) メッセージ エラー 0xc02020a1: データ フロー タスク: データ変換に失敗しました。列 "ChoName" のデータ変換から、状態値 4 と状態を示すテキスト "テキストが切り捨てられたか、または対象になるコード ページで 1 つ以上の文字が一致しませんでした。" が返されました。 (SQL Server インポートおよびエクスポート ウィザード) エラー 0xc020902a: データ フロー タスク: "出力列 "ChoName" (34)" が切り捨ての発生により失敗しました。"出力列 "ChoName" (34)" の切り捨て行の処理により、切り捨てによる失敗が示されます。ここに示されたコンポーネントのオブジェクトで切り捨てエラーが発生しました。 (SQL Server インポートおよびエクスポート ウィザード) エラー 0xc0202092: データ フロー タスク: データ行 2050 で、ファイル "C:\Documents and Settings\Administrator\デスクトップ\加山\住所\ken_all\KEN_ALL.CSV" の処理中にエラーが発生しました。 (SQL Server インポートおよびエクスポート ウィザード) エラー 0xc0047038: データ フロー タスク: コンポーネント "変換元 - KEN_ALL_CSV" (1) の PrimeOutput メソッドからエラー コード 0xC0202092 が返されました。パイプライン エンジンが PrimeOutput() を呼び出したときに、このコンポーネントからエラー コードが返されました。このエラー コードの詳細はコンポーネントで定義されていますが、これは致命的なエラーであり、パイプラインの実行は停止されました。 (SQL Server インポートおよびエクスポート ウィザード) エラー 0xc0047021: データ フロー タスク: エラー コード 0xC0047038 により、スレッド "SourceThread0" は終了しました。 (SQL Server インポートおよびエクスポート ウィザード) エラー 0xc0047039: データ フロー タスク: スレッド "WorkThread0" はシャットダウンの通知を受け取ったので終了処理中です。ユーザーがシャットダウンを要求したか、別のスレッド内のエラーが原因でパイプラインがシャットダウンされています。 (SQL Server インポートおよびエクスポート ウィザード) エラー 0xc0047021: データ フロー タスク: エラー コード 0xC0047039 により、スレッド "WorkThread0" は終了しました。 (SQL Server インポートおよびエクスポート ウィザード) よろしくお願いします。

  • 画像ボードのバッファにある画像をOpenCVで処理する方法を教えてください

    カメラの画像をグラフインというメーカーの画像ボードを介してPCに取り込んでいます。 ここでその画像をOpenCVを使用して処理しようとしています。 一度保存した画像を処理するのはできるのですが、 画像ボードのバッファからデータを読み込んできてきて処理する方法が分からず困ってます。 Iplimageという構造体にデータを入れればよさそうなのですが、 その変換のやり方がわかりません。 開発環境はWindowsXP visual C++ 2005 MFC です。 当方、プログラムを始めたばかりなので できれば詳しく教えて頂けると助かります。 よろしくお願いいたします。

専門家に質問してみよう