记一个QT中QOpenGLWidget-与-QGLWidget的坑

  因为QGLWidget在文档中显示过时,就采用了QOpenGLWidget,因为要用到多重采样来抗锯齿

QSurfaceFormat format;
format.setSamples(4);
QSurfaceFormat::setDefaultFormat(format);

结果造成像素深度winz无法读取

glReadPixels((int)winx, (int)winy, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT,&winz); 

winz一直不会改变。

  这个bug找了两天多,最终才确定是QOpenGLWidget的多重采样造成的。在QT文档中有

	QOpenGLWidget always renders offscreen, using framebuffer objects. QGLWidget on the other hand uses a native window and surface.

同时关于Multisampling的记录是

Multisampling
	To enable multisampling, set the number of requested samples on the QSurfaceFormat that is passed to setFormat(). On systems that do not support it the request may get ignored.
	Multisampling support requires support for multisampled renderbuffers and framebuffer blits. On OpenGL ES 2.0 implementations it is likely that these will not be present. This means that multisampling will not be available. With modern OpenGL versions and OpenGL ES 3.0 and up this is usually not a problem anymore. 

  可以看到它是**离屏渲染(offscreen)**的,要求使用multisampled renderbuffersframebuffer,这是一个很大的不同,所以如果坚持要使用它并且要用到读取深度之类的可行思路是重新绑定FBO后去读取。而在QGLWidget中只需要在构造函数的初始化列表中用

:QGLWidget(QGLFormat(QGL::SampleBuffers | QGL::AlphaChannel), parent)
### 回答1: 雷达扫描图可以通过使用QOpenGLWidgetQGLWidget来实现。这两个类都是Qt用于OpenGL渲染的窗口部件,可以用于绘制雷达扫描图等图形。 首先,我们需要重写QOpenGLWidgetQGLWidget类的绘制函数来绘制雷达扫描图。通过设置OpenGL视口和投影矩阵,我们可以定义一个2D或3D场景,用于绘制雷达扫描效果。 在绘制函数,我们可以使用OpenGL的绘制函数来绘制雷达扫描图形。例如,我们可以使用圆形绘图函数来绘制一个雷达扫描范围,然后使用线段绘制函数来绘制扫描线,以模拟雷达的运动。还可以使用颜色设置函数来设置扫描线和扫描图形的颜色。 除了绘制函数,我们还可以在QOpenGLWidgetQGLWidget使用其他函数来处理雷达扫描图的交互。例如,可以使用鼠标事件来控制雷达的旋转或缩放,还可以使用定时器来实现扫描线的动画效果。 最后,在主程序,我们可以创建一个QOpenGLWidgetQGLWidget对象,并将其添加到Qt应用程序的界面。通过设置正确的窗口大小和OpenGL版本,我们可以在应用程序显示雷达扫描图,并使用其他Qt部件来调整雷达扫描效果。 总而言之,通过使用QOpenGLWidgetQGLWidget类,结合OpenGL绘图函数和Qt的其他功能,我们可以创建出具有雷达扫描效果的图形界面。 ### 回答2: QOpenGLWidgetQGLWidget 都是Qt用于显示OpenGL图形的窗口控件类。它们都可以用来实现雷达扫描图。雷达扫描图通常是通过将一个或多个旋转的扇形线段渲染到窗口上实现的。 使用这两个类的任何一个来创建雷达扫描图,首先需要重写其绘制函数,并在该函数使用OpenGL进行绘制操作。在绘制函数,可以使用OpenGL提供的旋转、平移和缩放等变换函数来实现雷达扫描图的移动和缩放效果。 具体绘制雷达扫描图的步骤如下: 1. 创建一个QOpenGLWidgetQGLWidget类的子类,并重写其绘制函数(paintGL函数); 2. 在绘制函数,使用OpenGL函数来设置绘制参数,如绘制颜色、线宽等; 3. 使用OpenGL函数来进行坐标变换,如平移、旋转、缩放等,以绘制旋转的扇形线段; 4. 使用OpenGL函数来绘制扇形线段,可以使用GL_LINES或GL_LINE_STRIP等模式来绘制; 5. 调用update或者glSwapBuffers函数刷新窗口,以显示绘制结果。 同时,为了实现雷达扫描图的动态效果,可以使用定时器来触发雷达扫描图的更新。在定时器回调函数,可以更新雷达扫描图的角度参数,并调用绘制函数来重新绘制扇形线段。 总结起来,无论是使用QOpenGLWidget还是QGLWidget,都可以通过重写绘制函数,使用OpenGL的绘制函数和变换函数来实现雷达扫描图的效果,同时结合定时器来实现动态效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值