問題タブ [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.
winapi - IDirect3DSurfaceのデータを2つのdirectxデバイスで作成された別のIDirect3DSurfaceにコピーする
独自のDirect3Dデバイスを備えたウィンドウがあります。これをmainWindowと呼びましょう。mainWindowとその内容は、他の人によって作成されています。彼らは私に、メインウィンドウに描画しているいくつかのDirect3Dサーフェス(IDirect3DSurface9ポインター)を提供してくれました。
私は彼らのコールバックの1つからスレッドを開始し、winAPIを使用して独自のウィンドウを作成しました。(この質問で少し似たようなケースがありました)
これらのRTT出力をウィンドウに描画したいと思います。そのため、ウィンドウに描画する独自のDirectXデバイスで作成したサーフェス/テクスチャにサーフェスをコピーしようとしています。
これをしようとしているときに見つけたもの、
D3DXSaveSurfaceToFileInMemory(...)
これは、関数を使用して簡単に実行できD3DXCreateTextureFromFileInMemory(...)
ます。StrechRect(...)
関数は、2つのデバイスで作成された2つのサーフェスでは機能しません。
サーフェスをロックしてデータを相互にコピーしようとしましたが、機能しなかったようです。しかし、私はそれを再試行します。(2つの異なるデバイスからの表面のロックは一度に違法ですか?)
人々がこれを行うことを知っている、または提案する方法はありますか?
---編集---
MSDNによると(ページへのリンク)
Windows Vistaでは、CreateTextureはシステムメモリポインタからテクスチャを作成できるため、アプリケーションはシステムメモリの使用、割り当て、および削除をより柔軟に行うことができます。たとえば、アプリケーションはGDIシステムメモリビットマップポインタを渡し、その周りにDirect3Dテクスチャインターフェイスを取得できます。CreateTextureでシステムメモリポインタを使用する場合、次の制限があります。
- テクスチャのピッチは、幅にピクセルあたりのバイト数を掛けたものに等しくなければなりません。
- 単一のミップマップレベルを持つテクスチャのみがサポートされます。Levels引数は1でなければなりません。
- Pool引数はD3DPOOL_SYSTEMMEMである必要があります。
- pSharedHandle引数は、システムメモリポイントを保持できるバッファへの有効なポインタである必要があります。* pSharedHandleは、テクスチャ幅のバイト単位のサイズ*テクスチャの高さ*テクスチャ形式のピクセルあたりのバイト数を持つシステムメモリへの有効なポインタである必要があります。
この方法でテクスチャを作成する例は見つかりませんでしたが、試してみたところ、ノイズに満ちた出力だけが得られました。誰かがその中で私を助けることができれば、私の問題はある程度解決されると思います....msdnがここで言っていることの良い例はありますか..??
direct3d - direct3d は新しく作成されたテクスチャを初期化しますか?
たとえば、新しい空のテクスチャを作成する場合
IDirect3DDevice9::CreateTexture または D3DXCreateTexture
テストで私に見えるように、ゼロで埋められることが保証されていますか? これに関するマイクロソフトの声明へのリンクを持っている人はいますか? 何も見つかりませんでした。
c++ - Direct3D デバイス マネージャーの使用方法を教えてください。
Direct3D アプリケーションの複数のスレッドとオブジェクト間で 1 つの Direct3D デバイスを共有したいと考えています。ビデオ処理やビデオ アクセラレーションは行っていませんが、Direct3D デバイス マネージャーを見つけました 。 v=vs.85).aspx
私のコードでは、次のことを行っています。
私の質問は、Direct3D デバイス マネージャーを作成した後、デバイス マネージャーへのポインターを渡すことなく、direct3d デバイス マネージャーを他のオブジェクトと共有するにはどうすればよいかということです。マイクロソフトは具体的に次のことを行うように言っていますが、次のことが実際に何を意味するのかわかりません。
デバイスの所有者は、他のオブジェクトが IDirect3DDeviceManager9 インターフェイスへのポインターを取得する方法を提供する必要があります。標準のメカニズムは、IMFGetService インターフェイスを実装することです。サービス GUID は MR_VIDEO_ACCELERATION_SERVICE です。
IMFGetService インターフェイスを使用してデバイス マネージャーを共有する方法を誰か教えてもらえますか?
alphablending - 事前に乗算されたアルファを使用したパーティクルブレンドの問題
3Dレンダリングシーンからテクスチャを保存して、再利用しようとしていました。
大きな問題は、rgb値がそのアルファ値と一致しないことです。黒のエッジのない画像が必要なので、そのアルファ値を分割するためにrgbカラーを使用する必要があります(Photoshopなどの画像操作ソフトウェアは、アルファチャネルが事前に乗算されていない画像を処理できます。)
残念ながら、色が薄すぎるため、一部の結果値が1にカットオフされます。
そこで、事前乗算アルファと呼ばれる手法に目を向けました(詳細を参照)。シェーダーを使用する代わりに、個別のアルファ計算を使用します。
例:RenderState.SourceBlend = Blend.SourceAlpha;
RenderState.DestinationBlend = Blend.InverseSourceAlpha;
次に、renderstateを追加します。RenderState.SourceBlendAlpha = Blend.One;
RenderState.DestinationBlendAlpha = Blend.InverseSourceAlpha;
それはうまくいきますが、私が次RenderState.SourceBlend = Blend.SourceAlpha;
RenderState.DestinationBlend = Blend.One;
RenderState.SourceBlendAlpha = Blend.One;
RenderState.DestinationBlendAlpha = Blend.One;
のことを処理しようとすると、結果は完全に間違っています、誰かが理由を教えてもらえますか?
PS:理由がわかりました。事前に乗算されていないブレンド状態(SourceAlphaとinverseSourceAlpha)を使用すると、rgba値は確実に0〜1以内に制御されますが、加算状態(SourceAlphaと1)に切り替えると、rgb値は1を超えると、誤った値が発生します。
今私の問題は、アルファ値を制御して、すべての詳細を保持し、同時にオーバーフローしないようにする方法です。
c++ - 「この宣言は型指定子がありません」および「宣言が必要です」というエラーが同じ関数で発生する
私はこのコードを持っています:
5行目で、「この宣言にはストレージクラスまたは型指定子がありません」と書かれており、FORCE_EXIT(10)でこれを言っています。それも。2 番目の if ステートメント (if(dwTestPtr....) では、「宣言が必要です」と表示されます。何が問題なのですか?
vector - Direct3D ベクトルの初期化
これを使用して、Directx ベクトルを初期化しています。
配列を実行せずに試しても、常に同じエラーが発生します。
エラー C2440: '初期化中': 'float' から 'LPD3DXVECTOR3' に変換できません
doublesをやってみましたが、同様のエラーが発生しました
c++ - .NET Web アプリケーションで C++/CLI ユーザー コントロールを再利用する
を拡張するかなり複雑なクラスがありますSystem.Windows.Forms.UserControl
。/clr
ネイティブ C++ dll を使用するため、スイッチを使用して C++/CLI で記述されています。このクラスの主な役割は、テクスチャ、ズーム、パンなどで画像をレンダリングするアンマネージ Direct3D9 dll のラッパーとして機能することです。
このクラスを .NET Web アプリケーションで再利用する方法はありますか? つまり、ユーザー コントロールをブラウザー内で実行できるようにしたいと考えています。ここでの主な不確実性は、ネイティブ dll へのアクセスと、Direct3D の使用です。これを機能させることができるかどうかを確認するために小さなテストを設定していますが、他の誰かからの入力が必要です.
更新:このガイドに従いました。最初の試行で、コントロールの dll またはその依存関係の 1 つを読み込めないというエラーが表示されました。したがって、テストのために、使用するすべてのアンマネージ dll を system32 にコピーしました。エラーなしでページを読み込めるようになりましたが、まだコントロールが表示されません。About
次のように、既定の C# Web アプリ プロジェクトのページに参照を配置しました。
ここで ActiveX のアプローチを試してみますが、それが機能したとしても、クライアントは Internet Explorer を使用するか、何らかのプラグインをインストールする必要があると思います。それは本当に面倒です。
編集:今のところ、他のアプローチを試してみたいと思っています。たとえば、私の C++/CLI クラスは単なるラッパーなので、別の言語で別のラッパーを作成したいと考えています。もし私がそうするなら、その言語は可能な限り Web アプリケーションと友好的であるべきです。
directx - Direct3D 9 でウィンドウレスを使用するには?
directshow が VMR-9 経由でウィンドウレスを使用できることは知っています。VMR-9 は Direct3D に基づいています。Direct3D を直接使用して、ウィンドウのないアプリケーションを作成できますか?
c++ - DirectX9-三角形が表示されない
現在、プログラムの作業を開始する前に、DirectXでいくつかのテストケースを実行しています。そして今、私は1日かそこらの間以下のコードをいじっています。同様の問題をインターネットで見回しながらコードを修正しました。しかし、結局、それは私が望むようにも機能していません。誰かが私が間違っていることを正確に教えてもらえますか?多分誰か他の人がこれを修正することができます。
c++ - D3D9 サーフェスの D3DPOOL タイプを D3DPOOL_DEFAULT から D3DPOOL_SYSTEMMEM に変換する方法は?
D3DPOOL_DEFAULT タイプのサーフェスがあり、それを D3DPOOL_SYSTEMMEM に変換したいと考えています。UpdateSurface が反対のことをすることは知っています。