2

我正在使用 C#、Monogame 和 XNA 4.0。在我的场景中,我有很多立方体。有些是连接的,有些没有。我想用另一个着色器而不是填充来渲染立方体的边缘。除此之外,我想用另一种颜色(或更厚)来渲染连接立方体的外边缘,而不是立方体对象内的边缘。这是一张小画,说明我想做什么(对不起我的绘画技巧不好,但我想你会明白的)。

期望的结果

  1. 我知道如何使用特定的着色器渲染立方体,并且我也能够渲染线框,但我无法连接这两种方法。除此之外,用这种方法不能以不同的方式渲染外线。

  2. 我尝试使用漫画着色器的边缘查找等后期效果,但在这种方法中,我不能只渲染特定的边缘。除此之外,如果两个立方体彼此相邻,则着色器不会识别边缘。

我不是从你那里寻找一个现成的解决方案,但我很高兴能得到一些关于如何实现我的目标的提示/方法/教程/类似项目/等。那里有一些着色器专家吗?我已经黔驴技穷了。

(但是,如果您想发布一个现成的解决方案,我不会感到困惑:D)

4

1 回答 1

0

很遗憾您没有使用延迟着色,如果您使用的话,这将是非常直接的实现。

如果您可以通过纹理查找访问屏幕上每个像素的法线和材质,您可以轻松地对其进行后处理。您可以使用 3x3 过滤器内核并搜索足够大的法线不连续性(这将捕获轮廓边缘),还可以搜索位于材质 ID 之间的过渡上的像素(这将捕获蓝色和橙色立方体之间的边缘)。如果您的过滤器邻域满足这两个条件中的任何一个,则绘制一个黑色像素以形成轮廓。

如果在绘制立方体时使用 MRT 渲染,并且将法线 + 材质 ID 编码为 RGBA 纹理(x,y,z,材质),您应该能够做到这一点。

本文描述了基本理论(第 13 页)。在这种情况下,您将使用材质(或对象 ID,如果您希望每个立方体都有一个轮廓),而不是使用深度作为轮廓的次要特征。

于 2013-08-26T01:01:49.987 回答