我成功地绘制了凸多边形,构成了下面的白色凹面形状。
橙色是我尝试在白色形状周围添加均匀轮廓。正如你所看到的那样,它并不那么统一。在某些边缘,橙色根本不显示。
显然正在使用......
glScalef(1.1, 1.1, 0.0);
...在我画出白色形状之前绘制一个略大的橙色形状是不可取的。
我只是有一种唠叨的感觉,我错过了一种更简单的方法来做到这一点。
请注意,白色部分将使用具有透明区域的纹理进行映射,因此橙色部分也需要隐藏白色形状,而不仅仅是围绕它们。
另外,我使用平行投影矩阵,这就是glScalef的z设置为0.0的原因 - 提醒我没有透视缩放。
有什么想法吗?谢谢!
答案 0 :(得分:3)
不,在这种情况下你不会去任何地方使用glScale。可能的选项是
a)从原始的多边形构造一个挤压多边形(可能是圆角的尖角)
b)使用GL_LINES绘制多边形并将glLineWidth设置为所需的轮廓宽度(事实上,您可能希望先绘制宽度为2x的轮廓)
第一种方法会产生CPU负载,第二种方法可能会减慢渲染速度AFAIK。
答案 1 :(得分:0)
不幸的是,没有简单的方法来获得一致宽度的轮廓 - 你只需要做数学: 对于每条边:计算法线,缩放到所需宽度,然后添加到边顶点以在新的扩展边上获得线段 计算通过两个相邻段的线的交点以找到扩展的顶点位置
答案 2 :(得分:0)
迄今为止所提供的答案的明确答案,仅为了兴趣而发布;如果您在GLES 2.0中有权访问着色器,那么您可以将源多边形渲染为一个纹理绑定为颜色渲染缓冲区的帧缓冲区,然后再进行第二次解析以写入屏幕(因此您使用的是图像白色多边形作为输入纹理,并为屏幕上的每个像素运行后处理像素着色器),着色器遵循以下逻辑,用于厚度q的轮廓:
在实践中,你会花费大量的纹理采样,并可能将其转化为瓶颈。它们主要是依赖读取,这对许多GPU的管道都不利 - 包括为绝大多数OpenGL ES 2.0设备供电的PowerVR SGX。
编辑:实际上,你可以大大提高速度;如果您的半径为q,则让硬件为您的帧缓冲对象生成mip贴图,在源图像中选择输出像素至少q乘q的第一个。然后你基本上得到了一组箱子,如果那个区域没有多边形的部分就是纯黑色,如果那个区域完全是多边形的内部,那么就是纯白色。对于您正在考虑的每个输出片段可能位于边界上,您很可能只是直接得到明确的结果,或者基于mipmap的四个样本在边界之外和之外。