我在 Qt 5 中编程 OpenGL 没有图像
Posted
技术标签:
【中文标题】我在 Qt 5 中编程 OpenGL 没有图像【英文标题】:I Program OpenGL in Qt 5 have no image 【发布时间】:2015-01-19 14:18:42 【问题描述】:#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代码,我多次尝试更改shader和其他代码,但所有代码都失败并且没有图像。我不知道,有没有人帮助我? 而且后来遇到这个问题,怎么才能找到这个程序不工作的原因,因为它不报任何错误,Qt5中OpenGL程序的信息很少。
好的,我发现代码中的错误是“ f->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); ”。 3 必须更改为 4。 但是我还是想知道如何在qt5上学习opengl。
【问题讨论】:
【参考方案1】:好的,我在代码中发现了错误
// ...
vbo.bind();
QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
f->glEnableVertexAttribArray(0);
f->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
vbo.release();.
// ...
void glVertexAttribPointer( GLuint index,
GLint size,
GLenum type,
GLboolean normalized,
GLsizei stride,
const GLvoid * pointer);
glVertexAttribPointer方法中的3必须改为4。
因为这指定了每个通用顶点属性的组件数量。必须是 1、2、3、4。此外,符号常量 GL_BGRA 被 glVertexAttribPointer 接受。初始值为 4。
【讨论】:
以上是关于我在 Qt 5 中编程 OpenGL 没有图像的主要内容,如果未能解决你的问题,请参考以下文章