2013-09-24 37 views
3

在HLSL/Directx11中工作时,我发现有两种绑定3D渲染目标的方法:要么绑定整个目标,要么绑定它,同时指定一个图层。在顶点着色器中指定3D渲染目标图层? [HLSL]

如果绑定整个目标,如何指定应用了输出颜色的HLSL代码中的图层?

我怀疑这需要几何着色器...是否正确?

是否有任何其他方法可以在顶点着色器或其他地方完成此操作?

回答

3

如果绑定整个卷纹理(或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

所以这是唯一的方法?如果您在绘图调用之前知道有一个四边形,您希望进入第0层,而另一个四边形到第1层。可以在不使用几何着色器的情况下,通过一次绘制调用来完成此操作,方法是打包正确的信息(不知何故)在顶点数据(或其他流)从CPU端? – James

+0

用切片示例更新答案。 – catflier

+0

刚刚意识到它实际上是可能的......使用多个渲染目标。将3D纹理的每个切片绑定到单独的渲染目标插槽。然后你的顶点着色器输出n种颜色,其中n是切片的数量,但只有其中的一种(根据顶点着色器逻辑或其他地方决定)将被分配着色器计算的颜色。使用加法混合模式进行渲染,以及一个着色器,每个像素使用一个绘制调用渲染到您选择的三维切片。 – James

相关问题