Opengl es 如何向二维凹多边形添加轮廓?

Opengl es 如何向二维凹多边形添加轮廓?,opengl-es,Opengl Es,我正在成功地绘制凸多边形,它们构成了下面的白色凹面形状 橙色是我尝试在白色形状周围添加统一轮廓的颜色。正如你所看到的,它不是那么统一。在一些边缘上,橙色根本看不出来 显然使用 glScalef(1.1, 1.1, 0.0); 。。。在我画白色之前,先画一个稍大一点的橙色,这不是一个好办法 我只是有一种唠叨的感觉,我错过了一个更简单的方法 请注意,白色部分将使用具有透明区域的纹理进行贴图,因此橙色部分也需要位于白色形状的后面,而不仅仅是围绕它们 此外,我使用的是平行投影矩阵,这就是为什么glS

我正在成功地绘制凸多边形,它们构成了下面的白色凹面形状

橙色是我尝试在白色形状周围添加统一轮廓的颜色。正如你所看到的,它不是那么统一。在一些边缘上,橙色根本看不出来

显然使用

glScalef(1.1, 1.1, 0.0);
。。。在我画白色之前,先画一个稍大一点的橙色,这不是一个好办法

我只是有一种唠叨的感觉,我错过了一个更简单的方法

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

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


有什么想法吗?谢谢

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

a) 从原始多边形构造拉伸多边形(可能是圆角)

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


第一种方法将产生CPU负载,第二种方法可能会大大降低渲染速度。

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

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

  • 如果输入为白色,则输出白色像素
  • 如果输入像素为黑色,则从当前像素采样半径q内的每个像素;如果其中任何一个为白色,则输出橙色像素,否则输出黑色像素
在实践中,你会在纹理采样上花费大量的时间,这可能会成为瓶颈。它们大多依赖于读取,这对很多GPU上的管道都是有害的,包括为绝大多数OpenGL ES 2.0设备提供电源的PowerVR SGX


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

要补充这个答案:在“卡通着色器”或“cel着色器”上进行谷歌搜索可能是值得的——通常有一个步骤涉及对模型应用大纲的那些。给出的选项通常符合LumpN的(a)和(b),并且作为第三种可能性,在场景完成后运行2d图像空间图像处理边缘检测算法。不过,您可能没有足够的处理时间来处理嵌入的目标。我希望避免这种情况,因为顶点位于VBO中,如果我可以帮助的话,我不想将它们从gpu中拉出:(数据是如何进入VBO的?您是否没有客户端副本,或者没有重新创建副本的方法?如果没有,您可能可以在顶点着色器中执行此工作。