問題タブ [directx-9]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1495 参照

c++ - BITMAPINFOHEADER 画像データを IDirect3DTexture9 に書き込む

私は DX9 レンダラーを作成しており、現在 AVI ムービー ファイルを再生する機能に取り組んでいます。パックされた DIB を返すを使用して、指定されたフレームを取得できました。AVIStreamGetFrame()そこから、そのビットマップ データを既存の にコピーできるようにしたいと考えていIDirect3DTexture9 *ます。

私の問題は、ビットマップ ファイル形式を理解していないことと、 から指定されたピクセル データを解釈可能なBITMAPINFOHEADER形式に変換する方法を知らないことです。IDirect3DTexture9

まず、DX9 テクスチャを次のように作成します。

ここにある質問は、上記のコメントとしてリストされています。BITMAPINFO を取得すると、たとえば bmpInfo.bmiHeader.biBitCount = 8 (または 16 など) と表示されます。これは、それに応じて D3DFMT_* を変更する必要があることを意味しますか?

後で、LPBITMAPINFOHEADERレンダリングしたいフレームの を取得するとpBits、関数から返されたものをどうするか迷ってしまいIDirect3DTexture9::LockRect()ます。これが私がこれまでに持っているものです:

私が見たことのない、私のためにこれを行う API 呼び出しはありますか? または、これよりも簡単な方法を知っている人はいますか? 読んでくれて/助けてくれてありがとう。

0 投票する
3 に答える
5875 参照

delphi - D3D9フック-Direct3D9とのオーバーレイ

OK、それで私はDirectXゲームのいくつかの余分なボタンのためにいくつかのオーバーレイをしようとしています。

ここで非常にうまくオーバーレイするc++サンプルを見つけました:http://www.gamedev.net/topic/359794-c-direct3d-hooking-sample/

それで私はそれをDelphiに変換し始めました。いくつかのログを記録すると、正しいプロセスでフックが開始され、Direct3DCreate9()が正しくフックされていることがわかります。

次に、TMyDirect3D9が正常に作成されます。しかし、プロセスはここからクラッシュします。

MyDirect3D9をフックされたDirect3DCreate9()を介して元のプロセスに戻し、クラス(インターフェイス)関数の1つを呼び出そうとすると、失敗するという私の知識に基づく推測(Ollydbgでのデバッグに基づく)。

コードは次のとおりです。私が私に知らせるのを助けるために他の情報を与えることができるならば。

メインDLL:

カスタムIDirect3D9:

更新: つまり、Delphiインターフェイスは実際のインターフェイスとは異なる動作をするように見えるためです(Delphiには、他のインターフェイスと正常に通信するための中間があります)。そのため、インターフェイスをポインタの配列に変換しました。

これで、プログラムはCreateDevice()を正常に呼び出します。これは、ログとOllydbgのステップスルーの両方で確認できます。

ここで、CreateDeviceが元のIDirect3D9.CreateDevice()を呼び出すと、再びクラッシュします。Ollydbgでデバッグすると、ポインターの間接参照が多すぎることに気付きます。

更新2: わかりました。さまざまな場所でのPIDirect3D9とIDirect3D9のポインターの問題を修正しました。したがって、元のIDirect3D9.CreateDevice()が呼び出されます。しかし、それはD3DERR_INVALIDCALLでエラーになります!!

とても紛らわしい。

更新3: わかりました。さらにデバッグを行うと、関数を呼び出すと、追加のパラメーターがスタックにプッシュされるようです。これにより、最初のパラメータが無効になります。これは、iAdapterパラメーターが無効(最初のパラメーター)であると言うDirectXデバッグによってさらに証明されます。

更新4: IntRefToMethPtr()を使用して、元のCreateDevice呼び出しへの直接ポインターを取得することで、同じスタックで呼び出すことができました。同じ結果。Delphiに接続しようとして、間違ったルートをたどったようです。

更新5: フッキングメソッドを書き直しました。今、私は本質的にEndScene()をフックしています。フックは、テストプログラム(この投稿の最初のURLにあるフックデモに付属のVertices.exe)で正常に動作するようになりました。しかし、メインゲームではゲームがクラッシュします。いずれにせよ、私はたくさんのことを学びました。

0 投票する
1 に答える
1066 参照

directx - (DirectX9)ブレンド後のsRGB変換

