QML下的OpenGL

Posted

技术标签:

【中文标题】QML下的OpenGL【英文标题】:OpenGL under QML 【发布时间】:2014-09-23 21:30:45 【问题描述】:

所以我一直在使用 QML 下的 OpenGL,并一直在查看提供的同名示例文件。我有点理解它是如何工作的,但事情是这样的:我试图用我自己非常基本的 Open GL 东西替换示例的 paint() 函数中的 OpenGL 着色器程序。但是我无法在屏幕上看到任何可见的东西。我唯一能改变的是背景的颜色。所以我想知道如何设置视口、相机以及任何需要在屏幕上显示的东西。我在 OpenGL 上有一些(非常生疏的)经验,但过去总是有诸如 freeglut 之类的东西让生活变得更轻松。任何指向正确方向的指针或示例(我可以在 paint() 方法中观察和学习的东西)将不胜感激......

编辑:这就是我在 paint() 方法中的内容:

void QtOpenGLViewRenderer::paint()

    // The following two lines fixed the problem
    QOpenGLFunctions glFuncs(QOpenGLContext::currentContext());
    glFuncs.glUseProgram(0);

    glViewport(0, 0, m_viewportSize.width(), m_viewportSize.height());

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glClearColor(0.2, 0, 0, 1);
    glClear(GL_COLOR_BUFFER_BIT);

    GLfloat triangle[] = 
        0.25f, 0.25f, 0.0f,
        0.75f, 0.25f, 0.0f,
        0.25f, 0.75f, 0.0f
    ;

    GLfloat colors[] = 
        1.0f, 0.0f, 0.0f, 1.0f,
        0.0f, 1.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 1.0f, 1.0f
    ;

    glVertexPointer(3, GL_FLOAT, 0, triangle);
    glColorPointer(4, GL_FLOAT, 0, colors);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);

    glShadeModel(GL_SMOOTH);

    glDrawArrays(GL_TRIANGLES, 0, 3);

    glFlush();

我看到的只是暗红色背景,但没有三角形的迹象。这是为什么呢?

【问题讨论】:

尝试将模型移动到新矩阵中,可能当前矩阵堆栈未处于默认状态。 感谢 mk5!也在想类似的事情。我为模型和投影矩阵添加了负载标识(上面编辑的代码)。然后我尝试沿z轴来回移动三角形;把它变大;等等等等,但它永远不会出现在屏幕上...... 我尝试了发布的代码,它对我来说效果很好。所以有些东西我们在这里看不到。 m_viewportSize 是否包含正确的值?它是否使用兼容性上下文? glGetErrors() 是否显示任何错误? 视口宽度和高度符合预期 (320 x 480) 并且 glGetError() 返回 GL_NO_ERROR。奇怪...@RetoKoradi 你在哪个平台上试过这个? 我在 Mac OS 10.9.2 上试过。我将代码复制到使用 GLUT 进行窗口系统集成的 C++ 应用程序中。 【参考方案1】:

为了记录而回答我自己的问题。问题是 Qt 默认情况下需要新的 OpenGL 着色语言 (GLSL) 样式指令。要使旧式 OpenGL 指令正常工作,您需要告诉 Qt 您将使用它们而不是由着色器定义的程序。这是通过发出以下命令来完成的:

QOpenGLFunctions glFuncs(QOpenGLContext::currentContext());
glFuncs.glUseProgram(0);

要使这些工作,您还需要包含以下标题:

#include <QOpenGLFunctions>
#include <QOpenGLContext>

【讨论】:

以上是关于QML下的OpenGL的主要内容,如果未能解决你的问题,请参考以下文章

Modern OpenGLOpenGL简介

QML下的OpenGL

OpenGLOpenGL中的Buffer的巧妙使用

OpenGL Core Profile 下的 QML 标签崩溃 App

如何在 qml 中捕捉从虚拟键盘按下的 Key_Cancel?

Qt-5.14.0:QML 下的 Vulkan 导致 std::system_error:: 互斥锁失败