DirectX11をついこの前から始めたものです。
VSSetShaderやGSSetShaderなどで定数バッファを各シェーダーに設定するのだと思うのですが、
これは定数バッファの値を変えるたびに必ず呼び出さなければならないのでしょうか。
借りた書籍に載っていたサンプルコードでは必ず呼び出していたのですが、
値変更時にMap/UnMapだけ行って、VSSetShaderやGSSetShaderは毎回行わないように
コードを書き換えてみたところ、そのまま動いています。
速度を測ってみるとこっちの方が早いので、できればこのようにしたいのですが
この方法は正しいのですか。
DirectXの定数バッファについて
Re: DirectXの定数バッファについて
定数バッファを設定するのは、VSSetConstantBuffersやGSSetConstantBuffersメソッドなのではないでしょうか?
Re: DirectXの定数バッファについて
すみません。
書き間違えました。
VSSetConstantBuffersを毎回呼び出す必要はないですか?
書き間違えました。
VSSetConstantBuffersを毎回呼び出す必要はないですか?
Re: DirectXの定数バッファについて
Direct3D 11では、並列処理を行うためにDeferred Contextという仕組みが導入されました。
Deferred Contextに対して、並列処理をしないImmediate Contextがあります。
デフォルトのコンテキストはImmediate Contextで、必要に応じてDeferred Contextを複数作成し、最後にまとめてImmediate Contextに投げる形になります。
Deferred Contextはステートを引き継がないので、VSSetConstantBuffersやGSSetConstantBuffersメソッドなど毎回呼ぶ必要があります。
ただし、並列処理を利用したほうがもっと速くなる場合があるかもしれませんし、Direct3D 11なら、並列処理を前提として覚えたほうが混乱が少ないかもしれません。
Deferred Contextに対して、並列処理をしないImmediate Contextがあります。
デフォルトのコンテキストはImmediate Contextで、必要に応じてDeferred Contextを複数作成し、最後にまとめてImmediate Contextに投げる形になります。
Deferred Contextはステートを引き継がないので、VSSetConstantBuffersやGSSetConstantBuffersメソッドなど毎回呼ぶ必要があります。
現状においては、毎回呼び出さなくても問題ないでしょう。
ただし、並列処理を利用したほうがもっと速くなる場合があるかもしれませんし、Direct3D 11なら、並列処理を前提として覚えたほうが混乱が少ないかもしれません。