如何渲染立方体的特定边不同于填充XNA? (Monogame)

时间:2013-08-25 18:10:22

标签: c# xna shader monogame edges

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

Desired Results

  1. 我知道如何使用特定着色器渲染多维数据集,我也能够渲染线框,但我无法连接这两种方法。除此之外,使用这种方法不能对外线进行不同的渲染。

  2. 我尝试了类似漫画着色器边缘搜索的后期效果,但在这种方法中,我无法渲染特定的边缘。除此之外,如果两个立方体彼此相邻,则着色器无法识别边缘。

  3. 我不是在寻找一个随时可用的解决方案,但我很乐意获得一些关于如何实现目标的提示/方法/教程/类似项目等。那里有一些着色专家吗?我在我的智慧结束。

    (如果你想发布一个现成的解决方案,我就不会傻了:D)

1 个答案:

答案 0 :(得分:0)

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

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

如果在绘制立方体时使用MRT渲染,并且将普通+材质ID编码为RGBA纹理(x,y,z,材质),则应该能够执行此操作。

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