【问题标题】:How to set outline for stencil DirectX 11如何为模板 DirectX 11 设置轮廓
【发布时间】:2014-12-15 19:54:02
【问题描述】:

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

【问题讨论】:

    标签: directx-11 slimdx stencil-buffer


    【解决方案1】:

    你已经接近了......这是创建模板缓冲区的情况之一。唯一的问题是,如果您想在此处进行真正的模板缓冲,您需要将深度模板缓冲区设置为可读纹理(对 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 将 C/C++ 对象和结构与 SlimDX 中的 C# 对象和结构交叉引用(查看类/结构文档页面中的非托管对应字段)。

    此外,此方法在所有场景都以相同深度渲染的情况下失败(尽管无论如何都不应该这样做,因为 Z-fighting 会一直踢你的椅子)。在 3D 中制作 2D 图形的更好方法是将组件放置在不同的 Z 轴“层”上,并使用正交投影在 3D 中绘制它们(这可以防止由于透视而缩小更远的图像)。

    最后,由于我已经有一段时间没有编写像素着色器代码了,所以我不太记得在像素着色器中将 1 写入 Z 是否会导致将 1 写入深度缓冲区。我很确定确实如此,但在我给出可靠的建议之前,我需要确认这一点。如果是这样,那么在像素着色器中设置点的Z值可以代替顶点着色器中W对Z的赋值。

    【讨论】:

    • 我很困惑这将如何提供帮助。对于一件事,如果 Z 值是“可能的最远距离”,那么它仍然会通过并被绘制,对吗?另外,所有数据都在同一个 z 水平上,所以如果这个方法确实切掉了像素,它最终不会把它们都切掉吗?另外,当您说“在我们的第二遍中”时,您指的是什么第二遍?
    • 这里有一个更好的描述。我有一张带有线条列表的全国地图。我有一组单一状态的数据。我想用代表该数据的渐变在状态中着色。我用三角形列表绘制它。但是我的一些数据超出了边界。我想将数据剪辑到边框。地图、数据和一切都绘制在同一个 z 水平面上。
    • 是的,Z 缓冲区破解在这种情况下不起作用,但模板也不起作用;并非没有呈现形式的状态形状。如果你有这个,你还不如用数据颜色作为多边形的材质来绘制状态......你确定你需要Direct3D吗?从您更新的描述来看,您似乎更适合 Direct2D 或 GDI。两者都有本地多边形绘图工具包,支持从线段创建填充图元。
    • 这就是我最终采用的解决方案。我使用 DirectX 是因为渐变数据只是我们正在显示的众多数据类型中的一种,并且它必须随着用户放大和缩小以及沿地图扫描而快速更新。 GDI 功能不足以满足我们的需求。 Direct2D 是否支持缩放?
    • Direct2D 支持对图像的转换,可以支持缩放、旋转和平移到单个图像和后台缓冲区。简而言之,是的。 Here 是关于使用缩放系统的快速教程,在父主题中有更多信息。但是,除非您使用的是 Windows 8 或更高版本,否则这不会与 Direct3D 11 完全互操作。如果您无法进行切换(或者您被强制不进行切换),那么我会考虑使用带有正交投影的“假”3D 来分层绘制。
    猜你喜欢
    • 2019-02-21
    • 1970-01-01
    • 2013-09-21
    • 2018-11-04
    • 2015-07-30
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 2018-05-03
    相关资源
    最近更新 更多