GLSL(OpenGL Shading Language)是一个强大的渲染语言。
下面做一个:
RenderWindow.h
#ifndef RENDERWINDOW_H
#define RENDERWINDOW_H
//#include <QOpenGLWindow>
#include <GL/glu.h>
#include <QtOpenGL>
#include <QSurfaceFormat>
#include <QOpenGLFunctions>
#include <QOpenGLWindow>
#include <QOpenGLBuffer>
#include <QOpenGLVertexArrayObject>
#include <QOpenGLShader>
#include <QOpenGLShaderProgram>
class RenderWindow : public QOpenGLWindow
{
public:
RenderWindow();
protected:
void initializeGL();
void paintGL();
void paintEvent(QPaintEvent *event);
void resizeEvent(QResizeEvent *event);
private:
QOpenGLContext* openGLContext;
QOpenGLFunctions* openGLFunctions;
QOpenGLShaderProgram* shaderProgram;
QOpenGLVertexArrayObject* vao;
QOpenGLBuffer* vbo_vertices;
};
#endif // RENDERWINDOW_H
RenderWIndow.cpp
#include "renderwindow.h"
RenderWindow::RenderWindow()
{
setSurfaceType(QWindow::OpenGLSurface);
QSurfaceFormat format;
format.setProfile(QSurfaceFormat::CoreProfile);
format.setVersion(3, 2);
setFormat(format);
openGLContext = new QOpenGLContext();
openGLContext->setFormat(format);
openGLContext->create();
openGLContext->makeCurrent(this);
//设定窗口名称和大小,要有。
setTitle("OpenGL3.0 Render Window");
resize(640, 480);
}
void RenderWindow::initializeGL()
{
openGLFunctions = openGLContext->functions();
static const char *vertexShaderSource =
"#version 330 core\n"
"layout(location = 0) in vec2 posAttr;\n"
"void main() {\n"
"gl_Position = vec4(posAttr, 0.0, 1.0);}";
static const char *fragmentShaderSource =
"#version 330 core \n"
"out vec4 col;\n"
"void main() {\n"
"col = vec4(1.0, 0.0, 0.0, 1.0);}";
//设置GLSL
shaderProgram = new QOpenGLShaderProgram(this);
shaderProgram->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource);
shaderProgram->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);
shaderProgram->link();
GLfloat vertices[] = {
-1.0f, -1.0f,
1.0f, -1.0f,
0.0f, 1.0f
};
vao = new QOpenGLVertexArrayObject();
vao->create();
vao->bind();
vbo_vertices = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer);
vbo_vertices->create();
vbo_vertices->setUsagePattern(QOpenGLBuffer::StaticDraw);
vbo_vertices->bind();
vbo_vertices->allocate(vertices, sizeof(vertices)*sizeof(GLfloat));
vao->release();
}
void RenderWindow::paintGL()
{
}
void RenderWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
glViewport(0, 0, width(), height());
glClearColor(0.39f, 0.58f, 0.93f, 1.f);
glClear(GL_COLOR_BUFFER_BIT);
vao->bind();
shaderProgram->bind();
shaderProgram->bindAttributeLocation("posAttr", 0);
shaderProgram->enableAttributeArray(0);
shaderProgram->setAttributeBuffer(0, GL_FLOAT, 0, 2);
glDrawArrays(GL_TRIANGLES, 0, 3);
shaderProgram->release();
vao->release();
}
void RenderWindow::resizeEvent(QResizeEvent *event)
{
Q_UNUSED(event);
glViewport(0, 0, this->width(), this->height());
this->update();
}
编译运行:
非常的鲜艳。
多谢,亲爱的美美。