問題タブ [directx-12]
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 - RWStructuredBuffer が参照されている場合、この HLSL ピクセル シェーダーがコンパイルされないのはなぜですか?
DirectX 12 を使用しており、UAV を使用してレンダリングしようとしています。これが私のピクセルシェーダーコードです:
関数を使用するとコンパイルに失敗しD3DCompileFromFile
ます。
この行を置き換えると:
このようなもので:
について言及されていないRWStructuredBuffer
場合、問題なくコンパイルされ、適切にレンダリングされます。
バインドされたデータに問題はないと思います (VS Graphics Debugger は、適切にバインドされた 2 つの UAV を示しています)。ただし、それがシェーダーのコンパイルに影響を与えるとは思いません。
FLBuffer
またはを参照するたびにStartOffsetBuffer
、コンパイルされません。
この問題の原因は何ですか?
graphics - Shader Resource View パフォーマンスの作成
ID3D12Resource
に渡す直前にシェーダーリソースビューを作成ID3D12GraphicsCommandList
し、フレームが完了したときにそれを破棄することは、「大丈夫」なプラクティスと見なされるのでしょうか?
上記のリソースの記述子ビューを一度だけ作成することに注意してください。
c# - Unity 5.4 Graphics API for Windows Direct3D12 がアクティブにならない
現在、GTX980ti と 4700K i7 プロセッサを搭載した win10 コンピューターで Unity 5.4.0f2 を使用しています。
「Windows 用グラフィックス API」セクションの Direct3D12 オプションを唯一のオプションとして入力しましたが、ゲームは自動的に Direct3D11 API に戻ります。
SystemInfo.graphicsDeviceType
コマンドで確認しました。
ゲームで DirectX12 を強制的に使用するにはどうすればよいですか?
c++ - 頂点バッファーを更新するとデバッグ レイヤー エラーが発生する
Windows 10 をバージョン 1607 に更新しました。これには、追加の D3D デバッグ レイヤー チェックが含まれています。私の頂点バッファ更新コードは、更新前は警告/エラーなしで機能していましたが、呼び出し時にエラーが発生しましたCopyBufferRegion
:
リソース (0x000001DB301B9750:'') (サブリソース: 0) のリソース状態 (0xAC3: D3D12_RESOURCE_STATE_GENERIC_READ) は、宛先バッファーとして使用するのに無効です。予期される状態ビット: 0x400: D3D12_RESOURCE_STATE_COPY_DEST、実際の状態: 0xAC3: D3D12_RESOURCE_STATE_GENERIC_READ
vb
必要な状態 ( )に遷移すると、D3D12_RESOURCE_STATE_COPY_DEST
代わりに次のようなエラーが発生します。
D3D12 エラー: ID3D12CommandList::ResourceBarrier: 特定のヒープは特定の D3D12_RESOURCE_STATES 状態に制限されており、変更できません。D3D12_HEAP_TYPE_UPLOAD には D3D12_RESOURCE_STATE_GENERIC_READ が必要です。D3D12_HEAP_TYPE_READBACK には D3D12_RESOURCE_STATE_COPY_DEST が必要です。[ RESOURCE_MANIPULATION エラー #741: RESOURCE_BARRIER_INVALID_HEAP]
これが私のコードです。頂点バッファーを作成し、頂点データをアップロードし、必要に応じてバッファーのサイズを変更します。
これらのデバッグ レイヤー エラーを修正するにはどうすればよいですか?
rendering - DirectX 12 での複数モデルのレンダリングのバグ
1 つのグラフィック コンテキストのみを使用して DirectX 12 で複数のモデルをレンダリングしようとしていますが、結果は非常に奇妙で、その理由がよくわかりません。外部からのスポンザ モデルのレンダリング結果。右が正しい結果で、左が問題のある結果です。
読み込まれた 2 つのメッシュが同じであっても、各モデルには独自の頂点バッファー、インデックス バッファー、および SRV があります。グラフィックス コンテキストを作成するプロセスでは、グラフィックス コンテキストが 1 つだけあり、各モデルのインデックスと頂点バッファーが設定されます。次に、drawIndexed() 関数を呼び出してレンダリングします。グラフィックス コンテキストが作成された後、フレームごとに 1 回グラフィックス コンテキストを実行します。ただし、モデルごとに個別のグラフィック コンテキストを作成し、フレームごとにすべてのグラフィック コンテキストを実行すると、レンダリングは正常に機能しますが、フレーム レートは大幅に低下します。
奇妙な結果の理由が何であるかについてのヒントを提供することは非常に役に立ちます。解決策を提供することはさらに良いことです. よろしくお願いします。
dxgi - 深度ステンシル バッファー リソースへのシェーダー リソース ビューに使用する形式はどれですか?
深度ステンシル バッファー リソースは、DXGI_FORMAT_D24_UNORM_S8_UINT
format として定義されます。
そのリソースにシェーダー リソース ビュー (SRV) を作成するには、ビュー形式を次のように記述する必要があると想定していました。
DXGI_FORMAT_R24_UNORM_X8_TYPELESS
赤のチャネルが深度値にアクセスする場所DXGI_FORMAT_R24G8_TYPELESS
赤のチャネルは深度にアクセスし、緑のチャネルはステンシル値にアクセスします
ただし、そのような SRV の作成は次のエラーで失敗します。
D3D12 エラー: ID3D12Device::CreateShaderResourceView: リソース形式 D24_UNORM_S8_UINT の場合、D3D ビューを作成するときに、ビューの形式名を R24_UNORM_X8_TYPELESS にすることはできません。リソース (またはその一部) がシェーダーにどのように表示されるかを決定する、このリソース形式の有効なビュー形式名のセットについては、ドキュメントを参照してください。[ STATE_CREATION エラー #28: CREATESHADERRESOURCEVIEW_INVALIDFORMAT]
API ドキュメントを調べると、次の情報が得られました。
リソースを表示する場合、リソース ビューの説明では、リソース形式と互換性のある型付き形式を指定する必要があります。つまり、名前に _TYPELESS を含む形式を使用してリソース ビューの説明を作成することはできません。ただし、ビューの型付き形式を指定することで、型のないリソースを表示できます。
型のない形式が許可されない理由と、代わりにどの形式を使用すればよいか、よくわかりません。
c++ - 複数のメッシュを異なる場所に描画する (DirectX 12)
DirectX 12 に問題があります。小さな 3D レンダラーを作成しました。モデルは、定数バッファーにある基本的なワールド ビュー プロジェクション マトリックスを使用して、頂点シェーダーの 3D 空間に変換されます。
現在このコマンドを使用している定数バッファーのデータを変更するには、定数memcpy(pMappedConstantBuffer + alignedSize * frame, newConstantBufferData, alignedSize)
バッファーのデータをすぐに置き換えます。
ここで問題が発生します。描画はコマンド リストに記録され、後で実行のために GPU に送信されます。
例:
この後、実行のためにコマンドリストをgpuに送信しましたが、コマンドリストがgpuに送信される前にすべてのmemcpyが実行されるため、すべてのメッシュが同じ位置にあることを確認してください。したがって、基本的に最後の memcpy は前のものを上書きします。
したがって、基本的に問題は、メッシュを異なる位置に描画する方法、またはコマンドリスト内の定数バッファーのデータを置き換える方法で、gpu の各描画呼び出し間で定数バッファーが変更されるようにすることです。
ありがとう
もう助けは必要ありません。自分で解決しました。メッシュごとに定数バッファーを作成しました。