weixin_40196536 2022-06-18 16:49 采纳率: 0%
浏览 78
已结题

OpenGL 复杂多边形 贝塞尔 贴图

问题遇到的现象和发生背景

本人正在学习基于Qt使用现代OpenGL绘制多边形图层,最终目标为下图中效果

img

上图中用7个点画出一个自交多边形,使用图片填充,之后为P1添加2个控制点,P1-P2和P1-P7之间为贝塞尔曲线,拖动2个控制点,图层边界实时改变,十分流畅

问题相关代码,请勿粘贴截图

我自己使用GLUtesselator实现了无贝塞尔的版本,效果图如下

img

部分代码如下
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,而且我还要给这个多边形传递贴图通道)

望各位指点不一定要代码有思路就好不胜感激

  • 写回答

2条回答 默认 最新

  • 日天君 2022-06-18 19:06
    关注

    我之前研究贝塞尔的时候用的是MFC,没有用Qt,如果你想研究的是如何绘制贝塞尔曲线,这是我当初学习后的代码,你看是否演示地和你预想的一样

    img

    评论
    1人已打赏

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月19日
  • 创建了问题 6月18日

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog