如何设置模板DirectX 11的大纲

时间:2014-12-15 19:54:03

标签: directx-11 slimdx stencil-buffer

我对DirectX和图形编码很陌生。我正在使用SlimDX进行实施。我正在绘制一张地图,显示特定区域的数据的直观表示。我想做的就是采用状态形状,如果像素在该区域内,则绘制它,否则,不要。这基本上就是模板,对吧?但我无法弄清楚我应该如何为模板缓冲区设置该多边形。或者这不是模板缓冲区用于什么?

1 个答案:

答案 0 :(得分:0)

你很接近......这是创建模板缓冲区的一种情况。唯一的问题是,如果你想在这里进行真正的模板缓冲,你需要将深度模板缓冲区设置为可读纹理(对于GPU),因为你需要读取模板缓冲区来弄清楚什么像素需要丢弃。这是一种“更简单”的方法,它涉及欺骗深度缓冲区为我们执行读取/比较/丢弃步骤。

在普通3D渲染中,我们将所有对象绘制到后台缓冲区。当我们这样做时,GPU使用深度模板缓冲区来确定哪些像素“落后”其他先前绘制的像素。最远的像素可以是Z值1.0f,最接近的可以是Z值0.0f。我们能做的是将深度模板缓冲区清零,将深度比较设置为始终通过,当我们绘制形状时,我们的顶点着色器将顶点的Z值设置为绘制为W.当我们最终执行透视时除(光栅化的一部分),我们得到一个1.0f的Z坐标,它可能是最远的。在我们的第二个渲染过程中,渲染可以正常进行,GPU将剪切出不在形状区域内的绘制数据的像素。

换一种更简单的方法: 在这种方法中,我们有效地在场景前面拿着一张纸,上面有一个洞,就是我们模板的确切形状。当绘制实际场景时,除了我们的形状(“洞”)之外,它在所有地方的“模板后面”绘制,制作精确的剪切。在正常的3D渲染中,事物通常介于0和1之间。所有这些对象都将被正常绘制,但是模板区域之外的任何内容都将无法通过深度测试(因为我们将所有内容设置为零除了形状在哪里并被修剪。

此方法需要两个渲染过程,一个是将模板形状渲染到深度缓冲区,另一个是将数据颜色渲染到后台缓冲区。

请注意,如果您计划在问题描述中执行更多操作,则此方法可能需要进行调整。它适用于简单的场景,但对于更复杂的场景,您需要读取模板缓冲区。 This虽然在C / C ++中,但是对该主题是一个很好的概述,并且直接适用于SlimDX,因为SlimDX只是本机C / C ++ API的一个薄包装器。您可以使用this与SlimDX中的C#交叉引用C / C ++对象和结构(查看类/结构文档页面中的非托管对应字段)。

此外,此方法失败,场景全部呈现在相同的深度级别(尽管不应该这样做,因为Z-fighting会在整个过程中踢你的椅子)。在3D中执行2D图形的更好方法是将组件放置在不同的Z轴“层”上,并使用正交投影在3D中绘制它们(这可以防止由于透视而缩小更远的图像)。

最后,因为我还没有在一段时间内编写像素着色器代码,所以我不太清楚在像素着色器中将一个写入Z会导致将一个写入深度缓冲区。我很确定它确实如此,但在我给它作为可靠的建议之前我需要确认一下。如果是这样,那么在像素着色器中设置点的Z值可以替换顶点着色器中W到Z的赋值。