#ifndef GLWIDGET_H
#define GLWIDGET_H
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>
#include <QOpenGLVertexArrayObject>
#include <QOpenGLBuffer>
#include <QMatrix4x4>
class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
GLWidget(QWidget *parent=0);
~GLWidget();
protected:
virtual void initializeGL() Q_DECL_OVERRIDE;
virtual void paintGL() Q_DECL_OVERRIDE;
virtual void resizeGL(int w, int h) Q_DECL_OVERRIDE;
GLuint compileShaders();
private:
QOpenGLShaderProgram *program;
QOpenGLVertexArrayObject vao;
QOpenGLBuffer vbo;
static const char *vshader_source;
static const char *fshader_source;
};
#endif // GLWIDGET_H
#include "glwidget.h"
#include <assert.h>
#include <QDebug>
#include <QGLFormat>
GLWidget::GLWidget(QWidget *parent) :
QOpenGLWidget(parent)
{
}
GLWidget::~GLWidget()
{
}
void GLWidget::initializeGL()
{
initializeOpenGLFunctions();
GLfloat color[] = {0.0, 0.0, 0.0, 1.0};
GLfloat points[] = {1.0,0.0,0.0,1.0,
0.0,1.0,0.0,1.0,
1.0,1.0,0.0,1.0};
glClearBufferfv(GL_COLOR, 0, color);
program = new QOpenGLShaderProgram();
program->addShaderFromSourceCode(QOpenGLShader::Vertex, vshader_source);
program->addShaderFromSourceCode(QOpenGLShader::Fragment, fshader_source);
program->bindAttributeLocation("vertex", 0);
program->link();
assert(program->bind());
vao.create();
//vao.bind();
QOpenGLVertexArrayObject::Binder vaoBinder(&vao);
vbo.create();
vbo.bind();
vbo.allocate(points, sizeof(points));
vbo.bind();
QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
f->glEnableVertexAttribArray(0);
f->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
vbo.release();
program->release();
}
void GLWidget::paintGL()
{
QOpenGLVertexArrayObject::Binder vaoBinder(&vao);
program->bind();
glDrawArrays(GL_TRIANGLES, 0, 3);
program->release();
}
void GLWidget::resizeGL(int w, int h)
{
}
//GLuint GLWidget::compileShaders()
//{
// GLint status;
// GLchar log[1024];
// vshader = glCreateShader(GL_VERTEX_SHADER);
// glShaderSource(vshader, 1, vshader_source, NULL);
// glCompileShader(vshader);
// glGetShaderiv(vshader, GL_COMPILE_STATUS, &status);
// glGetShaderInfoLog(vshader, 1024, NULL, log);
// qDebug()<<log;
// assert(status == GL_TRUE);
// fshader = glCreateShader(GL_FRAGMENT_SHADER);
// glShaderSource(fshader, 1, fshader_source, NULL);
// glCompileShader(fshader);
// glGetShaderiv(fshader, GL_COMPILE_STATUS, &status);
// glGetShaderInfoLog(fshader, 1024, NULL, log);
// qDebug()<<log;
// assert(status == GL_TRUE);
// GLuint program = glCreateProgram();
// glAttachShader(program, vshader);
// glAttachShader(program, fshader);
// glLinkProgram(program);
// glGetProgramiv(program, GL_LINK_STATUS, &status);
// assert(status == GL_TRUE);
// glDeleteShader(vshader);
// glDeleteShader(fshader);
// return program;
//}
const char *GLWidget::vshader_source =
"attribute vec4 vertex;\n"
"void main(){\n"
"gl_Position = gl_Vertex;\n"
"}\n";
const char *GLWidget::fshader_source =
"void main(){ \n"
"gl_FragColor = vec4(0.0, 0.8, 1.0, 1.0); \n"
"} \n";
이것은 내 Qt 코드입니다. 셰이더와 다른 코드를 변경하려고 여러 번 시도했지만 모든 코드가 실패하고 이미지가 없습니다. 나는 아무 것도 모른다, 나에게 도움이 되는가? 그리고 나중에이 문제를 만났을 때 오류가보고되지 않고 Qt5에서 OpenGL 프로그램에 대한 정보가 거의 없기 때문에이 프로그램이 작동하지 않는 이유를 어떻게 찾을 수 있습니까?I Qt 5의 OpenGL 프로그램에는 이미지가 없습니다.
좋아,이 코드의 오류를 발견했는지 " F-> glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, 0); ". 3이 4로 변경되어야합니다. 하지만 여전히 qt5에서 OpenGL을 배우는 법을 알고 싶습니다.