問題タブ [direct3d11]
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.
pixel-shader - ピクセルシェーダーは実際に何をしますか?
私はグラフィックプログラミングに比較的慣れていません。本を読んだり、チュートリアルをスキャンしたりしているので、これがばかげた質問だと思われる場合はご容赦ください。
私はdirectx11の基本を稼働させており、今は楽しみたいと思っています。当然のことながら、私はシェーダーパイプラインを頻繁に読んでいて、すでに魅了されています。リソースを無駄にすることなく、60分の1秒ごとに数万回実行するのに十分効率的でなければならない単純で小さなコードを書くというアイデアは、続行して混乱させる前に、概念を理解することを急いでいます。物事の。私が問題を抱えているのは、ピクセルシェーダーが実際に何をしているのかを把握することです。
頂点シェーダーは簡単に理解できます。オブジェクトの頂点を、位置やテクスチャ座標などのオブジェクトに関する情報を関連付ける均一なデータ構造に編成し、各頂点をシェーダーに渡して、変換マトリックスを使用して3Dから2Dに変換します。 。私がそれを理解している限り、私はそれをコーディングする方法を理解することができます。
しかし、ピクセルシェーダーは取得できません。私が得たのは、頂点シェーダーの出力がピクセルシェーダーの入力であるということです。それでは、ピクセルシェーダーにポリゴンの頂点の2D座標を渡すだけではないでしょうか。私が理解するようになったのは、ピクセルシェーダーが個々のピクセルを受け取り、それらに対して計算を実行して、色や照明などを決定することです。しかし、それが本当なら、どのピクセルですか?画面全体ですか、それとも変換された2Dポリゴン内にあるピクセルだけですか?
または私は何かを完全に誤解しましたか?
c++ - D3DX11CompileFromFileの4番目のパラメーターは何ですか?
私はD3DX11CompileFromFile関数を使用して、次のように、blobポインターからID3D11VertexShader*とID3D11PixelShader*をコンパイルして作成しています。
ここで、vsFilenameは有効なstd :: stringであり、m_vertexShaderはID3D11ShaderVertex*です。4番目のパラメーターが何のためにあるのか知りたいですか?どこで使用しますか、いつ使用しますか、何をしますか?それが何であるかは重要ですか?私がコードのどこでそれを呼んでいるのか、それが一意である以外の目的がない場合、ユーザーがそれを指定する必要がないようにするためです。
c++ - 頂点入力タイプが異なる複数のシェーダーが同じ頂点バッファーを使用できますか?
モデルを持っているとしましょう。このモデルには、位置、色、法線、および2つのテクスチャ座標のデータがあります。ここで、入力タイプが位置と色のみであるシェーダーがあるとします。ただし、このモデルの頂点バッファは次の形式です。
このモデルには、位置と色を取得するシェーダーの情報が含まれていますが、余分なデータがあるため、使用できません。私が考えることができる他の唯一の解決策は、同じ情報からいくつかのフィールドを除いた複数の頂点バッファを持つことですが、それは単に冗長です。真剣にもっと良い方法がなければなりません。ここで何か助けはありますか?
編集:仕事の前に少し時間をかけて質問を詳しく説明すると思いました。頂点バッファーについて話すとき、私はID3D11Device::CreateBufferで作成するID3D11Buffer*を意味します。手前に、Vertex_PCNT2と入力して頂点の配列を埋めます。この時点で私が言えることから、そのバッファーは永続的にこの形式になっているため、すべてのシェーダーがこの形式で動作する必要があります。データがすでに存在する場合、他のバッファを設定することはRAMに負担をかけるだけです。
direct3d - DXGIで「ライブオブジェクト警告」を有効にする
Direct3D 11では、次のような「ライブオブジェクト警告」を有効にできます。
私のデバッグビルドでは、リリースされていないオブジェクトを検出します。
DXGIについても同じことができますか?もしそうなら、どのように?
performance - フレームごとに何千回も単一の頂点バッファに書き込んでいるときに、Direct3Dのパフォーマンスをどのように改善できますか?
既存のすべてのグラフィックコード(OpenGL用に作成)を使用できるようにし、OpenGL呼び出しを同等のDirect3DにルーティングするOpenGLラッパーを作成しようとしています。これは、パフォーマンスがかなりの問題であることが判明していることを除いて、これまでのところ驚くほどうまく機能しています。
今、私はD3Dを設計されていない方法で使用している可能性が高いことを認めます。レンダリングループごとに1つの頂点バッファーを数千回更新しています。「スプライト」を描画するたびに、テクスチャ座標などを使用して4つの頂点をGPUに送信し、画面上の「スプライト」の数が一度に約1k〜1.5kに達すると、アプリのFPSは次のように低下します。 10fps未満。
VS2012パフォーマンス分析(これは素晴らしいですが)を使用すると、ID3D11DeviceContext->Drawメソッドが大部分の時間を占めていることがわかります。 スクリーンショットはこちら
頂点バッファの設定中、または描画メソッド中に正しく使用していない設定はありますか?すべてのスプライトに同じ頂点バッファーを使用するのは本当に本当に悪いことですか?もしそうなら、既存のグラフィックコードベースのアーキテクチャを大幅に変更しない他のオプションはありますか(OpenGLパラダイムを中心に構築されています...すべてをフレームごとにGPUに送信してください!)
私のゲームで最大のFPSキラーは、画面に大量のテキストを表示しているときです。各文字はテクスチャクワッドであり、各文字には頂点バッファへの個別の更新とDrawへの個別の呼び出しが必要です。D3DまたはハードウェアがDrawの多くの呼び出しを好まない場合、他にどのようにして一度に多くのテキストを画面に描画できますか?
この問題の診断に役立つコードが他にあるかどうかをお知らせください。
ありがとう!
これが私が実行しているハードウェアです:
- Core i7 @ 3.5GHz
- 16ギガのRAM
- GeForce GTX 560 Ti
そして、これが私が実行しているソフトウェアです:
- Windows8リリースプレビュー
- VS 2012
- DirectX 11
描画方法は次のとおりです。
そして、頂点バッファを作成するメソッドは次のとおりです。
これが私の頂点シェーダーコードです:
voxel - インスタンス化されたオブジェクトを使用したシーンのボクセル化
いくつかの球、立方体、および長方形の壁を備えた、床としての平面を持つ単純なシーンを directx11 で作成しました。読み込まれるオブジェクトは、平面、立方体、球の 3 つだけです。ただし、立方体と球体は、スケーリング、位置、および回転が異なる複数回インスタンス化されています。これらのオブジェクトのうち 2 つは動的です。
スケールと回転が異なるオブジェクト インスタンスを考慮して、このシーン全体 (100x100x20 単位) を 0.2 単位のボクセルにボクセル化したいと思います。
ボクセル化に関するいくつかの記事を読み、「Direct3D 11 を使用した実用的なバイナリ サーフェスおよびソリッド ボクセル化」の GPU Pro 3 のソース コードを入手しました。しかし、これらの記事はすべて、単一のオブジェクトのボクセル化を示しています - それらの三角形を取り、それらをグリッドに分割します.
これらのメソッドを拡張して、複数のオブジェクト インスタンスを持つシーン全体を考慮するにはどうすればよいでしょうか?
考えられる唯一のことは、シーン全体をトップダウンで octree 分割する必要があるということです。しかし、動的なシーンの場合、これはコストが高すぎるでしょうか?
私のシーンでは、読み込まれたモデルごとにバッファを使用しています。したがって、Compute Shader でボクセル化する場合、3 つのバッファすべてを 1 つのバッファにコピーする必要がありますか? モデル インスタンスはどのように説明すればよいですか?
ありがとうございました。
reflection - Metro の D3D11 は D3DReflect をサポートしていませんか? (なぜだめですか?)
MetroのD3D11はをサポートしていませんD3DReflect
。
なぜだめですか?
私の API はこれを使用して、シェーダーの一定のバッファー サイズを動的に取得します。
オブジェクトなしで D3D11 で動的に一定のバッファー サイズを取得する他の方法はありID3D11ShaderReflection
ますか? または、定数変数を名前で取得しますか?
Metro 用のシェーダー コンパイラ ツールを作成したい場合はどうすればよいですか?
シェーダー生成が必要な複雑なブラシを動的に生成できるアート アプリケーションを作成したかったのです。しかし、これはうまくいきません。
Windows(Desktop)、OSX、Linux、iOSまたはAndroidにはこれらのシェーダー制限がありますか?
いいえ、では、一体なぜメトロなのですか?
c++ - WinRT C++ Direct3D アプリで TextBox をプログラムで作成するにはどうすればよいですか?
Windows 8 の VS2012 で新しいプロジェクトを作成しました: Visual C++ | Windows Metro スタイル | Direct3D アプリ。
Direct3DApp1
これにより、既定で、から派生したメイン アプリ クラスを使用して、動作する D3D アプリが作成されますWindows::ApplicationModel::Core::IFrameworkView
。
プログラムで を作成しWindows::UI::Xaml::Controls::TextBox
、何らかの方法でこのビューに挿入する必要があります。これは、XAML を定義する他のプロジェクト タイプでは簡単に実行できるように見えますが、この Direct3D アプリ プロジェクト タイプには XAML がありません。
ユーザーがキーボードをポップしてテキストを入力できるように、Direct3D グラフィックスに TextBox をオーバーレイするにはどうすればよいですか?
デフォルトのプロジェクトを拡張する完全に機能する VS2012 ソリューションはDirect3D App
素晴らしいでしょう。ありがとう!
textures - D3D11 での作成後にテクスチャの miplevel を更新する
Direct 3D 11 では、ID3D11DeviceContext::CreateTexture2Dを使用して空のテクスチャを作成し、 ID3D11DeviceContext::UpdateSubresourceメソッドを使用してテクセル データを更新し、D3D11_BOX 構造で変更するために必要なミップ レベルを指定できます。これは可能ですが、Direct 3D での作成後に 2D テクスチャのミップ レベルの数を変更することは可能ですか?
この質問は「なぜそんなことをするの?!」応答しますが、いくつかの移植/テスト要件により、そうする必要があります。
c# - SlimDX Direct3D11 のワイヤーフレーム
SlimDX を使用してワイヤーフレーム 3D モデルをレンダリングしようとしています。
グーグルで検索した後、SlimDX でワイヤーフレームを描画する方法ではなく、高度なトピックしか見つかりませんでした。彼らは、それを行うにはシェーダーを使用する必要があると言います。
私は DirectX を初めて使用するので、HLSL はよくわかりません。
どうすればそれを描くことができますか?本当にシェーダーを使用する必要がある場合、誰かが例やヒントを教えてくれますか?