3
在HLSL/Directx11中工作时,我发现有两种绑定3D渲染目标的方法:要么绑定整个目标,要么绑定它,同时指定一个图层。在顶点着色器中指定3D渲染目标图层? [HLSL]
如果绑定整个目标,如何指定应用了输出颜色的HLSL代码中的图层?
我怀疑这需要几何着色器...是否正确?
是否有任何其他方法可以在顶点着色器或其他地方完成此操作?
在HLSL/Directx11中工作时,我发现有两种绑定3D渲染目标的方法:要么绑定整个目标,要么绑定它,同时指定一个图层。在顶点着色器中指定3D渲染目标图层? [HLSL]
如果绑定整个目标,如何指定应用了输出颜色的HLSL代码中的图层?
我怀疑这需要几何着色器...是否正确?
是否有任何其他方法可以在顶点着色器或其他地方完成此操作?
如果绑定整个卷纹理(或TextureArray),则确实需要使用几何着色器来写入特定的切片。
您的GS输出结构如下所示:
struct GSOutput
{
float4 pos : SV_Position;
uint slice : SV_RenderTargetArrayIndex;
//Add anything else you need for your triangle
};
请不该片是不是插值,所以如果你需要发出你需要推动一个每片原始的几片。
您不想使用几何着色器的第二种情况。
创建具有相同的参数与前一个一rendertargetview描述,但针对每个片改变这些参数(这是一个Texture2DArray,但它主要是相同的,如果你使用Texture3D):
D3D11_RENDER_TARGET_VIEW_DESC rtvd;
rtvd.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
rtvd.Texture2DArray.ArraySize = 1;
rtvd.Texture2DArray.FirstArraySlice = yourslice;
现在,您只有切片的渲染目标,因此您可以直接绑定管道中的单个切片。
请注意,这仅适用于您事先知道(在CPU中)绘制调用将呈现给哪个切片的情况。此外,您只能为该绘制调用渲染一个切片。
所以这是唯一的方法?如果您在绘图调用之前知道有一个四边形,您希望进入第0层,而另一个四边形到第1层。可以在不使用几何着色器的情况下,通过一次绘制调用来完成此操作,方法是打包正确的信息(不知何故)在顶点数据(或其他流)从CPU端? – James
用切片示例更新答案。 – catflier
刚刚意识到它实际上是可能的......使用多个渲染目标。将3D纹理的每个切片绑定到单独的渲染目标插槽。然后你的顶点着色器输出n种颜色,其中n是切片的数量,但只有其中的一种(根据顶点着色器逻辑或其他地方决定)将被分配着色器计算的颜色。使用加法混合模式进行渲染,以及一个着色器,每个像素使用一个绘制调用渲染到您选择的三维切片。 – James