上一节为白色的正方形通过顶点绘制了颜色,这一小节修改顶点数组,实现3D效果
//myopenglwidget.h
#ifndef MYOPENGLWIDGET_H
#define MYOPENGLWIDGET_H
#include
#include
#include
class QOpenGLShaderProgram;
class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
Q_OBJECT
public:
explicit MyOpenGLWidget(QWidget *parent = 0);
protected:
void initializeGL();
void paintGL();
void resizeGL(int width, int height);
private:
QOpenGLShaderProgram *program;
QOpenGLBuffer vbo;
};
#endif // MYOPENGLWIDGET_H
//myopenglwidget.cpp
#include "myopenglwidget.h"
#include
MyOpenGLWidget::MyOpenGLWidget(QWidget *parent)
: QOpenGLWidget(parent)
{
}
void MyOpenGLWidget::initializeGL()
{
// 为当前环境初始化OpenGL函数
initializeOpenGLFunctions();
// 创建顶点着色器
QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex, this);
const char *vsrc =
"in vec4 vPosition; \n"
"in vec4 vColor; \n"
"out vec4 color; \n"
"uniform mat4 matrix; \n"
"void main() { \n"
" color = vColor; \n"
" gl_Position = matrix * vPosition; \n"
"} \n";
vshader->compileSourceCode(vsrc);
// 创建片段着色器
QOpenGLShader *fshader = new QOpenGLShader(QOpenGLShader::Fragment, this);
const char *fsrc =
"in vec4 color; \n"
"out vec4 fColor; \n"
"void main() { \n"
" fColor = color; \n"
"} \n";
fshader->compileSourceCode(fsrc);
// 创建着色器程序
program = new QOpenGLShaderProgram;
program->addShader(vshader);
program->addShader(fshader);
program->link();
program->bind();
}
void MyOpenGLWidget::resizeGL(int , int )
{
}
void MyOpenGLWidget::paintGL()
{
int w = width();
int h = height();
int side = qMin(w, h);
glViewport((w - side) / 2, (h - side) / 2, side, side);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 顶点位置
GLfloat vertices[2][4][3] = {
{ {-0.8f, 0.8f, 0.8f}, {-0.8f, -0.8f, 0.8f}, {0.8f, -0.8f, 0.8f}, {0.8f, 0.8f, 0.8f} },
{ {0.8f, 0.8f, 0.8f}, {0.8f, -0.8f, 0.8f}, {0.8f, -0.8f, -0.8f}, {0.8f, 0.8f, -0.8f} }
};
vbo.create();
vbo.bind();
vbo.allocate(vertices, 48*sizeof(GLfloat));
GLuint vPosition = program->attributeLocation("vPosition");
program->setAttributeBuffer(vPosition, GL_FLOAT, 0, 3, 0);
glEnableVertexAttribArray(vPosition);
// 顶点颜色
GLfloat colors[2][4][3] = {
{ {1.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f, 1.0f} },
{ {1.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f, 1.0f} }
};
vbo.write(24*sizeof(GLfloat), colors, 24*sizeof(GLfloat));
GLuint vColor = program->attributeLocation("vColor");
program->setAttributeBuffer(vColor, GL_FLOAT, 24*sizeof(GLfloat), 3, 0);
glEnableVertexAttribArray(vColor);
QMatrix4x4 matrix;
matrix.perspective(45.0f, (GLfloat)w/(GLfloat)h, 0.1f, 100.0f);
matrix.translate(0, 0, -3);
matrix.rotate(-60, 0, 1, 0); //绕Y轴逆时针旋转
program->setUniformValue("matrix", matrix);
// 绘制
for(int i=0; i<2; i++)
glDrawArrays(GL_TRIANGLE_FAN, i*4, 4);
}
//main.cpp
#include
#include "myopenglwidget.h"
int main(int argc, char *argv[])
{
QApplication app(argc,argv);
MyOpenGLWidget w;
w.resize(400, 300);
w.show();
return app.exec();
}
运行结果:
下一节:Qt OPenGL 入门教程之六 基于QOpenGLWidget 3D立方体纹理贴图