c++ - 如何使用 dear imgui 填充两条贝塞尔曲线之间的区域

标签 c++ opengl glfw

如何使用 dear imgui 填充两条贝塞尔曲线之间的区域?

我使用 ImDrawList API 绘制曲线,如下所示:

        ImVec2 p0(10, 100); ImVec2 c1(110, 50); ImVec2 p1(210, 100);
        ImVec2 q0(10, 200); ImVec2 c2(110, 100); ImVec2 q1(210, 200);

        auto col = IM_COL32(0,255,255, 255);

        ImDrawList* draw_list = ImGui::GetWindowDrawList();

        draw_list->AddBezierCurve(p0, c1, c1, p1, col, 1.0f);
        draw_list->AddBezierCurve(q0, c2, c2, q1, col, 1.0f);

        // I can close the curves, visually, with these lines
        draw_list->AddLine(p0, q0, col, 1.0f);
        draw_list->AddLine(p1, q1, col, 1.0f);

编辑:

我使用有状态 API 绘制了我想要的路径,然后我调用了一个函数来填充这条路径。这是代码:

        draw_list->PathLineTo(p0);
        draw_list->PathBezierCurveTo(c1, c1, p1);
        draw_list->PathLineTo(q1);
        draw_list->PathBezierCurveTo(c2, c2, q0);

        draw_list->PathFillConvex(col);

但是如您所见,有些地方不对:

result

正确的几何图形以白色绘制。

最佳答案

您遇到的问题是,OpenGL 中的填充图元仅针对 图元定义。一个集合被定义为如果对于集合内的任意两个点您可以在这些点之间画一条线而不离开所述集合的边界。

Dear-ImGUI 大多只是将翻译后的绘图命令按原样传递给 OpenGL,没有任何中间 segmentation 。 …这会导致您看到的问题,以及为什么填充函数的名称中有 …Convex 部分。

解决方案是要么将非凸形状分解为更小的凸子形状,要么使用也适用于凸形状的填充方法,例如 scanline算法(使用计算着色器最容易在 GPU 上实现)。

关于c++ - 如何使用 dear imgui 填充两条贝塞尔曲线之间的区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47846087/

相关文章:

c++ - 如何使用友元运算符存储一串字符?

c++ - Pcrecpp 比赛

c++ - 如何在 Linux 中使用 GLFW 函数正确链接 C++ 对象?

c++ - 如何在 GLFW 中为游戏引擎创建正确的输入类

c++ - OpenGL - 为什么我会收到此错误?不支持 COMPILATION_FAILED 版本 '330'

来自子类型的 C++ 模板特化

c++ - 尽管使用 EXTERN "C",但从 C++ 调用 C 函数时出现链接器错误

c++ - OpenGL gl*Pointer 函数有什么作用

c++ - 使用 GL_LINE_LOOP 绘制多个圆

opengl - 简单 OpenGL 图像库 (SOIL) 使用已弃用的功能?