繁体   English   中英

如何为二维凹多边形添加轮廓?

[英]How do I add an outline to a 2d concave polygon?

我成功绘制了构成以下白色凹形的凸多边形。

大纲示例

橙色是我试图在白色形状周围添加一个统一的轮廓。 如您所见,它不是那么统一。 在某些边缘,橙色根本不显示。

显然使用...

glScalef(1.1, 1.1, 0.0);

...在我画白色形状之前画一个稍微大一点的橙色形状不是 go 的方法。

我只是有一种唠叨的感觉,我错过了一种更简单的方法来做到这一点。

请注意,白色部分将使用具有透明区域的纹理进行映射,因此橙色部分也需要位于白色形状的后面,而不仅仅是围绕它们。

此外,我使用的是平行投影矩阵,这就是为什么将 glScalef 的 z 设置为 0.0 - 提醒我没有透视缩放。

有任何想法吗? 谢谢!

不,你不会在这种情况下使用glScale去任何地方。 可能的选择是

a)从原始的多边形构造一个挤压多边形(可能是圆角)

b)用GL_LINES绘制多边形并将glLineWidth设置为所需的轮廓宽度(事实上,您可能希望先绘制2x宽度的轮廓)

第一种方法会产生CPU负载,第二种方法可能会减慢渲染速度AFAIK。

您可以在指南针的 8 个方向上移动多边形。 你可以看看这个链接: http://simonschreibt.de/gat/cell-shading/

这是一个很好的技巧,可能会完成这项工作

遗憾的是,没有简单的方法来获得一致宽度的轮廓 - 您只需要进行数学计算:对于每条边:计算法线,缩放到所需的宽度,然后添加到边顶点以获得新的线段扩展边缘计算通过两个相邻线段的线的交点以查找扩展的顶点位置

迄今为止提供的答案的独特答案,仅仅是为了兴趣而发布; 如果您在GLES 2.0中有权访问着色器,那么您可以将源多边形渲染为一个纹理绑定为颜色渲染缓冲区的帧缓冲区,然后再进行第二次解析以写入屏幕(因此您使用的是图像白色多边形作为输入纹理,并为屏幕上的每个像素运行后处理像素着色器),着色器遵循厚度q轮廓的以下逻辑:

  • 如果输入为白色,则输出白色像素
  • 如果输入像素是黑色,则从当前像素中采样q半径内的每个像素; 如果它们中的任何一个是白色,则输出橙色像素,否则输出黑色像素

在实践中,你会花费大量的纹理采样,并可能将其转化为瓶颈。 它们主要是依赖读取,这对许多GPU的管道都不利 - 包括为绝大多数OpenGL ES 2.0设备供电的PowerVR SGX。

编辑:实际上,你可以大大提高速度; 如果您的半径为q,则让硬件为您的帧缓冲对象生成mip贴图,在源图像中选择输出像素至少q乘q的第一个。 然后你基本上得到了一组箱子,如果那个区域没有多边形的部分就是纯黑色,如果那个区域完全是多边形的内部,那么就是纯白色。 对于您正在考虑的每个输出片段可能位于边界上,您很可能直接得到明确的结果,或者基于mipmap的四个样本明确地超出边界。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM