OpenGL under QML

OpenGL under QML

本文关键字:QML under OpenGL      更新时间:2023-10-16

所以我一直在QML下摆弄OpenGL,并一直在查看提供的同名示例文件。我有点理解它是如何工作的,但事情是这样的:我试图用我自己非常基本的Open GL东西来替换示例的paint()函数中的OpenGL着色器程序。然而,我无法在屏幕上看到任何东西。我唯一能改变的就是背景的颜色。所以我想知道如何设置视口、相机以及屏幕上需要的任何东西。我对OpenGL有一些(非常生疏的)经验,但在过去,总是有一些像免费供过于求这样的东西让生活变得更轻松。任何指向正确方向的指针或示例(我可以放在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();
}

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

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

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

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

#include <QOpenGLFunctions>
#include <QOpenGLContext>