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();
}qtguiapplication4.h
#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
#include "QtGuiApplication4.h"
QtGuiApplication4::QtGuiApplication4(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
}megui.h
#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
#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()
{
}碎片着色器
#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 library.what。
发布于 2018-06-24 10:00:50
QOpenGLBuffer buffer1是megui::initializeGL()方法中的局部变量。Qt OpenGL对象使用资源获取是初始化(RAII)技术。这意味着在函数的末尾,buffer1被破坏,缓冲区消失,无效。
此外,QOpenGLBuffer对象必须在之前绑定(bind()) ,然后才能分配(allocate())。请参阅QOpenGLBuffer::allocate的文档。
顺便说一句,你的顶点坐标由两个组件组成(x,y),而不是3。
在类QOpenGLBuffer中创建megui成员
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();
.....
}https://stackoverflow.com/questions/51007909
复制相似问题