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

     2023-02-22     78

关键词:

【中文标题】如何在 OpenGL 中实现绘画(支持图层)?【英文标题】:How to implement painting (with layer support) in OpenGL? 【发布时间】:2011-07-20 10:53:36 【问题描述】:

情况

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

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

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

重要说明/限制

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

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

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

【问题讨论】:

如何在 3D 中绘制高度场?您是否正在寻找从 2D 地图中绘制高度场的算法? 没有。绘制高度字段可以正常工作。我使用 2D 纹理和自定义着色器,它也将存储在 texture2DArray 中的补丁应用到高度场。这一切正常。我不确定如何在运行时创建新的。 “可视化库框架”? This one?如果是这样,请编辑您的问题并添加链接。 吉普那个。我会链接它。 这是作业的剪切和粘贴工作还是一些最低端的承包网站?请为鲍勃,自己解决你的作业。它实际上对你有好处。您(或关心您的人)实际上支付了您的教育费用!让其他人完成它会浪费机会和原始现金。 【参考方案1】:

这就是我的结局:

我使用可视化库的 PickIntersector 在编辑视图中再次选择高度场图像。 这会产生图像的局部坐标。 转换为 uv 坐标,然后转换为像素坐标。 这在用户按下鼠标按钮时完成,并在鼠标移动到图像上方时继续发生。

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

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

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

【讨论】:

如何在OpenGL中实现灰度渲染?

】如何在OpenGL中实现灰度渲染?【英文标题】:howtoimplementgrayscalerenderinginOpenGL?【发布时间】:2010-10-2610:37:18【问题描述】:在渲染带纹理的多边形场景时,我希望能够在原始颜色渲染和“灰度”模式之间切换。我一直在尝试使... 查看详情

如何在OpenGL中实现形状的原位旋转和旋转状态下的移动?

】如何在OpenGL中实现形状的原位旋转和旋转状态下的移动?【英文标题】:HowdoyouimplementtherotationoftheshapeinplaceandthemovementinarotatedstateinOpenGL?【发布时间】:2018-11-2307:51:04【问题描述】:如何实现形状的原地旋转和旋转状态下的移... 查看详情

OpenGL ES - 如何在 Blender Cycles Render 中实现光泽着色器?

】OpenGLES-如何在BlenderCyclesRender中实现光泽着色器?【英文标题】:OpenGLES-HowtoimplementtheGlossyShaderinBlenderCyclesRender?【发布时间】:2015-01-1320:37:00【问题描述】:在BlenderCycles渲染中,有一个名为Glossy的着色器类型。现在我想在Android... 查看详情

在OpenGL中实现边界球碰撞

...。那么我怎样才能首先计算每个立方体的中心点呢?以及如何获得围绕它的球体半径?计算这 查看详情

OpenGL 在延迟渲染器中实现天空盒

...发布时间】:2015-12-1922:46:16【问题描述】:我试图弄清楚如何在延迟渲染器中渲染天空盒,以便它可以包含在后期处理效果中,但是我的几何阶段在视图空间中,不幸的是,这个阶段的天空盒会受到它的位置的影响像任何物体一... 查看详情

在 OpenGL ES 2 中实现 VBO 以渲染精灵

...高OpenGL中的渲染速度,虽然我了解整体概念,但我不确定如何在带有精灵的2D中实现。我发现的所有实现似乎都是用于绘制所有顶点相对于彼此固定的3D模型。然而,在2D游戏中,每个精灵都有自己的位置,因此也有自己的 查看详情

在OpenGL中实现VBO,窗口保持黑色

】在OpenGL中实现VBO,窗口保持黑色【英文标题】:ImplementingVBOinOpenGL,thewindowstayblack【发布时间】:2014-04-2119:05:14【问题描述】:我正在尝试通过我的VBO/OpenGL练习来解决一个错误,但在几个小时(几天)之后,我无法找到问题所... 查看详情

在 OpenGL 中实现固定坐标系

