問題タブ [direct3d9]
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.
directx - ID3DXFont で使用されるスケーリング アルゴリズムは何ですか?
ID3DXFont の機能を補完し、テキストをテクスチャにレンダリングしてから、必要に応じて ID3DXSprite.Draw() を実行しようとしています。
古い(直接)方法:
新しい (最適化された) 方法:
テキストは、直接レンダリングする場合はスケーリングに関係なく読みやすくなりますが、テクスチャにレンダリングしてからテクスチャとしてスケーリングすると見苦しくなります。
この画像を参照してください: 1 行目はテクスチャ スケーリングによってレンダリングされ、2 行目は ID3DXFont スケーリングによってレンダリングされます。
二重スケーリングがないことを確認するために、(おそらくスケーリングされていない) テクスチャをファイルに保存しています。実際にはスケーリングされていません (BMP の純粋な $000 および $FFF ピクセルであるため、平滑化は機能していません)。
何か不足していますか?私はいつも、ID3DXFont が同じことを行い、グリフをテクスチャにレンダリングし、Sprite.Draw() でそれらをビューにブリットすると考えていました。では、なぜテキストのスケーリングがこれほど優れているのでしょうか。
c++ - 画面スペースでテクスチャのセクションを並べて表示するにはどうすればよいですか?
これが以前に尋ねられた場合は許してください。私はこれに対する答えを一日中探していました。私が思いついたのは、タイルベースの2Dゲームのヘルプだけです。x〜x
各要素の位置とそれらを拡大または並べて表示するオプションを含むXMLファイルを使用して、Direct3D9でスキナブルGUIを作成しようとしています。ストレッチは簡単な手順ですが、テクスチャの小さなセクションを並べて表示する方法を見つけることができませんでした。従来、テクスチャを並べて表示するには、UV座標を> 1.0に設定していましたが、ソーステクスチャ座標は、テクスチャ全体の小さなサブセット(0.4〜0.5など)にすぎません。
本当に明らかなことを見逃したような気がしますが、ストレッチするのではなく、単にタイリングする方法はありますか?私の推測では、複数のテクスチャ座標のセットがあることと関係がありますが、そこからはどこに行けばよいかわかりません。
プロジェクトは現在、固定関数パイプラインを使用しているので、可能であればそれを使用した回答を希望しますが、それが唯一の方法である場合は、シェーダーを使用した回答を拒否しません。
c++ - glBlendFunc(............) に相当する DirectX
OpenGl でパーティクル システムを作成しましたが、これはうまく機能しています。火やビームなどの燃焼効果を得たい場合 (システムが「光り」、すべての色を融合させる場合)、OpenGL でこのメソッド呼び出しを使用します。
私は今、Direct3Dを使って同じことをしようとしています
これが私が試したことです:
しかし、これは私のゲームの外観にはまったく影響しません! 何が問題なのか、誰にも手がかりがありますか?
c++ - Direct3Dアプリは、Windowsエクスプローラーが実行されている場合は正常に実行され、それ以外の場合はひどく遅くなります。
Direct3D9アプリは、Windowsを完全に起動してから起動すると、完全に機能します。ただし、エクスプローラーが実行されないようにWindowsの起動プロセスを微調整し、Windowsとアプリケーションだけを起動すると、アプリの速度が大幅に低下します。アイドル状態の場合でも、CPU消費量は50%になります(通常は0に近い値です)。
これは、タスクマネージャーを起動し、エクスプローラーを起動してアプリを再起動することで修正できます。しかし、それは受け入れられません。アプリはエクスプローラーなしで実行する必要があります。
これはDirect3Dのものでしょうか?私たちのアプリはフルスクリーンで、Windowsバージョンはすべての最新アップデートを含むXP SP3であり、Direct3Dバージョンは9.0.cです。これがDirect3Dに関連していない場合、どうすればこれをデバッグできますか?
antialiasing - Direct3D出力フィルタリングをオフにするにはどうすればよいですか
画面にビデオ出力をレンダリングするためにDirectX9を使用しています。使用されるライブラリはSlimDXです。
作成されたソフトウェアは、出力デバイスから不良ピクセルをマークするために使用されるため、テクスチャフィルタリング/スムージングが行われないことが重要です。
すべてのテクスチャフィルタリングオプションを無効にし、アンチエイリアシングを無効にし、バックバッファとレンダリングされたテクスチャの間で1:1の比率でテクスチャを画面に揃えました。一部のデバイスでは、DirectXが出力に対して双一次フィルタリング/ブラーを実行しているようです。
-0-フィルタリングを使用して、すべての出力をブロック状にする必要があります。すべてのサイズ変更コードはコントロール自体で操作されるため(バックバッファーのサイズ変更などはありません)、バックバッファーのサイズを変更するオプションはありません。
奇妙なことに、これはすべてではなく、一部のデバイスでのみ発生します。
コントロールへのレンダリングをスムーズにしないようにDirectXに指示するにはどうすればよいですか?(バック/フロントバッファに対して行われるテクスチャフィルタリングを無効にします)
助けてくれてありがとう(:
私が何を取り除こうとしているのかわからない人のために-レンダリングされた画像の解像度が描画された領域の解像度よりも低い場合、Direct3Dはピクセル間のスムーズな遷移を作成します。私が欲しいのは、各ピクセルをフィルタリングなしの単純な長方形として描画することです。この動作を制御する設定はどこにありますか?
direct3d - 表面でのD3D9アルファブレンディング
サードパーティの関数からピクセル(ARGB)をコピーするサーフェス(OffScreenPlainまたはD3DFMT_A8R8G8B8のRenderTarget)があります。ピクセルコピーの前に、ビットはLockRectによってアクセスされます。
このサーフェスは、(D3DFMT_A8R8G8B8)であるバックバッファーへのStretchRectになります。サーフェスとバックバッファは異なる寸法です。フィルタリングはD3DTEXF_NONEに設定されます。
d3dデバイスを作成した直後に、次のRenderState設定を設定しました
しかし、アルファブレンディングは発生していません。アルファがピクセルで指定されていることを確認しました。
頂点バッファーを作成し、アルファブレンディングで表示される三角形(DrawPrimitive)を描画することにより、簡単なテストを行いました。
このテストサーフェスでは、最初にStretchRect、次にDrawPrimitiveがあり、サーフェスコンテンツはアルファブレンディングなしで表示され、三角形はアルファブレンディングありで表示されます。
ここで何が欠けていますか?ありがとう
c++ - win32 スレッドが activeX で予期せず終了する (C++)
ActiveX ビデオ プレーヤーを開発しています。DLL のインプロセス コンポーネントです。Visual Studio 2010 を使用しています。
コンポーネントがロードされたときに一度開始し、Direct3D9オブジェクトとDirect3D9デバイスを作成し、コンポーネントのアンロードで停止してこれらのオブジェクトを破棄する別のスレッドが必要です。TestCooperativeLevel
コンポーネントが実行されている間、必要に応じて、このスレッドが定期的に D3D デバイスを呼び出してリセットするようにしたいと思います。
クライアント アプリケーションはプレーヤーの複数のインスタンスを作成できるため、これを行っていますが、D3D9 オブジェクトとデバイスのインスタンスは 1 つだけにすることを強くお勧めします。
_beginthreadex()
コンストラクターがスレッドを呼び出して開始する静的メソッドとメンバーを持つクラスを宣言しました。
コードの抜粋を次に示します (エラーあり)。
私のコンポーネントは、C# で書かれた WindowsForms フォームに埋め込まれています。
問題は、フォームを閉じると、スレッドが while ループ内で終了し、その後のコードに到達しないことです。からのテキストを見たことがなくOutputDebugString
、release_d3d()
も呼び出されず、メモリ リークに関する d3d デバッグからの多くのメッセージが表示されます。ブレークポイントを設定すると、ヒットすることはありません。
私が見るのはメッセージだけです:
デストラクタにブレークポイントを設定するとヒットしますが、ビデオ メモリ リークに関するメッセージの後に発生します。
Studio で C++ 例外と Win32 例外のデバッグ ブレークも有効にしましたが、いずれもトリガーされませんでした。
アップデート。exit
MSDN で、スレッドのいずれかが、_exit
、またはabort
またはを呼び出し、コンストラクターハンドラーExitProcess
で stting を試行すると、すべてのスレッドが終了することを読みました。atexit
まだ運がありません。release_d3d
ビデオメモリリークに関するメッセージを受け取った後に呼び出されます。さらに、例外エラーが発生しました。
更新 2。
ここに編集されたコードがあります
hook - ゲームプレイ ビデオをキャプチャするための IDirect3DDevice9::EndScene メソッドのフック: 記録されたビデオのテキスト オーバーレイを削除できない
実際、それはさまざまなテクノロジーの組み合わせですが、私の質問に対する答え (私が思うに) は Direct3D 9 に最も近いものです。私は任意の D3D9 アプリケーションに接続しています。ほとんどの場合、それはゲームであり、変更するために独自のコードを挿入しています。 EndScene 関数の動作。バックバッファは、プッシュ ソース DirectShow フィルタのビットマップを指すように設定されたサーフェスにコピーされます。フィルタはビットマップを 25 fps でサンプリングし、ビデオを .avi ファイルにストリーミングします。ゲームの画面全体にテキスト オーバーレイが表示され、ホット キーの組み合わせがゲームプレイ キャプチャを停止することになっていることをユーザーに伝えますが、このオーバーレイは記録されたビデオには表示されません。厄介な事実を除いて、すべてが高速かつ美しく機能します。ランダムな機会に、テキストが過度に含まれるフレームが、記録されたビデオに入り込みます。これは本当に望ましいアーティファクトではありません。エンド ユーザーは自分のゲームプレイをビデオで見たいだけで、他には何も望んでいません。なぜこれが起こっているのかについて誰かがアイデアを共有できるかどうか聞いてみたい. EndScene フックのソース コードは次のとおりです。
delphi - セカンダリ ディスプレイ (ウィンドウ モード) での CPU 使用率が高い
カスタム DirectShow ビデオ レンダラーは Direct3D9 を使用します。プライマリ ディスプレイ/モニターでウィンドウ モード (ディスプレイの表面全体をカバー) で表示すると、CPU 使用率が低くてもパフォーマンスは良好ですが、セカンダリ モニターで表示すると、DirectX が CPU を使用して CPU (カーネル) 使用率が非常に高くなります。デバイス間の転送を行います。これは、Windows XP でのみ発生します。適切なアダプターを使用して Direct3DDevice9 を作成します。少なくとも私はそうだと思います。まず、指定されたウィンドウ ハンドルのモニター ハンドルを取得し、GetAdapterMonitor() を使用して、このモニターに対応する D3D アダプターを検索します。ウィンドウを移動してデバイスを再初期化すると、予想どおり、アダプタが 0 から 1 に変化することがわかります。他にすべきことはありますか?関連するコードは次のとおりです(Delphi)。
他のプレーヤーとレンダラーには、この問題はありません。MPC-HC と madVR にはこの問題がありましたが、修正されました。MPC-HC のコードを見ると、私がやっている方法との大きな違いは見つかりません。
ありがとう!
directx - direct3d 9でテクスチャピクセルからテクセルへの補正を正しく実装するにはどうすればよいですか?
テクセルとピクセルの間の正しいマッピングを取得するために、テクスチャを頂点位置の0.5単位移動する必要性について説明している記事をいくつか読みました。その背後にある理論は理解していると思いますが、ソリューションを実装しようとすると(半分の単位を左に移動)、レンダリングされた画像の反対側に黒い線が表示されるだけです。
正しいxおよびyパラメーターを調整していないか、これが私の特定のシナリオに当てはまらないという印象を受けます。線形フィルタリングでdirect3d9を使用し、画面全体をカバーする画像をレンダリングします。テクスチャの実際のサイズと-1から+1の両方で試しました(つまり、2つのリンクされた記事の異なる解決策による)。どちらのアプローチでも同じ効果が得られます。
私の質問は、この修正が必要なのはいつですか、そして私が見逃しているこれを行う正しい方法はありますか?