我的任务是通过Stage3d(Adobe Flash)技术呈现二次贝塞尔曲线(路径),但此技术默认没有任何扩展来进行绘制(而我所知道的OpenGl有此功能)。是的,有一个Starling-Extension-Graphics,但它使用简单方法将曲线段分割为许多直线,这会为我的长曲线路径生成非常多的三角形。
所以...针对Loop和Blinn,有一种完美的方式来呈现分辨率独立的形状。我已经阅读了GPUGems3文章(gpugems3_ch25.html),并将其片段着色器移植到AGAL2:
二次曲线像素着色器
float4 QuadraticPS(float2 p : TEXCOORD0,
float4 color : COLOR0) : COLOR
{
// Gradients
float2 px = ddx(p);
float2 py = ddy(p);
// Chain rule
float fx = (2*p.x)*px.x - px.y;
float fy = (2*p.x)*py.x - py.y;
// Signed distance
float sd = (p.x*p.x - p.y)/sqrt(fx*fx + fy*fy);
// Linear alpha
float alpha = thickness - abs(sd);
if (alpha > 1) // Inside
color.a = 1;
else if (alpha < 0) // Outside
clip(-1);
else
// Near boundary
color.a = alpha;
return color;
}
它能工作。但是存在两个根本性问题:
我不了解那个算法:(。我阅读了有关有符号距离场、导数等的内容......我想了很多小时,又重新阅读了一遍——但没有结果!我的问题是:是否有人可以帮我解释一下该着色器中发生了什么(如果可能,逐行解释!)?第二个问题是曲线在三角形的拐角处被剪裁,并且具有可变厚度。请看图片: https://monosnap.com/file/84EBOuQ1czNM5lprQ5VlnRUKP2mKmW 所以如果我画一条路径,它看起来像这样:https://monosnap.com/file/54Zs5Xui6s3BL6lNdZRCx9ibcV2bCF
我喜欢使用每个曲线段一个三角形的方法,因为不需要任何几何形状。我不需要非常厚的曲线(1-2像素很好),但是可变厚度是一个问题。有人可以帮助我吗?
(对不起我的英语。这不是我的母语。)
[Spektre的编辑1] 从评论和无效答案中移动
我计划使用每个曲线段一个三角形,就像图片上所示
- 路径由许多三角形组成
- 每个路径段(二次曲线)一个三角形
- 如果所有控制点共线(位于同一条直线上)或几乎共线,则如何处理此方法的问题?