2D几何轮廓着色器

时间:2012-10-11 23:56:20

标签: opengl-es 2d opengl-es-2.0 glsl outline

我想创建一个着色器来勾勒出2D几何体。我正在使用OpenGL ES2.0。我不想使用卷积滤镜,因为轮廓不依赖于纹理,而且它太慢(我尝试将纹理化几何体渲染到另一个纹理,然后使用卷积着色器绘制)。我也尝试过两次通过,第一次是单色的过度尺寸表示oultine,然后在顶部进行正常绘制,但这会产生不同的厚度或不对齐的轮廓。我正在研究如何在细胞阴影中完成剪影,但它们都是使用法线和灯光计算的,我完全不使用它们。

我正在使用Box2D进行物理处理,并拥有带有多个灯具的“可破坏”对象。在任何时候都可以分解一个物体(固定装置被删除),并且我希望轮廓跟随新的外部计数器。 我正在使用顶点缓冲区进行绘制,顶点缓冲区匹配灯具的顶点,预设纹理坐标和绘制三角形的索引。当移除夹具时,索引缓冲区中的关联索引将设置为0,因此不再绘制三角形。 下图显示了一个对象完好无损时的外观。 红点是顶点位置(纹理未显示),黑线是固定装置,蓝线表示三角形绘制的分离。在任何情况下,灰色轮廓都是我想要的轮廓。

1

此图像显示删除了一些灯具的同一物体。

2

这可以在顶点着色器中执行此操作(或与其他简单方法结合使用)吗?任何帮助将不胜感激。

谢谢:)

1 个答案:

答案 0 :(得分:0)

假设你能够对那些从角落略微插入的尴尬点做一些事情(例如,如果你用英语阅读顺序对点进行编号,第一点为'1',则第6点为1) ...

如果一个点在内部,那么如果列出以顺时针顺序连接到它的所有多边形边,则顺序中的每对边将具有一个共同的多边形。如果任何两条边没有共同的多边形,那么它就是一个外部点。

从任何外部点开始,您可以通过首先沿任何方向行走,然后沿着连接到您尚未访问的外部点的任何边缘(或者,不是那个边缘)来获取整个轮廓刚才走了。)

从现有轮廓开始并删除某些部分,您显然可以从用于连接到另一个的外部点开始,但不再从那里开始,只是从那里走,直到到达另一个。

你无法在ES下的着色器中处理这些内容,因为你没有获得连接信息。


我认为您在着色器中可以做的最好的事情是通过沿着曲面法线向外推顶点来扩展几何体。假设您的数据结构是一个矩形列表,每个矩形由一个中心,一个宽度和一个高度来描述,你可以通过绘制每个具有相同的中心来实现相同的目的,但是在宽度和高度上添加少量

要完全通用,您需要将法线存储在顶点处,还要在删除几何体时更新它们。因此,有一些来自CPU的新信息,但它相对有限。