最近、このブログ投稿に出くわしました。ガンマ補正に関するさらに別の投稿で、 D3DPMISCCAPS_POSTBLENDSRGBCONVERT機能フラグの可用性を教えてくれました。

これにより、DirectX9でブレンドした後の適切なsRGB変換が可能になります。

私が理解していないのはそれをどうするかです。デバイスDirect3D9Exデバイスにこの機能を問い合わせることはできますが、サポートされている場合はどうすれば有効にできますか?ブレンディング前とブレンディング後の変換を選択できますか?はいの場合、どのように?

助けてくれてありがとう!

0 投票する
2 に答える
1053 参照

directx - directX の #greyscale レンダー ターゲットの形式は何ですか?

次の形式で通常のアダプターを作成する directx9 ゲーム エンジンがあります: D3DFMT_X8R8G8B8 一部のオブジェクトをオフスクリーン レンダー ターゲットにライトマップとしてレンダリングするシステムがあります。次に、そのライトマップ データを使用してバック バッファーに合成し、フル スクリーンの「マスク」として機能させ、暗いシーンで松明やその他の光源の効果を得ることができるようにします。すべてがうまく機能します。問題は、大きな解像度の大きなオフスクリーン ライトマップ レンダー ターゲットがそれぞれ 16 MB であり、実際にはそれらから 8 ビットのデータ (グレースケール) しか必要としないため、32 ビット レンダー ターゲット メモリの 75% が無駄。(私は低スペックのカードをターゲットにしています)。レンダー ターゲットを D3DFMT_A8 として作成しようとしましたが、directx はサイレントに失敗し (CheckDeviceFormat() を追加すると発生することがわかります)、とにかく 32 ビットを作成します。

助けてくれてありがとう、私はレンダーターゲット関連のものが苦手です:)

0 投票する
2 に答える
2257 参照

directx - (DirectX9) 暗黙的に適用されるガンマ補正

アップデート:

皆様、ご回答誠にありがとうございました。Jesse Hall が示唆したように、ドライバー (またはハードウェア) の問題のようです。他の構成で同じアプリを試したところ、期待どおりに機能しました。

同じ GPU (ATI 4800 HD) を共有しているがドライバーのバージョンが異なる他のコンピューターでアプリをテストしたところ、それらはすべて同じ誤った動作を示しました (書き込み時の二重ガンマ補正のようです)。これらのコンピューターでは、D3DRS_SRGBWRITEENABLE を false に設定して表示を修正する必要がある場合。これがこのハードウェアの既知のバグかどうかは誰にもわかりませんか?

さらに奇妙なのは、これら 2 つの構成で同じ最終結果が得られることです。

  • D3DRS_SRGBWRITEENABLE = FALSE および D3DSAMP_SRGBTEXTURE を TRUE に設定
  • D3DRS_SRGBWRITEENABLE = FALSE および D3DSAMP_SRGBTEXTURE を FALSE に設定

ピクセル デバッガーでは、ケース 1 で線形化が適切に適用されていることがわかりますが、(自動) 書き込み時の修正により、ケース 2 と同じ出力が得られます (変換はまったく実行されません)...

// -- 更新の終わり

DirectX9 アプリケーションのガンマ補正を修正するのに問題があります。

サンプラー (D3DSAMP_SRGBTEXTURE) でテクスチャの線形化を有効にし、出力用の sRGB 書き込み (D3DRS_SRGBWRITEENABLE) を有効にすると、ガンマ補正が 2 回適用されているように見えます。

これが私のセットアップです。次のテクスチャ (ここから) を使用して、フルスクリーンのクワッドを描画しました。 ここに画像の説明を入力

結果は、写真の右側で視覚的に明るすぎました。PIX を使用してこれらの灰色のピクセルの 1 つをデバッグしました。すべてが適切に設定されていれば、出力値は 0.73 (=0.5^(1.0/2.2)) になると予想していました。残念ながら、ピクセル シェーダーの出力は 0.871 でした (ガンマ補正が 2 回適用されたように見えますか?)。デバッガーを使用してピクセル シェーダーに足を踏み入れたところ、テクスチャ フェッチで (0.491, 0.491, 0.491) の値が返されました。これは、読み取り時の線形化が正しく機能していることを意味します。

ここに画像の説明を入力

D3DRS_SRGBWRITEENABLE を無効にすると、ピクセル シェーダーの出力は 0.729 になり、より正確に見えます。