】在OpenGL中实现固定坐标系【英文标题】:ImplementingaFixedCoordinatesysteminOpenGL【发布时间】:2010-08-2321:30:49【问题描述】:我的项目的简单版本是根据用户输入旋转球体。但是,由于openGL的本地坐标系,在某些情况下多次旋转后我... 查看详情

如何使用springs在tomcat连接池中实现XA连接支持?

】如何使用springs在tomcat连接池中实现XA连接支持?【英文标题】:HowtoimplementXAconnectionsupportintomcatconnectionpoolusingsprings?【发布时间】:2015-12-1711:08:28【问题描述】:我必须在我的mule流中实现支持XA事务的jdbc连接池。使用弹簧,我... 查看详情

如何在 numpy 中实现定点二进制支持

】如何在numpy中实现定点二进制支持【英文标题】:Howtoimplementfixed-pointbinarysupportinnumpy【发布时间】:2019-08-2904:06:29【问题描述】:我有一个自制的二进制定点算术支持库,并想添加numpy数组支持。具体来说,我希望能够传递定... 查看详情

opengl中实现双缓冲技术

在OpenGL中实现双缓冲技术的一种简单方法:1.在调用glutInitDisplayMode函数时,开启GLUT_DOUBLE,即glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE);。这里将我们惯用的GLUT_SINGLE替换为GLUT_DOUBLE,意为要使用双缓冲而非单缓冲。2.调用glutDisplayFunc(display)... 查看详情

如何在 WebGL 中实现阴影映射?

】如何在WebGL中实现阴影映射?【英文标题】:HowtoimplementshadowmappinginWebGL?【发布时间】:2016-01-1413:34:45【问题描述】:我第一次尝试在WebGL场景中实现阴影,据我所知,最直接的方法是使用阴影贴图,但我找不到解释这个概念的... 查看详情

当我在网格/面中实现索引时,为啥它会返回 OpenGL 错误?

】当我在网格/面中实现索引时,为啥它会返回OpenGL错误?【英文标题】:whenIimplementindicesintoamesh/face,whydoesitreturnanOpenGlerror?当我在网格/面中实现索引时,为什么它会返回OpenGL错误?【发布时间】:2019-11-0318:28:17【问题描述】:... 查看详情

如何使用 Quickblox 在 Cordova 应用程序中实现推送通知支持?

】如何使用Quickblox在Cordova应用程序中实现推送通知支持?【英文标题】:HowtoimplementpushnotificationsupportinCordovaappusingQuickblox?【发布时间】:2015-03-3113:34:49【问题描述】:对于这样一个基本问题,我深表歉意,但我真的找不到任何... 查看详情

如何在mq中实现支持任意延迟的消息?

什么是定时消息和延迟消息?定时消息:Producer将消息发送到MQ服务端,但并不期望这条消息立马投递,而是推迟到在当前时间点之后的某一个时间投递到Consumer进行消费,该消息即定时消息。延迟消息:Producer将消息发送到MQ服... 查看详情

如果设备默认不支持,j2me如何在应用程序中实现横向

】如果设备默认不支持,j2me如何在应用程序中实现横向【英文标题】:j2mehowtoimplementlandscapeorientationinapplicationifdevicedoesn\'tsupportitbydefault【发布时间】:2011-04-1017:47:02【问题描述】:我有诺基亚2323c设备,我想以横向模式显示我... 查看详情

如何在 mac 的核心数据中实现部分?

】如何在mac的核心数据中实现部分?【英文标题】:Howdoiimplementsectionincoredataformac?【发布时间】:2012-01-0114:52:09【问题描述】:iOS为NSFetchedResultsController类提供了分段支持:NSFetchedResultsController*aFetchedResultsController=[[NSFetchedResultsCo... 查看详情

如何在 .Net 中实现 ConcurrentHashSet

】如何在.Net中实现ConcurrentHashSet【英文标题】:HowtoimplementConcurrentHashSetin.Net【发布时间】:2011-05-1710:56:21【问题描述】:我正在尝试本着ConcurrentDictionary的精神实现一个ConcurrentHashSet,采取的方法是使用内部支持ConcurrentDictionary... 查看详情