1

我想创建一个着色器来勾勒 2D 几何图形。我正在使用 OpenGL ES2.0。我不想使用卷积过滤器,因为轮廓不依赖于纹理,而且速度太慢(我尝试将纹理几何体渲染到另一个纹理,然后使用卷积着色器绘制它)。我也尝试过 2 次通过,第一次是单色超比例几何体来表示一个 oultine,然后在顶部进行正常绘图,但这会导致不同的厚度或未对齐的轮廓。我正在研究 cel-shading 中的剪影是如何完成的,但它们都是使用法线和灯光计算的,我根本不使用。

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

1

此图像显示了删除了一些固定装置的同一对象。

2

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

谢谢 :)

4

1 回答 1

0

假设你能够对那些从角落稍微插入的尴尬点做点什么(例如,如果你按照英语阅读顺序对点进行编号,第一个是“1”,第 6 点就是一个)......

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

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

从现有轮廓开始并删除一些部分,您显然可以从曾经连接到另一个但不再连接的外部点开始,然后从那里步行直到到达另一个。

你不能在 ES 下的着色器中处理这些东西,因为你没有得到连接信息。


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

为了完全通用,您需要在顶点存储法线,但还需要在删除几何图形时更新它们。所以会有一些来自 CPU 的新信息推送,但相对有限。

于 2012-10-12T02:51:55.027 回答