問題タブ [direct3d10]
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.
bitmap - Direct3D バックバッファにビットマップをより効率的に描画する方法は?
私の知る限り、Direct3D 10 では、バック バッファーにビットマップを描画する方法が 2 つあります。
- バックバッファの表面をロックし、ビットマップを表面にコピーし、表面のロックを解除します。
- テクスチャをロックし、ビットマップをテクスチャにコピーし、テクスチャのロックを解除して、テクスチャをすべてのレンダリング ステージに通し、最終的にバック バッファに到達させます。
これで、ビットマップ アニメーションができました。つまり、各ビットマップは 1 回だけ表示されます。どちらの方法でも、ビットマップは GPU に送信され、破棄されます。最初の方法の方が速いようですが、よくわかりません。そして最悪なことに、今は自分でテストできません...
interop - マルチサンプリングとDirect3D10/D3DImage相互運用
Direct3D 10(SlimDX)とWPFを使用してレンダーエンジンを実装しようとしています。
適切なMultiSampleパラメーターを使用してデバイスとrendertargetviewを作成します(1,0 / 2,0および4,0が機能しています)
次に、D3DImageの共有テクスチャを作成しようとしているときに問題が発生しました...
..。
..。
私は何かが欠けていますか?
direct3d - D3D11 ectで固定関数ブレンディング操作を引き続き使用するのはなぜですか?
新しい3DAPI(D3D11など)で固定関数ブレンディングモードをまだ使用している理由を理解しようとして、私は座礁していました。D3D10では、シェーダーを使用するために、固定機能のAlphaClippingが削除されました。理由は、ほとんどすべての状況に対してはるかに強力なアプローチだからです。
では、なぜブレンド操作(現在レンダリングしているRenderTargetからのテクスチャサンプル)を計算または所有できないのでしょうか?ビデオカードパイプラインに、これを実現するのを困難にするハードウェア設計の問題がありますか?
これが役立つ理由は、屈折オブジェクトオーバーレイごとに2つのrenderTarget間を行き来する必要がないため、屈折シェーダーをより高速に実行できるようにすることができるためです。OSまたはゲームUI用の屈折ウィンドウシステムなど。
D3D12でこれを見たいので、これはディスカッションフォーラムではないので、このようなアイデアを提案するのに最適な場所はどこでしょうか。または、これはD3D11ですでに可能ですか?
nvidia - d3d10 での NvAPI_Stereo_SetDriverMode の nvapi の使用
現在、関数 NvAPI_Stereo_SetDriverMode を使用して、nvapi をダイレクト モードで動作するように設定しようとしています。
Nvidia nvapiサイト(マニュアル内) によると、direct3d 実装を作成する場合は、nvpai を初期化し、ダイレクト モードを設定し、デバイス (d3d10device) を作成し、ステレオ ハンドルを作成する必要があります ... (続き)プログラム)。
試してみましたが、関数 NvAPI_Stereo_SetActiveEye (メッシュをどの目にレンダリングするかを指示します) は、モードがダイレクト モードではないと言います。
ヘッダー ファイルを調べたところ、ハンドルを作成した後にモードを呼び出す必要があることがわかりました。しかし、私がそれを行ったとき、それは NVAPI_INVALID_ARGUMENT を返しました (また、アクティブな目を設定することはできません)。
誰かが同じ問題に遭遇しましたか?
Web で nvapi の例を見ようとしましたが、それは新しく、nvidia 開発者ゾーンがダウンしているようです (技術的な問題が原因で)。
directx - DWM を無効にしたウィンドウ モードでの Direct3D 10 vsync の問題
DWM を無効にしたウィンドウ モードの Direct3D 10 で vsync に問題があります。
出力をレンダリングして表示するアプリケーションがあります。ウィンドウ モードで動作する必要があり、最低 60 fps の安定した速度を生成する必要があります。アプリケーションの 1 つのバージョンは Direct3D 9 を使用し、別のバージョンの Direct3D 10 を使用しています。ウィンドウ モードで作業しているとき、時々 fps が減少します (これは「安定した」減少ではありません。ほとんどの場合、安定した 60 fps を生成していますが、突然減少することがあります)。数秒後に 60 fps に戻ります)。アプリケーションの両方のバージョンで、fps の減少は ~10 ~ 20 fps です。それは受け入れられません。
Windows Vista と Windows 7 には、「デスクトップ コンポジション」と呼ばれる新しいグラフィック システムがあり、アプリケーションが画面にピクセルを表示する方法を変更しました。デスクトップの構成は、デスクトップ ウィンドウ マネージャー (DWM) によって実行されます。DWM が有効になっている場合、アプリケーションは、DWM によってレンダリングされ、しばらくしてディスプレイに表示されるよりも、ビデオ メモリ内のオフスクリーン サーフェスに描画されます。そのため、タスク マネージャーの dwm.exe が何もしない場合 (処理時間が ~0% の場合)、fps が低下し、dwm.exe の処理時間が 1 ~ 3% かかる場合、安定した 60 fps であることに気付きました。わかった。
私たちはそれに影響を与えることはできません。したがって、高い安定した fps を得るには、DWM をオフにする必要があります。オフにすると、すべて問題ありません。アプリケーションの両方のバージョンで安定した 60 fps があります。ただし、DWM はウィンドウ モードで vsync を実行するため、それをオフにすると、自分で vsync を実行する必要があります。
しかし、DWM をオフにすると、ウィンドウ モードの Direct3D 10 で vsync に問題が発生します。モニターの上部に画像の破れがあります。Direc3D 9 は引き続き正常に動作します。
そのため、60 Hz のリフレッシュ レートのモニターがあります。
スワップチェーンの作成中に、次のようなパラメーターを設定します。
プレゼンテーション中に、vsync をオンにするフラグを設定します。
そして、次の vsync 問題があります。左側から右側に高速で移動する垂直線があります。また、モニターの上部に画像の破れがあります。
http://bit.ly/POQoFq
私たちは最初、何か間違ったことをしていると思います。そこでマイクロソフトのサンプル「Tutorial 07: Texture Mapping and Constant Buffers」を回転立方体でインストールしました。立方体を大きくし、より高く配置し、回転を速くしましたが、同じ問題が発生しました (写真を参照)。
http://bit.ly/SevNqw
http://bit.ly/RSoEhc
http://bit.ly/UjaNPu
したがって、フルスクリーン モードの Direct3D 10 ではすべて問題ありません。垂直同期は完全に機能します。Direct3D 9 でも問題ありません。DWM を無効または有効にしても、vsync は適切に機能します。DWM を無効にしたウィンドウ モードの Direct3D 10 では、問題があります。
さまざまなコンピューター、さまざまなビデオカード (Nvidia 8600 GT、Nvidia 9500 GT、ATI Radeon HD 5870 Eyefinity 6)、さまざまなバージョンのドライバーでテストされました。問題が安定して再現されました。Windows 7を使用しています。
では、なぜこのような問題が生じるのでしょうか。それを解決する方法と次に何をすべきか?
UPD1。上の画像が利用できない場合は、いくつかのミラーがあります。
https://dl.dropbox.com/u/20468014/DSC_2287.JPG
https://dl.dropbox.com/u/20468014/DSC_2308.JPG
https://dl.dropbox.com/u/20468014/DSC_2313. JPG
https://dl.dropbox.com/u/20468014/DSC_2319.JPG
UDP2. タイトルバーを非表示にするために、フラグ WS_POPUP を使用してウィンドウを作成していることにも注意してください (非表示にする必要があります)。画像のティアリングがさまざまな場所で発生します。常に画面の上部に表示されますが、20 ピクセルでも 50 ピクセルでもかまいません。そのため、タイトル バー付きのウィンドウを作成しているときに、画像の上部に画像のティアリングが表示されないことがあります。
c++ - D3DX10CreateEffectFromFile が別のコンピューターで E_FAIL を返す
モデルをロードして、照明などを使わずに表示する小さなアプリケーションがあります。リリースをビルドして別のコンピューターで実行しようとしましたが、D3DX10CreateEffectFromFile が E_FAIL を返し続けます。
エフェクト ファイルは完全にコンパイルされ、私の開発マシンでは完全に動作しますが、他の PC では動作しません。PCのスペックはそこまで変わらない。どちらも Windows7 で、どちらも GeForce グラフィックス カードを搭載しています。唯一の実際の違いは、リリースを実行しようとしているコンピューターに DirectX 11 互換のグラフィックス カードがあることです。
私のリリースビルドのフォルダーは次のようになります...
G:\ModelLoader
d3dx10_43.dll
ModelViewer.exe
シンプル.fx
test.txt (モデル ファイル)
これは私の開発マシンで完全に正常に動作します (ほとんどのコードをコメントアウトしたので、ウィンドウを開き、initD3D10 を開き、エフェクトを試してロードするだけです)。他のPCでは、すべて正常に動作します...
シェーダーにエラーが含まれているとは思わないため、開発用 PC で適切にコンパイルされます。
L"simple.fx" は、std::ifstream を使用して読み取ることができるため、適切なファイルパスでもあります。数時間検索しましたが、答えが見つかりませんでした。関連するすべての質問は、開発マシンで正しくコンパイルされるエフェクト ファイルのエラーであることが判明しました。
エフェクト ファイルにエラーを追加して開発マシンで実行すると、メッセージ ボックスにエラーが表示されます。他のPCで同じエラーコードを実行すると、エラーは出力されず、l_pBlob_Errors == 0
それはおそらく本当に初心者で簡単なことですが、何が起こっているのか理解できません。どんな助けでも大歓迎です
mozilla - Mozilla NPAPI AsyncDrawing での NPDrawingModelAsyncBitmapSurface の使用は何ですか?
Mozilla は、NPAPI プラグインでハードウェア アクセラレーションによるレンダリングを可能にするAsyncDrawing API を公開しています。
NPDrawingModelAsyncWindowsSharedSurfaceモードには Vista 以降が必要ですが、
NPDrawingModelAsyncBitmapSurfaceはWindows XP でも動作します。
しかし、サンプル コードの drawAsyncBitmapColor 関数では
、プラグインは memcpy を使用し、ピクセルをループしてビットマップを描画します。
高価なコピーは GPU ではなく CPU で行う必要があるということですか?
NPDrawingModelAsyncBitmapSurface ではハードウェア アクセラレーションを利用できないということですか?
ありがとう
multithreading - 既存の Direct2D ベースのライブラリを作り直して、複数のスレッドから同時にアクセスできるようにするにはどうすればよいですか?
Direct2D を使用する実装の 1 つ、既存のグラフィックス ライブラリを使用しています。(GDI+、Quartz なども使用できます。) Direct2D オブジェクトのラッパー コードとしてすべて実装されたビットマップ オブジェクト、ペン、ブラシなどがあります。ライブラリはクローズド ソースであり、残念ながらここにその大部分を掲載することはおそらくできません。
複数のスレッドを使用する場合 (1 つのスレッド プロデューサーがビットマップを作成してそれらに描画し、1 つのスレッド コンシューマーが画面上に描画する場合)、プロデューサー スレッドが生成するビットマップが完全に空白になることがあります。画像データ (内部的にはテクスチャ) はすべてゼロです。 . (ビットマップはテクスチャのラッパー オブジェクトですが、GDI+ ビットマップ オブジェクトのようにビットマップを表すと、おそらく GDI+ ビットマップ オブジェクトを思い浮かべるかもしれません。一般的なパラダイムに精通していると思います。)決してクラッシュしないことに注意してください。静かに失敗します。典型的な症状は、ビットマップ データへの描画Unmap
、バッファーからテクスチャへのコピーの呼び出し、後で描画しようとしたときにテクスチャが空白であることが判明することです。
私が考えていることは次のとおりです。
- 私のプロデューサ スレッドが行っているように、ピクセル データに直接書き込むために、ライブラリは、ピクセル データに直接アクセスする機能を提供
Map
します。Unmap
「共有デバイス」と呼ばれる DirectX10 デバイスが 1 つあり、これを使用してCopyResourceを呼び出し、内部テクスチャからバッファにコピーします。バッファは自由に書き込むことができます。次に、逆方向にコピーをアンマップします。時々これは静かに失敗すると思います。 - 共有デバイスのこのアプローチは、ライブラリ全体で使用されてい
ID2D1RenderTarget
ます。共有ビットマップ ( ) を作成するために使用される共有レンダー ターゲット ( )ID2D1Bitmap
などがあります。このアプローチは、もちろん、グラフィックス/ビットマップ オブジェクトが独自のテクスチャを持っているように見えますが、すべてそれらに対する操作は、1 つのデバイス、1 つのレンダー ターゲットなどで行われます。 - 複数のスレッドが同時に「ビットマップ」を使用すると、いくつかの操作が失敗する可能性があり
CopyResource
ます。また、静かに失敗します。void
HRESULT
ID2D1RenderTarget::DrawBitmap
そのため、問題を解決し、プロデューサー/コンシューマー スレッド システムを確実に実現できる十分なスレッド セーフをライブラリにハックしたいと考えています。どうすればいいですか?
私は、複数のスレッドから Direct2D を使用する正しい方法について多くのことを読んできました。
すべてのファクトリは
D2D1_FACTORY_TYPE_MULTI_THREADED
フラグですでに作成されています。factory 経由で同期するための
ID2D1MultiThread
インターフェイスを使用してみました。ただし、これは Windows 7 以降でしか利用できないようです。DirectX10 レベルの Vista+ API を使用する必要があります。また、同期のためにID3D10Multithread インターフェイスを使用してみました。私はこれでいくつかの問題に遭遇しました:
どこで同期する必要があるのか 、または何を同期する必要があるのか わかりません。
Map
アラウンドアンドUnmap
コール、またはMSDN が示すようにアラウンドが必要であるなど、きめ細かいものである場合Present
、同期は効果がありません。上記のメソッド呼び出しは依然として失敗します。それがより粗い場合、ID2D1RenderTarget::BeginDrawを呼び出すときにロックに入り、すべての描画のためにそれを保持し、ID2D1RenderTarget::EndDraw
、ID2D1RenderTarget::Flush
および/またはIDXGISwapChain::Present
が呼び出された後にロックを離れると、見事に機能するようです...数秒後に入力するまでデッドロック。MSDNはこれを説明しています、フルスクリーン スワップ チェーンを使用する場合は、メッセージ ポンプ スレッドがレンダリング スレッドで待機しないように注意してください。たとえば、(レンダリング スレッドから) IDXGISwapChain1::Present1 を呼び出すと、レンダリング スレッドがメッセージ ポンプ スレッドで待機する場合があります。モード変更が発生すると、Present1 が ::SetWindowPos() または ::SetWindowStyle() を呼び出し、これらのメソッドのいずれかが ::SendMessage() を呼び出す場合に、このシナリオが可能になります。このシナリオでは、メッセージ ポンプ スレッドにそれを保護するクリティカル セクションがある場合、またはレンダリング スレッドがブロックされている場合、2 つのスレッドはデッドロックします。-ソース
...しかし、それを回避する方法についてのガイダンスはありません。デッドロックは、2 つのスレッドが同時にグラフィックスにアクセスしようとしていることが原因のようです。たとえば
BeginDraw
、 を同時に呼び出しています。2 番目のロックが動作しているように見えます。ロックが 1 つだけあればデッドロックは発生しないからです。「共有」デバイス、レンダー ターゲットなどのスレッドごとのインスタンスを維持しようとしました。つまり、各タイプのオブジェクトのスレッドごとに 1 つのインスタンスがあり、そのスレッドで実行されるすべてのコードで使用されます。これは、テクスチャを除いてうまく機能します。別のスレッド コンテキストで (別のデバイスによって) 作成されたテクスチャへのアクセスはまったく機能しないようです。この手法をコーディングしているときに、メソッドが失敗する問題によく遭遇しました。最も一般的なのは
CreateSharedBitmap
で失敗するD2DERR_UNSUPPORTED_OPERATION
もので、テクスチャが別のスレッド (つまり、別のデバイス) から取得されたものです。これが重要なビットです。あるスレッドで作成されたテクスチャ) は、別のスレッドで描画できる必要があります。コーディング方法に応じて、スレッドとデバイス、レンダー ターゲットなどの間に 1:1 の関係がある場合とない場合があります。これを解決できれば、コーディングした残りの部分は、必要なことを達成するのに十分に機能すると思います。それは可能ですか?
ID3D10Texture2D
- s の間でsを交差するにはID3D10Device1
? スレッド間で個別のデバイスを用意する必要がありますか?
全体として、私は少し困惑しており、Direct3D 10 と Direct2D に精通している方から、最善のアプローチについてアドバイスを求めています。次の 2 つの実行可能な可能性があると思います。
ID3D10Multithreadインターフェイスのロックを把握します。Google にはあまりありませんし、MSDN のデッドロックを回避するためのアドバイスもあまりありません。
すべてのスレッドが独自のデバイス、共有レンダー ターゲットなどを持つメカニズムを続行します。あるスレッドから別のスレッドにテクスチャ リソースをどのようにクロスさせることができますか? 基本的に、1 つのスレッドで内部的に作成されたテクスチャを使用するラッパー ビットマップ オブジェクトは、2 番目に描画するために使用できる必要があります。
しかし、他の可能性についても聞きたいと思っています。正しい Direct2D スレッド化の実装に関するアドバイスは、非常にありがたいものです。
windows-7-x64 - DirectX11 対応のグラフィック アダプターがあるにもかかわらず、DirectX で D3D_DRIVER_TYPE_HARDWARE を使用できません
WPF プロジェクト (Windows 7、64 ビット、DirectX10 / 11) のレンダリング エンジンに SharpDX を使用したいのですが、サンプルを動作させるのに問題が発生しています。ただし、DirectX 9 のサンプルは使用できます。SlimDX や他の DirectX サンプルでも同様の問題が発生しているため、この問題は SharpDX に直接関係していない可能性があります。
Direct3D 10 / 11 の使用時に機能する DirectX ドライバーの種類は、D3D_DRIVER_TYPE_REFERENCE と D3D_DRIVER_TYPE_WARP のみです。D3D_DRIVER_TYPE_HARDWARE が機能していないようです。これは SharpDX だけに影響するのではなく、C++ サンプルでも RFERENCE ドライバーと WARP ドライバーのどちらかのみを選択できるようにします。
私の理解では、これらのドライバーの種類は単なるソフトウェア ラスタライザーです。これは、directx のインストールが正しく機能していないことを意味します。しかし、エラーは表示されません。最新のドライバーがインストールされており、システムは DirectX 11 ドライバーを報告しており、グラフィックス アダプターは DirectX 11 をサポートしています。
- dxdiag はエラーを報告していません
- dxdiag は、DirectX 11 ドライバーがインストールされていることを確認します
- DirectX 11 をサポートする GT 460 を使用しています。
- システムは Windows 7 (64bit) / VS2013
SharpDX はデバイスを作成できますが、VertexShader が作成されるか、SwapChain がセットアップされるとすぐに、DXGI_NOT_SUPPORTED または E_NOINTERFACE エラーが発生します。
グラフィックス カードを Radeon HD 5450 から Nvidia Geforce GT 460 に交換しましたが、役に立ちませんでした。Sharpdx サンプルは、Windows 7 および Intel オンボード グラフィックスを搭載した別のコンピューターで正常に動作します。ここで何が起こっているのか、誰かが私の考えを教えてもらえますか? DirectX11 対応のグラフィックス アダプターを使用しているにもかかわらず、ワープ ドライバーとリファレンス ドライバーしか使用できないのはなぜですか?
どんな助けでも大歓迎です。このような問題について私がオンラインで見つけた唯一の参考文献は、適切な 3D ドライバーを持たない VM 内で IDE を実行している人でした。