ここに画像の説明を入力 ここに画像の説明を入力

この変換はどこから来たのですか (デバッガーでは、ピクセル シェーダーの出力は 0.491 でした)。他にどのようなフラグ/レンダリング ステートを確認する必要がありますか?

ご助力ありがとうございます!

0 投票する
2 に答える
3243 参照

performance - DirectX9-スプライトを効率的に描画する

私はプラットフォーマーゲームを作成しようとしています。さまざまなスプライトブロックを取り、それらをつなぎ合わせてレベルを描画しています。これには、フレームごとに画面上に多数のスプライトを描画する必要があります。優れたコンピューターは、すべてのスプライトの描画を問題なく処理できますが、古いコンピューターのパフォーマンスに影響を及ぼし始めます。これは大きなゲームではないので、ほとんどすべてのコンピューターで実行できるようにしたいと思います。現在、次のDirectX関数を使用してスプライトを描画しています。

これらの絵を画面に描くためのより効率的な方法はありますか?それほど複雑でない画像ファイル(現在は通常のpngを使用しています)を使用して処理を高速化する方法はありますか?

要約すると、DirectXでスプライトを描画するための最もパフォーマンスに優しい方法は何ですか?ありがとう!

0 投票する
1 に答える
1155 参照

c++ - DirectX 9 の「未解決の外部シンボル」の問題

数日間 DirectX の学習に取り組んでいましたが、問題が発生しました。私は本の例に従っており、発生したいくつかの厄介な問題を解決しましたが、最近の問題を解決できませんでした。コンパイラは、コンパイルしようとするたびに、未解決の外部シンボルがあると述べています。以下、エラーコードです。

私は実行しています: [コンパイラ: Visual Studios 2008] [オペレーティング システム: Windows 7 64 ビット プロフェッショナル]

ここにコードのサンプルと、それが行われているように見える場所があります。(十分な情報を提供できたと思います)

d3d9.lib と d3dx9.lib の両方を自分のプロジェクトにリンクし、知っているすべての必要なヘッダー ファイル (d3d9.h、d3dx9.h) を含めました。どんな助けでも大歓迎です!前もって感謝します!!!

0 投票する
1 に答える
255 参照

volume - C++でDShow.hとstrmiids.libを使用してサウンドクリップの音量をリアルタイムで調整する方法

C ++プログラムでサウンドクリップが再生される音量をリアルタイムで設定する方法を理解しようとしています。たとえば、2つのオブジェクトが互いに近づくにつれて音量を上げるなどの方法を試しています。現在、「DShow.h」と「strmiids.lib」を使用しており、次のデータメンバーポインターによって提供されるインターフェイスを使用しています。

これらが提供するインターフェースを使用して、再生中のメディアストリームの音量を変更する方法はありますか?

0 投票する
1 に答える
836 参照

vb.net - DirectX AudioVideoPlayback とデバイスの選択および/またはパン

現在、VS2010、DirectX 9、Winforms、.Net 3.5、VB を使用しています。

サウンド カードの左右のチャネルを介して MP3 ファイルを再生するアプリケーションを作成しています。また、トリガーされたときに、センター/リアチャンネルを介して別の MP3 ファイルを再生する必要があります。現在、DirectX Audio クラスを使用して MP3 ファイルを再生していますが、各サウンド ストリームの送信先のデバイスまたはチャネルを選択する方法がわかりません。

OpenTK や BASS.Net などのいくつかのライブラリを見てきました。BASS.Net は有望に思えますが、可能であればライセンス料を回避する必要があります。

ありがとう。

0 投票する
1 に答える
550 参照

directx - directx 9 の固定機能パイプラインで setvertexdeclaration を使用する

独自の頂点構造を使用し、頂点を頂点バッファーにアップロードし (FVF コードを使用せずにインデックス バッファーにインデックスを挿入)、頂点宣言とストリーム ソースをセットアップして使用し、固定シェーダーで DrawIndexedPrimitive を使用してそれらを描画しようとしています (ただし、 FVF)。

directx 9 SetVertexDeclaration を使用するには、独自のシェーダーを作成する必要がありますか? SetVertexDeclaration と fixed-pipeline でカスタマイズされた頂点構造を使用できますか? 可能であれば、固定パイプラインと頂点宣言に制限はありますか?

カスタマイズされた頂点構造: