首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的qtopengl小部件没有出现?

我的qtopengl小部件没有出现?
EN

Stack Overflow用户
提问于 2018-06-24 07:45:23
回答 1查看 423关注 0票数 0

main.cpp

代码语言:javascript
复制
#include "QtGuiApplication4.h"
#include <QtWidgets/QApplication>
#include "megui.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    megui test;
    test.show();

    return a.exec();
}

qtguiapplication4.h

代码语言:javascript
复制
#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_QtGuiApplication4.h"

class QtGuiApplication4 : public QMainWindow
{
    Q_OBJECT

public:
    QtGuiApplication4(QWidget *parent = Q_NULLPTR);

private:
    Ui::QtGuiApplication4Class ui;
};

qtguiapplication4.cpp

代码语言:javascript
复制
#include "QtGuiApplication4.h"

QtGuiApplication4::QtGuiApplication4(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
}

megui.h

代码语言:javascript
复制
#pragma once
#include "QOpenGLWidget"
#include "QOpenGLBuffer"
#include "QOpenGLFunctions"
#include "QOpenGLShaderProgram"
#include <iostream>
class megui:public QOpenGLWidget, protected QOpenGLFunctions
{
public:
    QOpenGLFunctions glfunctions;
    QOpenGLShaderProgram program;

    void initializeGL();
    void paintGL();

    megui();
    ~megui();
};

megui.cpp

代码语言:javascript
复制
#include "megui.h"

void megui::initializeGL()
{
    makeCurrent();
    float vertexpositions[] = {
        0.5f,0.5f,
        0.0f,-0.5f,
        0.5f,-0.5f
    };
    QOpenGLBuffer buffer1(QOpenGLBuffer::VertexBuffer);
    buffer1.create();
    buffer1.setUsagePattern(QOpenGLBuffer::StaticDraw);
    buffer1.allocate(vertexpositions, sizeof(vertexpositions));
    buffer1.bind();
    glfunctions.initializeOpenGLFunctions();
    glfunctions.glEnableVertexAttribArray(0);
    glfunctions.glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);

    program.addShaderFromSourceFile(QOpenGLShader::Vertex, "C:/open gl testimg/opengl testing/opengl testing/vertex.glsl");
    program.addShaderFromSourceFile(QOpenGLShader::Fragment, "C:/open gl testimg/opengl testing/opengl testing/fragmentshader.glsl");
    program.link();
}

void megui::paintGL()
{
    makeCurrent();

    glfunctions.initializeOpenGLFunctions();

    program.bind();
    glfunctions.glDrawArrays(GL_TRIANGLES, 0, 3);   
}

megui::megui()
{
}

megui::~megui()
{
}

碎片着色器

代码语言:javascript
复制
#version 430

out vec4 inalcolors;

void main() {

    inalcolors =vec4( 1.0f, 0.0f, 0.0f,1.0) ;
}

顶点着色器

代码语言:javascript
复制
#version 430 

layout(location = 0) in vec4 positions;

void main() {

    gl_Position =positions; 
}

小部件屏幕没有显示出来,但是当我删除glDrawArrays调用时,它就会显示出来。我怀疑opengl代码中有什么问题导致了这个问题。我按照youtube的教程,他和我的代码都是一样的,我希望我使用的是qt opengl包装类,而不是glew library.what。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-24 10:00:50

QOpenGLBuffer buffer1megui::initializeGL()方法中的局部变量。Qt OpenGL对象使用资源获取是初始化(RAII)技术。这意味着在函数的末尾,buffer1被破坏,缓冲区消失,无效。

此外,QOpenGLBuffer对象必须在之前绑定(bind()) ,然后才能分配(allocate())。请参阅QOpenGLBuffer::allocate的文档。

顺便说一句,你的顶点坐标由两个组件组成(x,y),而不是3。

在类QOpenGLBuffer中创建megui成员

代码语言:javascript
复制
class megui:public QOpenGLWidget, protected QOpenGLFunctions
{
public:
    QOpenGLFunctions glfunctions;
    QOpenGLShaderProgram program;

    QOpenGLBuffer buffer1;

    .....
}

代码语言:javascript
复制
megui::megui()
    : buffer1(QOpenGLBuffer::VertexBuffer)
{}

在分配缓冲区之前绑定它:

代码语言:javascript
复制
void megui::initializeGL()
{
    .....

    buffer1.create();
    buffer1.setUsagePattern(QOpenGLBuffer::StaticDraw);

    buffer1.bind(); // <-------- bind before allocate
    buffer1.allocate(vertexpositions, sizeof(vertexpositions));


    float vertexpositions[] = {
        0.5f,0.5f,
        0.0f,-0.5f,
        0.5f,-0.5f
    };

    glfunctions.glEnableVertexAttribArray(0);

    glfunctions.glVertexAttribPointer(
        0, 2,       // <-------- 2 instead of 3
        GL_FLOAT, false, 0, 0);

    buffer1.release();

    .....
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51007909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档