我创建了一个平面,该平面每平方具有六个顶点,这些顶点构成一个地形。 我使用像素着色器中的地形高度值为每个顶点着色。
我正在寻找一种使顶点之间的像素变黑的方法,同时保持其他所有条件不变以创建网格效果。从线框模式获得的效果相同,除了对角线以外,透明部分应为正常颜色。
我的地形及其在线框模式下的外观:
如何在像素着色器中进行此操作?否则,
答案 0 :(得分:0)
请参阅“固态线框”-几年前的NVIDIA论文。
这个想法基本上是这样的:包括一个几何着色器,该着色器生成重心坐标作为每个顶点的变化。在片段/像素着色器中,检查重组分的值。如果它们低于某个阈值,则可以为像素着色,但是希望为线框着色。否则,请照常照亮。
给出具有顶点A,B,C的面,您将生成重心值:
A:1,0,0
B:0,1,0
C:0,0,1
在片段着色器中,查看该片段的重心的任何分量是否小于0.1。如果是这样,则表示它靠近脸部边缘之一。 (哪个分量低于阈值,如果您想花哨的话,也会告诉您哪个边缘。)
我将查看是否可以找到链接并在此处进行一些更新。
请注意,该纸也已有10年历史了。在某些情况下,如今有一些方法可以在没有几何着色器的情况下获取重坐标,而且我敢肯定还有其他解决方法。 (几何着色器有其位置,但不是性能的最大朋友。)
此外,虽然geom着色器具有出色的性能,但它们比第二遍绘制线框要快得多。在GL(或DX)中以线框模式进行绘制会大大降低性能,因为您要求光栅化器模拟Bresenham的线算法。那不是光栅化器的工作方式,而且发展缓慢。
这种方法还解决了两次通行证可能遇到的任何z对抗问题。
如果网格是单个三角形,则可以跳过几何着色器,而只需将所需的值打包到顶点缓冲区中即可。但是,由于顶点是在除单个三角形之外的任何模型中的面之间共享的,因此事情变得有些复杂。
或者,很有趣:将其作为后期处理步骤进行。在片段着色器中查找高ddx()/ ddy()(或dFdx()/ dFdy(),具体取决于您的API)值。这也使您产生一些有趣的效果。
答案 1 :(得分:0)
鉴于您有一个包含网格中所有顶点的顶点缓冲区,请创建一个利用该顶点缓冲区的索引缓冲区,而不是将3个成对的三角形作为一组,而是将2对成对的线段。这将是“线列表”,并且应包含构成网格正方形的所有对。您可以在程序中自动生成此列表。
用于渲染的粗略算法:
这应会产生您正在寻找的效果,该效果是在顶部绘制有正方形网格的阴影所绘制的。您需要在像素着色器中放置一个开关(通过常量缓冲区),以告诉它何时渲染网格,以便可以将网格绘制为黑色而不是使用高度值。