Opengl es 二维几何体轮廓着色器

Opengl es 二维几何体轮廓着色器,opengl-es,2d,opengl-es-2.0,glsl,outline,Opengl Es,2d,Opengl Es 2.0,Glsl,Outline,我想创建一个着色器来勾勒2D几何体的轮廓。我正在使用OpenGL ES2.0。我不想使用卷积过滤器,因为轮廓不依赖于纹理,而且速度太慢(我尝试将纹理几何体渲染到另一个纹理,然后使用卷积着色器绘制)。我也试着做了两次,第一次是单色超比例几何体来代表一个乌尔丁,然后是顶部的正常绘图,但这会导致不同的厚度或未对齐的轮廓。我一直在研究cel着色中的剪影是如何完成的,但它们都是使用法线和灯光计算的,而我根本不用 我用Box2D做物理,有多个装置的“可破坏”对象。在任何一点上,一个对象都可以被分解(固定装置

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

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

此图显示了删除了几个固定装置的同一对象

在顶点着色器中(或与其他简单方法结合使用)是否可以做到这一点?任何帮助都将不胜感激


谢谢:)

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

如果一个点是内部的,则如果按顺时针顺序列出所有连接到该点的多边形边,则按顺序排列的每对边将有一个公共多边形。如果任意两条边没有共同的多边形,则它是一个外部点

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

从现有轮廓开始并删除一些零件,显然可以从用于连接到另一个但不再连接的任一外部点开始,然后从该外部点一直走到另一个外部点

您无法在ES下的着色器中处理此内容,因为您无法获取连接信息


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


要完全通用,您需要在顶点存储法线,但也需要在删除几何体时更新它们。因此,CPU会推送一些新信息,但这相对有限。

您尝试过这种方法吗@MichaelIV我认为这就是最初的海报所指的“我一直在研究cel阴影中的轮廓是如何完成的,但它们都是使用法线和灯光计算的,我根本不用。”-他有2d对象,而不是3d对象。