问题遇到的现象和发生背景
本人正在学习基于Qt使用现代OpenGL绘制多边形图层,最终目标为下图中效果
上图中用7个点画出一个自交多边形,使用图片填充,之后为P1添加2个控制点,P1-P2和P1-P7之间为贝塞尔曲线,拖动2个控制点,图层边界实时改变,十分流畅
问题相关代码,请勿粘贴截图
我自己使用GLUtesselator实现了无贝塞尔的版本,效果图如下
部分代码如下
GLdouble quad[12][3] = {
{-0.5, 0.5, 0.0},
{ 0.5, 0.5, 0.0},
{-0.5,-0.5, 0.0},
{ 0.5,-0.5, 0.0},
{-0.5,-0.3, 0.0},
{ 0.0,-0.8, 0.0},
{-0.8,-0.8, 0.0}
};
GLUtesselator* tobj = gluNewTess();
if (!tobj) return;
gluTessCallback(tobj, GLU_TESS_VERTEX, (void (CALLBACK *)())callback_tess_vertex);
gluTessCallback(tobj, GLU_TESS_BEGIN, (void (CALLBACK *)())callback_tess_begin);
gluTessCallback(tobj, GLU_TESS_END, (void (CALLBACK *)())callback_tess_end);
gluTessCallback(tobj, GLU_TESS_ERROR, (void (CALLBACK *)())callback_tess_error);
gluTessCallback(tobj, GLU_TESS_COMBINE, (void (CALLBACK *)())callback_tess_combine);
gluTessBeginPolygon(tobj,NULL);
gluTessBeginContour(tobj);
gluTessVertex(tobj, quad[0], quad[0]);
gluTessVertex(tobj, quad[1], quad[1]);
gluTessVertex(tobj, quad[2], quad[2]);
gluTessVertex(tobj, quad[3], quad[3]);
gluTessVertex(tobj, quad[4], quad[4]);
gluTessVertex(tobj, quad[5], quad[5]);
gluTessVertex(tobj, quad[6], quad[6]);
gluTessEndContour(tobj);
gluTessEndPolygon(tobj);
gluDeleteTess(tobj);
运行结果及报错内容
虽然上面的代码画出了非贝塞尔多边形,但我不知道怎么画贝塞尔多边形
我的解答思路和尝试过的方法
我的思路是先把贝塞尔线条的所有点都算出来,然后逐个用gluTessVertex来画,但是实测超过10万个点后,明显卡顿,无法满足设计要求
我想要达到的结果
最终需求:
有一张背景图片
叠加多个复杂的贝塞尔多边形图层,可以调整图层顺序,上层图层覆盖下层图层
各个图层使用GLSL脚本对背景图片进行处理,渲染到默认的帧缓冲
贝塞尔的控制点要支持实时拖动,不允许卡顿
当前疑惑:
目前的思路对不对?要画出上方第一张图的效果,正确的路线是什么?
除了GLUtesselator外,是否有别的方式能画出这种图形?
(GLUtesselator似乎不是现代OpenGL,我还是想用OpenGL,而且我还要给这个多边形传递贴图通道)
望各位指点不一定要代码有思路就好不胜感激