QOpenGLShaderProgram 空心矩形, 详细代码列子
时间: 2023-05-23 11:02:00 浏览: 83
以下是一个使用 QOpenGLShaderProgram 绘制空心矩形的示例代码:
```
#include <QApplication>
#include <QOpenGLShaderProgram>
#include <QOpenGLWidget>
#include <QPainter>
class MyOpenGLWidget : public QOpenGLWidget
{
Q_OBJECT
public:
MyOpenGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {}
virtual ~MyOpenGLWidget() {}
protected:
void initializeGL()
{
initializeOpenGLFunctions();
// 创建并编译顶点 shader 和片段 shader
m_shader = new QOpenGLShaderProgram();
m_shader->addShaderFromSourceCode(QOpenGLShader::Vertex,
"attribute vec4 vertex;\n"
"uniform mat4 matrix;\n"
"void main() {\n"
" gl_Position = matrix * vertex;\n"
"}");
m_shader->addShaderFromSourceCode(QOpenGLShader::Fragment,
"void main() {\n"
" gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n"
"}");
// 绑定 shader 属性
m_shader->bindAttributeLocation("vertex", 0);
// 链接 shader
m_shader->link();
// 创建顶点数据
GLfloat vertices[] = { -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f };
// 创建顶点 VBO
glGenBuffers(1, &m_vbo);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
}
void resizeGL(int w, int h)
{
glViewport(0, 0, w, h);
m_projection.setToIdentity();
m_projection.ortho(0, w, h, 0, -100, 100);
update();
}
void paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
m_shader->bind();
m_shader->setUniformValue("matrix", m_projection * m_modelview);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_LINE_LOOP, 0, 4);
}
private:
QOpenGLShaderProgram *m_shader;
GLuint m_vbo;
QMatrix4x4 m_projection;
QMatrix4x4 m_modelview;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyOpenGLWidget widget;
widget.show();
return app.exec();
}
#include "main.moc"
```
这段代码创建了一个 QOpenGLWidget,使用 QOpenGLShaderProgram 绘制了一个空心矩形。顶点 shader 使用 attribute 声明顶点位置,uniform 声明变换矩阵,并将变换后的顶点位置输出给片段 shader。片段 shader 直接输出白色。顶点数据以及顶点 VBO 都在 initializeGL 中创建和初始化,resizeGL 中处理投影矩阵,paintGL 中绑定 shader、顶点 VBO 和变换矩阵,并使用 glDrawArrays 绘制矩形。
阅读全文