Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我的qtopengl小部件没有显示?_C++_Qt_Opengl_Qt5 - Fatal编程技术网

C++ 我的qtopengl小部件没有显示?

C++ 我的qtopengl小部件没有显示?,c++,qt,opengl,qt5,C++,Qt,Opengl,Qt5,main.cpp #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(); } 梅吉 #pragma once #include

main.cpp

#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();
}
梅吉

#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();
};
碎片着色器

#version 430

out vec4 inalcolors;

void main() {

    inalcolors =vec4( 1.0f, 0.0f, 0.0f,1.0) ;
}
顶点着色器

#version 430 

layout(location = 0) in vec4 positions;

void main() {

    gl_Position =positions; 
}

窗口小部件屏幕没有显示,但当我删除glDrawArrays调用时,它就会显示。我怀疑opengl代码中存在导致此问题的问题。我遵循了youtube教程,他和我的代码中的所有内容都是一样的,希望我使用qt opengl包装类而不是glew库。原因是什么?

QOpenGLBuffer buffer1
是方法
megui::initializeGL()
中的局部变量。Qt OpenGL对象使用了这种技术。这意味着在函数结束时,
buffer1
被破坏,缓冲区消失且无效

此外,必须先绑定
QOpenGLBuffer
对象(
bind()
,然后才能对其进行分配(
allocate()
)。请参阅的文档

顺便说一下,顶点坐标由2个分量(x,y)组成,而不是3个分量

在类
megui

class megui:public QOpenGLWidget, protected QOpenGLFunctions
{
public:
    QOpenGLFunctions glfunctions;
    QOpenGLShaderProgram program;

    QOpenGLBuffer buffer1;

    .....
}

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

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();

    .....
}
void megui::initializeGL()
{
.....
buffer1.create();
buffer1.setUsagePattern(QopengelBuffer::StaticDraw);

buffer1.bind();//对不起,我添加了着色器代码和program.bind。它仍然不起作用
makeCurrent()
可以-当
paintGL()
resizeGL()
initializeGL()时,小部件的OpenGL渲染上下文变为当前
被调用。谢谢,它可以工作,但我仍然不知道小部件屏幕没有显示的原因。是不是因为paintgl调用失败,窗口消失了?@karansharma在你问题的代码中,缓冲区被破坏了,在使用之前,小部件崩溃了。
#version 430 

layout(location = 0) in vec4 positions;

void main() {

    gl_Position =positions; 
}
class megui:public QOpenGLWidget, protected QOpenGLFunctions
{
public:
    QOpenGLFunctions glfunctions;
    QOpenGLShaderProgram program;

    QOpenGLBuffer buffer1;

    .....
}
megui::megui()
    : buffer1(QOpenGLBuffer::VertexBuffer)
{}
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();

    .....
}