Указание целевого слоя 3D rendertarget в вершинном шейдере? [HLSL]
При работе в HLSL/Directx11 я вижу, что есть два метода для привязки 3D-объекта визуализации: либо вы привязываете всю цель, либо привязываете ее при указании слоя.
Если вы связываете всю цель, как определить слой в коде HLSL, к которому применяется выходной цвет?
У меня есть подозрение, что для этого требуется геометрический шейдер... это правильно?
Есть ли другой подход, который позволил бы сделать это в вершинном шейдере или в другом месте?
1 ответ
Если вы связываете всю текстуру тома (или TextureArray), вам действительно нужно использовать Geometry Shader для записи в определенный фрагмент.
Ваша структура вывода GS будет выглядеть так:
struct GSOutput
{
float4 pos : SV_Position;
uint slice : SV_RenderTargetArrayIndex;
//Add anything else you need for your triangle
};
Пожалуйста, обратите внимание, что срез не интерполируется, поэтому, если вам нужно создать несколько срезов, вам нужно выдвинуть один примитив на срез.
Второй случай, когда вы не хотите использовать Geometry Shader.
Создайте описание rendertargetview с теми же параметрами, что и предыдущий, но для каждого среза измените эти параметры (это для массива Texture2DArray, но в основном это то же самое, если вы используете Texture3D):
D3D11_RENDER_TARGET_VIEW_DESC rtvd;
rtvd.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
rtvd.Texture2DArray.ArraySize = 1;
rtvd.Texture2DArray.FirstArraySlice = yourslice;
Теперь у вас есть цель рендеринга только для среза, так что вы можете напрямую связать один срез в конвейере.
Обратите внимание, что это работает, только если вы заранее знаете (в ЦП), к какому срезу будет относиться ваш вызов отрисовки. Также вы можете визуализировать один фрагмент только для этого вызова отрисовки.