- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 OpenGL 将 UI 作为插件添加到现有应用程序。为此,我将 UI 渲染到纹理中,并在绘制场景后在 3D 场景之上绘制该纹理。
纹理生成如下:
if (context_ == nullptr)
{
QSurfaceFormat format;
format.setDepthBufferSize( 16 );
format.setStencilBufferSize( 8 );
format.setMajorVersion(3);
format.setMinorVersion(3);
native_context_ = new QOpenGLContext;
native_context_->setNativeHandle( QVariant::fromValue(
QGLXNativeContext( native_context_information_->context, native_context_information_->display )));
if ( !native_context_->create())
{
ROS_ERROR( "OverlayManager: Fatal! Failed to create context!" );
}
context_ = new QOpenGLContext;
context_->setFormat( format );
context_->setShareContext( native_context_ );
if ( !context_->create())
{
ROS_ERROR( "OverlayManager: Fatal! Failed to create context!" );
}
surface_ = new QOffscreenSurface;
surface_->setFormat( format );
surface_->create();
if ( !surface_->isValid()) ROS_ERROR( "Surface invalid!" );
context_->makeCurrent( surface_ );
paint_device_ = new QOpenGLPaintDevice( 1920, 1080 );
{
QOpenGLFramebufferObjectFormat format;
format.setSamples(16);
format.setAttachment( QOpenGLFramebufferObject::CombinedDepthStencil );
fbo_ = new QOpenGLFramebufferObject( 1920, 1080, format );
texture_fbo_ = new QOpenGLFramebufferObject( 1920, 1080 );
}
fbo_->bind();
}
else
{
context_->makeCurrent( surface_ );
fbo_->bind();
}
context_->functions()->glClear(GL_COLOR_BUFFER_BIT);
QPainter painter(paint_device_);
painter.setRenderHint(QPainter::RenderHint::Antialiasing);
painter.setBrush(QBrush(Qt::green));
painter.drawRect(0, 0, 400, 300);
// painter.setPen(Qt::red);
painter.setPen(QPen(QBrush(Qt::red), 4));
painter.setFont(QFont("Arial", 20));
painter.drawText(100, 120, "Hello");
painter.drawText( 10, 80, QString( "Rendertime (ms): %1" ).arg( timer_average_ / 15.0 ));
painter.end();
fbo_->release();
QOpenGLFramebufferObject::blitFramebuffer(texture_fbo_, fbo_);
context_->functions()->glFinish();
// Texture looks fine
context_->doneCurrent();
glXMakeCurrent( native_context_information_->display, native_context_information_->drawable, native_context_information_->context );
// Now it is messed up
可能更有趣的部分是纹理的绘制:
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glDisable(GL_TEXTURE_2D);
glDisable(GL_LIGHTING);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glOrtho(0, 1920, 0, 1080, -1, 1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture_fbo_->texture());
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(0, 0);
glTexCoord2f(0, 1); glVertex2f(0, 1080);
glTexCoord2f(1, 1); glVertex2f(1920, 1080);
glTexCoord2f(1, 0); glVertex2f(1920, 0);
// glClear(GL_DEPTH_BUFFER_BIT); // Wrong but not the issue, see second edit
glEnd();
glPopMatrix();
glDisable(GL_TEXTURE_2D);
glEnable(GL_LIGHTING);
glMatrixMode(GL_MODELVIEW);
我主要发现了这种绘制纹理的方法以及一些评论说这已被弃用,但在使用更新的方法的全 View 覆盖纹理上真的找不到太多。如果您对此有任何简短的资源/方法,我将不胜感激,但由于这与我的专业领域相去甚远,我真的不想为了避免使用已弃用的代码而投入超过几个小时的时间。
我希望您对我要实现的目标有一个清晰的了解。
这实际上在我的桌面上使用 NVidia Geforce GTX 1080 使用 Ubuntu 16.04、Qt 5.5.1、OGRE 1.9.0 和 OpenGL 4.6 (GLSL 4.6) 在我的桌面上运行良好,在我的桌面上使用 Ubuntu 18.04、Qt 5.9.5、OGRE 1.9 .0 和 OpenGL 2.1 (GLSL 1.2)。然而,在我使用 Ubuntu 16.04、Qt 5.5.1、OGRE 1.9.0 和 OpenGL 3 (GLSL 1.3) 的笔记本上,它根本不起作用。
现在,显而易见的问题是:为什么会这样,我该如何解决?
可以找到完整的源代码here .
编辑:如果重要的话,如果我在底部示例中移动相机,白色区域也会发生变化。因此,我认为它们可能是场景渲染的残留物。
第二次编辑:我做了更多的调试,这不是我最初认为的错误的绘图,而是上下文切换。我已经在切换之前和之后将纹理保存到一个文件中,并且纹理看起来像之前预期的那样,并且在切换之后搞砸了。现在,我只需要弄清楚原因。
最佳答案
在 glBegin
…glEnd
block 中调用 glClear
是无效的。另外我不完全确定,你的意图是什么。如果你想阻止它写入深度缓冲区,你可以使用 glDepthMask
。禁用深度测试也会禁用深度写入。
关于c++ - QOpenGLContext 和 native OpenGL 上下文之间的纹理共享不适用于 Mesa 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55131924/
这些天我一直在网上阅读各种资料,试图找出如何在 Qt 中进行 OpenGL 渲染,显然旧的 QGL 模块已被弃用。我真的很喜欢新的 QOpenGLContext 并且它能够初始化 open gl 函数
问题的简短形式:如何使用 FBO 作为纹理在 QGLWidget 中进行绘制,而不只是获得空白的白色图像? 还有一些背景和细节...我正在使用 Qt 5.1 作为在 GPU 上进行一些图像处理的应用程
我们有一个使用 GLFW 创建的 3D 渲染窗口,我们希望使用 QWebkit 在渲染中显示 QWebPage(也称为将 QWebPage 渲染为 OpenGL 纹理)。只使用CPU版本太慢,Qt支持
我正在尝试从 http://www.kdab.com/opengl-in-qt-5-1-part-5/ 编译 Tesselation 的示例(包括源代码)与兼容性配置文件,它根本无法加载此配置文件:
我想获取GL_MAX_TEXTURE_SIZE的值在 Qt “早期”,因为我将为我的应用程序生成一些纹理图集。 我明白 glGetIntegerv没有“有效”上下文将无法工作。所以我创建了一个 QOp
注意:这是一个相当天真的问题。 在 Qt5 C++ 应用程序中调试和登录期间,打印内部变量的值很有用,在 Qt 中是常用的方式就是和这样的 friend 一起使用qDebug(): qDebug()<
我正在开发一个项目,该项目将使用 OpenCL 渲染图形以在 QOpenGLWidget 中显示。 recommended way要做到这一点,似乎是在 QOpenGLWidget 中已经存在的那个旁
我正在尝试使用 OpenGL 将 UI 作为插件添加到现有应用程序。为此,我将 UI 渲染到纹理中,并在绘制场景后在 3D 场景之上绘制该纹理。 纹理生成如下: if (context_ == nul
我正在运行 OS X 10.9.4 和 Qt 5.3.1。我需要创建一个使用 Open GL 3.3 的 QOpenGLContext。我的系统报告与 OpenGL 3.3 100% 兼容,但我得到的
我是一名优秀的程序员,十分优秀!