如何在OpenGL中实现绘画(带图层支持)?

时间:2011-07-20 10:53:37

标签: c++ opengl opengl-4

情况

我正在实现一个高度字段编辑器,有两个视图。主视图在3D中显示高度字段,启用轨迹球导航。编辑视图将高度字段显示为2D图像 在这个高度场的顶部,可以应用新图像,改变其外观(切孔,下部,上升区域)。这称为补丁 Bouth高度字段和补丁是一个通道灰度png图像。

对于可视化,我使用 visualisation library 框架(c ++)和OpenGL 4。

任务
实现在2D编辑视图(正交投影)中可用的绘图工具,该工具在运行时创建此修补程序(作为单独的图像)。

重要说明/约束

  • 高度场的图像可以缩放,旋转和转置。
  • 补丁需要与高度字段具有相同的比例,因此补丁中的一个像素恰好覆盖了高度字段中的一个像素。
  • 作为缩放的结果,帧缓冲像素的大小可能大于或小于高度场/补丁图像像素的大小。
  • 场景包含不应出现在补丁中的对象(例如:指向箭头)。

问题 这项任务的正确方法是什么?到目前为止,我有以下想法:

  • 使用某种QT画布创建补丁,然后将其映射到高度场图像设置并将其另存为新补丁。这将在用户每次开始绘图时完成,这种方式实现撤销将很容易(删除最后创建的补丁)。
  • 将中性色图像与textre缓冲区对象结合使用,自己实现某种画布。这样,每次用户停止绘制画布的内容时,都会映射到高度字段并保存为补丁。重新设置画布以进行下一个绘图。
  • 这是使用帧缓冲对象的一些示例。但是我不确定这种方法是否符合我的需要。当我使用open gl将子图像绘制到帧缓冲区时,resultig图像是否包含所有数据?

1 个答案:

答案 0 :(得分:1)

这是我的努力:

我使用可视化库的PickIntersector在编辑视图中再次选择高度场图像。 这是图像的当地协调。 有转换为uv coords,它们又转变为像素坐标。 这是在用户按下鼠标按钮时完成的,并且当鼠标在图像上方移动时继续发生。

我有一个PatchCanvas类,它收集所有这些点。在命令上,它使用Anti-Grain Geometry库来精确地栅格化可以从点构造的线。

完成此操作后,栅格化图像将被分割为固定大小的网格。扫描每个瓷砖的颜色与中性瓷砖的颜色不同。仅包含中性色的瓷砖掉落。另一个是在适当的命名模式之后保存的,可以在下一帧中加载。

Agg支持不同大小的行。这个没有实现jet,但是想法是选择屏幕空间中的相邻点,获取那些uv coords,将它们转换为像素并将其用作线条粗细。这应该会导致更大的strockes缩小视图。