HLSL/Directx11 で作業していると、3D レンダー ターゲットをバインドする方法が 2 つあります。ターゲット全体をバインドするか、レイヤーを指定しながらバインドします。
ターゲット全体をバインドする場合、出力色が適用されるレイヤーを HLSL コードでどのように指定しますか?
これにはジオメトリ シェーダーが必要なのではないかと疑っていますが、それは正しいですか?
これを頂点シェーダーまたは他の場所で実行できるようにする他のアプローチはありますか?
HLSL/Directx11 で作業していると、3D レンダー ターゲットをバインドする方法が 2 つあります。ターゲット全体をバインドするか、レイヤーを指定しながらバインドします。
ターゲット全体をバインドする場合、出力色が適用されるレイヤーを HLSL コードでどのように指定しますか?
これにはジオメトリ シェーダーが必要なのではないかと疑っていますが、それは正しいですか?
これを頂点シェーダーまたは他の場所で実行できるようにする他のアプローチはありますか?
ボリューム テクスチャ全体 (または TextureArray) をバインドする場合、ジオメトリ シェーダーを使用して特定のスライスに書き込む必要があります。
GS 出力構造は次のようになります。
struct GSOutput
{
float4 pos : SV_Position;
uint slice : SV_RenderTargetArrayIndex;
//Add anything else you need for your triangle
};
スライスは補間されないことに注意してください。そのため、複数のスライスに放出する必要がある場合は、スライスごとに 1 つのプリミティブをプッシュする必要があります。
ジオメトリ シェーダーを使用したくない 2 番目のケース。
前のものと同じパラメーターを使用して rendertargetview 記述を作成しますが、スライスごとにそれらのパラメーターを変更します (これは Texture2DArray の場合ですが、Texture3D を使用する場合はほとんど同じです)。
D3D11_RENDER_TARGET_VIEW_DESC rtvd;
rtvd.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
rtvd.Texture2DArray.ArraySize = 1;
rtvd.Texture2DArray.FirstArraySlice = yourslice;
これで、スライスのみのレンダー ターゲットができたので、パイプラインで単一のスライスを直接バインドできます。
これは、描画呼び出しがどのスライスにレンダリングされるかを事前に (CPU で) 知っている場合にのみ機能することに注意してください。また、この描画呼び出しに対してのみ単一のスライスにレンダリングできます。