#ifndef GLWIDGET_H
#define GLWIDGET_H
#include
#include
#include
#include
#include
#include
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
#include
#include
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()<
// 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()<
// 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";
代码就以上这些,shader改了好几种都没用,实在没办法了,求大神解救!
已解决,设置vao属性那里大小应该是4