C++ 我的qtopengl小部件没有显示?
main.cppC++ 我的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
#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();
.....
}