2017-08-08 47 views
0

私はエンジンのテクスチャクラスに取り組んでいます。DX12、標準テクスチャクラスの実装方法

APIは、テクスチャのテクセルの一部を更新したり、テクスチャからデータを読み込んだりするなど、さまざまな処理をサポートしています。

このテクスチャは、パイプラインにUAVまたはSRVとしてバインドされる可能性があります。 RTVまたはDSVとして作成することもできます。

テクスチャの作成と更新にはどのようにアプローチすればよいですか?すべてのテクスチャを作成してUPLOADヒープにする必要がありますか?これはデータを読み書きするのが最も簡単なソリューションですが、GPUの帯域幅も少なくてすみます。

また、ファイルまたは手続き型テクスチャからテクスチャを作成しているかどうかを検出することもできます。最初のケースではテクスチャをDEFAULTヒープにアップロードします。

あなたはどう思いますか?

ありがとうございます!

+0

あなたは、特に '' DescriptorHeap''と '' '' ResourceUploadBatchクラス –

+0

こんにちは、アルは[DX12用のDirectXツールキット](https://github.com/Microsoft/DirectXTK12)を見てとります@ ChuckWalbourn、ええ、あなたのコードは本当にいくつかのことを理解するのに役立ちます、ありがとう! – Nacho

答えて

0

アップロードヒープにテクスチャを作成することはできません。それらを解決しようとしている間は永遠の検証エラーサイクルに直面します。これは、テクスチャがメモリ内で線形表現を使用していないためです。しかし、少なくともあなたのために、コピーと更新の操作はここではあなたの懸念の中で最も簡単です。

CPUとGPU間の転送を実行する場合は、アップロードまたはリードバックのヒープにバッファを作成する必要があります。GetCopyableFootprintsを使用して画像を保存/読み取りする方法を知り、CopyTextureRegionを呼び出して実際のコピー。部分的な更新と読み取りをサポートしたい場合は、これは数ページのコードですが、この操作は簡単です。

その後、テクスチャクラスに影響を与える可能性があります。記述子ヒープのビューを抽象化する方法、部分的にテクスチャを部分的に保持する方法、メモリエイリアシングをサポートする方法、ストリーミングなどの更新中にgpuが使用しているテクスチャの存続期間は完全ではなく、すべての解決策を解決します。

+0

こんにちは@ galop1n、私は_ReadTexel()_メソッドを実装すると言うことができます、私の考え_READBACK_リソースを作成し、_DEFAULT_リソースからデータをコピーすることです。ただし、_ID3D12GraphicsCommandList :: CopyTextureRegion()_は、ReadTexel()が返された後に実行されますが、これをどのように処理できますか?たぶん私は_CopyCommandList_を持っている必要があり、私は_ReadTexel()_メソッドの内部でそれを実行できるように、私はこのコマンドを送信する必要がありますか? ありがとう! – Nacho

+0

@Nacho 'ReadTexel'は、本当に必要な場合を除き、GPUとCPUを決して同期させるべきではない限り、推奨される操作ではありません! CPUメモリから作成されたリソース上にある場合は、イメージにタグを付けてメモリを破棄せずに余分なストレージ価格を支払うだけです。 GPUで生成されたサーフェスの 'ReadTexel'であれば、' std :: future'と考える必要があります。コピーを非同期でトリガーし、操作を完了するのを待ってから読み込みます。これを行うには、 'CopyTextureRegion'を実行した後に' ID3D12Fence'を挿入し、それが正しい値に達するのを待ちます。 – galop1n

+0

ええ、私はそれが本当に高価な操作でなければならないことを理解しました!面白いのは、Dx11ではそれほど複雑でなくても済むので、ドライバーは内部的に多くのことをやっていると思います。私はあなたの未来のアプローチが気に入っていますが、それは私がかなりの時間の結果なしになることを意味します。別々のCopyCmdListを持っているとどう思いますか? – Nacho

関連する問題