問題タブ [direct2d]
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.
winapi - ウィンドウの後ろのぼかしでウィンドウの内容をクリアする(DWM)
を呼び出すウィンドウがありDwmExtendFrameIntoClientArea()
、そのウィンドウは他の子ウィンドウをホストし、Direct2D を使用して子ウィンドウの 1 つをペイントします。黒い領域を持つビットマップが読み込まれると、その領域がぼやけます。子ウィンドウのすべてをクリアして、もう一度ペイントしたいWM_PAINT
のですが、内容をクリアできないようです。
を使用してクリアしようとしました
これにより、子ウィンドウ領域が黒くなり、以前の描画がすべて消去されますが、透明度はなくなります。
クライアント領域上の単なる黒いバーであるビットマップを描画しようとしました
これにより、その前に現れたものはすべて黒くなります。
子ウィンドウ全体に黒い領域をペイントする古い GDI の方法を試してみました。
うまくいきません。
ただし、これを行わずにメイン ウィンドウのサイズを変更しようとすると、正しく機能します。つまり、前の絵が消えます。
ウィンドウを再度描画する前に手動でウィンドウをクリアする API 呼び出しまたは方法はありますか?
visual-c++ - Direct2D を使用してリソースからアルファ チャネルを使用して 32 ビットを描画する
画像を事前に乗算し、メソッドを使用して、いくつかの画像 (アルファ チャネル情報を含む bmp 32 ビット) を表示する従来の MCF アプリケーションがありますCDC::AlphaBlend
。
Direct2D を使用していくつかの新しいグラフィックスを導入したいのですが、すべての画像を png やその他の形式に移行したくありません。
ファイルから bmp 画像を描画できましたが、リソースから画像を取得する際に問題が発生し、表示された画像はアルファ チャネル情報を使用しません。
それで、誰かがこれで私を助けてくれますか?
これは、ビットマップを作成するための私のコードです:
ビットマップを描画するコードは次のとおりです。
c++ - D2Dで画面全体の「安い」スケールを実行するには?
私はタッチ スクリーン アプリケーション (WinRT) に取り組んでおり、現在画面にいくつかのグラフィックを描画しています。タッチなので、コンテンツ全体を拡大縮小するためにピンチ ツー ズームを有効にしたいと考えています。エクスペリエンスを向上させるために、ピンチ ジェスチャが完了したら、グラフィックを再描画したいだけです。中間のスケーリングでは、現在のビットマップを再利用し、(可能であれば) GPU のみのスケーリング (ビットマップの拡大) を実行したいと考えています。基本的に、iOS と Windows Phone が何年も前から行ってきたこととまったく同じことをしたいと考えています。
これを Direct2D で実装するにはどうすればよいですか?
おまけとして、Direct2D での読み取りに適したリソースをご存じでしたら教えてください。MSDN のドキュメントは非常に貧弱で、学ぶためにさまざまなブログや雑誌の記事を探す必要があります :(
私がこれまでに試したこと:
ただし、インタラクティブな要素 (ページのズームイン/ズームアウトなど) に対してこれを行うと、すべてのオブジェクトがレンダリングされます (これも低速です)。もう 1 つのオプションは、BITMAP に描画し、それを変換のベースとして使用することです。ただし、これが良い方法かどうかはわかりません。注: 現在、デスクトップでデバッグしていますが、タブレットをターゲットにしたいと考えています。タブレットは桁違いに遅いことを考慮する必要があります。そのため、この機能を最適化しようとしています。
ありがとう!
direct3d - ID3D10Texture2D スクロール コンテンツ
私は DirectX テクノロジの初心者ユーザーです。
ID3D10Texture2D のコンテンツをスクロールするにはどうすればよいですか? bitblt を使用しています。src と dst hdc が同じである GDI デバイス コンテキストの BitBlt のようなもの。
IDXGISurface の ID3D10Texture2D を持っています。スクロールが私の本当の目標ですが、dxgi API には何も見つかりませんでした。
graphics - ジオメトリパスに沿ったDirect2Dグラデーション
D2Dで、開始/停止ポイントとしてカスタムパスジオメトリを使用するグラデーションブラシを作成する方法はありますか?パスのステップごとに異なるブラシを作成し、それをそのブラシを使用して個別のパスとしてレンダリングするという簡単な方法を実行できますが、パフォーマンスを低下させないものを探しています。
ありがとう!
c++ - Direct2Dを使用してカスタムウィンドウクロームを作成するにはどうすればよいですか?
私はMSDNスタートガイドとAPIリファレンスを見ただけでDirect2Dに非常に慣れていません。メッセージポンプとHWNDで標準のwinAPIC++ GUIモデルを使用する場合は、CreateHwndRenderTarget()しかないようです。
ただし、CreateHwndRenderTarget()はクライアント領域にのみレンダリングします。可能であれば、独自のウィンドウクロームを描画し、タイトルバーにコントロールを配置したいと思います。これにDirect2Dを使用するにはどうすればよいですか?
c++ - IWICImagingFactory :: CreateDecoderFromStream()が失敗し、エラーメッセージメッセージが役に立たない
ビットマップリソースからID2D1Bitmapを読み込もうとしています。そのために、Direct2Dが使用する前にWindows Imaging Component(IWIC)を使用して画像を処理するように指示されたMSDNガイドを参照しました。
ただし、を呼び出すと失敗しCreateDecoderFromStream()
、奇妙なエラーメッセージが返されます– 0x88982f50
–それは何も教えてくれません。Googleを検索し、DirectXエラールックアップを使用しました。DirectXエラールックアップツールはこれを教えてくれます:
これは、リソースからID2D1Bitmapをロードするために使用しているコードです。
c++ - Direct2D がウィンドウにビットマップを描画することを拒否し、黙って失敗する
Direct2D を使用して 128x128 ビットマップをウィンドウに描画しようとしています。ただし、何も表示されEndDraw()
ず、エラーも返されません。
これは私のWM_PAINT
コードです:
Visual Studio リソースから読み込んだビットマップ データがごみである可能性があると思われますが、何も失敗せず、エラー メッセージが表示されるため、知る方法がありません。ID2D1Bitmap
これは、リソースからをロードするために使用したコードです。
Visual Studio 2010 のネイティブ WinAPI で C++ を使用しています。
c# - .NETおよびDirect2Dの高速描画クラッシュ
一般的用途
Direct2Dを使用した多目的グラフィックスレンダリングに使用できる.NETユーザーコントロールを開発しています。このコントロールは、バックバッファー/ダブルバッファーID2D1HwndRenderTarget
とのインターフェースに基づいています。ID2D1BitmapRenderTarget
バックグラウンド
Direct2Dのマネージラッパーオブジェクトのセットを公開するC++/ CLIを使用してラッパーを作成し、コードがバイナリデータに送信したり、リソースキーを取得したりできるDirect2Dビットマップ用のシングルトンリソースマネージャーを設計しました。次に、どのコードがメッセージをユーザーコントロールに渡して、ビットマップをレンダリングできるかを示します。
これまでの使用法
ビットマップ、JPEG、カスタムイメージング形式などをロードして、Direct2Dレンダリングコントロールにすべて問題なく送信することができました。15 fpsビデオからフレームをロードし(バックグラウンドスレッドでデコード)、Win32マルチメディアタイマーによって発生したイベントからフレームをレンダリングできるカスタムビデオデコーダーを作成しました。問題ありません。
問題
私の問題は、単一のマルチメディア形式からより柔軟なもの(特にLibAV / ffmpegに接続する)に拡張しようとすると、Direct2Dレンダリングコントロールがディスプレイドライバーをクラッシュさせ始めることです。これは、フレームが順番にレンダリングされる場合には発生しません(タイマーではなく、ボタンを使用して次のフレームをレンダリングします)。また、すぐには起こりません。Win32タイマーコールバック内でブロックした場合も発生しませんが、Mutexを使用してスレッドを発生させ、タイマーコールバックを解放し、暫定スレッドがコントロールにレンダリングを指示する場合に発生します。
症状
タイマーを開始し、次のレンダリングを引き起こす経過イベントメソッドにアタッチすると、通常、約2〜20秒間正常に再生されます。小さいビデオを使用すると、問題が発生する前に再生時間を長くすることができます。1080pビデオを再生すると、通常5秒以内にコンテストなしでクラッシュする可能性があります。再生は正常に開始されます。追いつく前に、ここかそこかで問題が発生する可能性があります。
- 最終的に、背景色はレンダリングされているがフレームはレンダリングされていないかのように、ちらつきが見られるようになります。追加のフレームは後でレンダリングされる場合とされない場合がありますが、これは非常に短命です。
- ちらつきの後、タイマーを十分速く停止すれば、クラッシュは発生しません。
- 時間内に止まらない場合:
- 運が良ければ(おそらく10%の確率で)、フレームはレンダリングを停止し、コントロールのサイズを変更するまで1つのフレームに留まります。サイズを変更すると、コントロール全体に黒だけが描画されます。(これは、DirectXレンダリングのデバイスコンテキストが失われたことを示している可能性があることを読みましたが、それ以上は見ていません。)
- 運が悪ければ、ディスプレイドライバーがクラッシュし、Windowsが回復してドライバーを再起動します。その後、EndDrawは最終的にエラーが発生したことを通知し、D2DERR_RECREATE_TARGETを返します。
- 本当に運が悪ければ、ディスプレイが万華鏡のように見え始め、マシンの電源を切る必要があります。起動、ログオン、Visual Studioとソリューションの読み込み、ビデオの読み込み、すべてを失っただけで5分も無駄になりました。私のデバッグデータ。
ある種の競合状態が欠落していると思いたいのですが、レンダリングコードを実行するたびに、適切にロックされているように見えます。
レンダリングコントロールのコード
Win32マルチメディアタイマーコールバックのコード
サイズは除外されていますが、「winmm.dll」にリンクしている関連コードは次のとおりです。EntryPoint= "timeSetEvent"
結論
3週間後、私はこの振る舞いに困惑していると言っても恥ずかしがらず、競合状態を特定するためのあらゆる種類の入力を探しています。私の無知を示しています。
opengl - 垂直同期ごとに正確に 1 つのレンダリングを行う方法 (繰り返しなし、スキップなし)?
フレームをスキップしたり繰り返したりすることなく、垂直同期ごとに正確に 1 つのレンダリングが実行されるように、垂直同期レンダリングを実行しようとしています。これは、Windows 7 および (将来的には) Windows 8 で動作するために必要です。
基本的にはQUADS
、元の画像のピクセルが画面上のピクセルと 1:1 で一致するように、画面に収まるシーケンスを描画することで構成されます。OpenGLでもDirectXでも、レンダリング部分は問題ありません。問題は正しい同期です。
WGL_EXT_swap_control
私は以前、描画してから呼び出して、拡張機能を使用してOpenGLを使用しようとしました
glFlush() と一緒にこれら 2 つの命令のすべての組み合わせと順列を試しましたが、信頼できるものではありませんでした。
次に、描画してから呼び出すことにより、Direct3D 10で試しました
ここでg_pSwapChain
とIDXGISwapChain*
はpOutput
そのIDXGIOutput*
SwapChain に関連付けられています。
OpenGL と Direct3D の両方のバージョンの結果は同じです。たとえば、60 フレームの最初のシーケンスは、本来あるべき状態で持続しません (60hz で約 1000 ミリ秒ではなく、1030 ミリ秒または 1050 ミリ秒のように持続します)。正常に動作しますが (約 1000.40ms)、時々フレームがスキップされるようです。で採寸しQueryPerformanceCounter
ます。
Direct3D で、WaitForVBlank だけのループを試行すると、1000 回の反復の継続時間は一貫して 1000.40 で、変動はほとんどありません。
したがって、ここでの問題は、呼び出された各関数がいつ戻るか、およびスワップが垂直同期中に行われたかどうか (テアリングを避けるために以前ではない) を正確に把握していないことです。
理想的には (私が間違っていなければ)、私が望むものを達成するには、1 つのレンダリングを実行し、同期が開始するまで待ち、同期中にスワップし、同期が完了するまで待ちます。OpenGLまたはDirectXでそれを行う方法は?
編集:
わずか 60x のテスト ループはWaitForVSync
、1000.30ms から 1000.50ms まで一貫してかかります。Present(1,0)
beforeを使用した同じループはWaitForVSync
、他に何もレンダリングせず、同じ時間がかかりますが、フレームを繰り返したかのように、失敗して 1017 ミリ秒かかる場合があります。レンダリングがないため、ここに何か問題があります。