当前位置: 首页 > news >正文

计算机图形学实践:结合Qt和OpenGL实现绘制彩色三角形

以下是使用Qt和OpenGL实现绘制彩色三角形并添加颜色选择按钮的步骤:

一、创建OpenGL绘制组件

  1. 继承QOpenGLWidget实现自定义绘制类:
// myopenglwidget.h
#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>
#include <QOpenGLShaderProgram>class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core
{Q_OBJECT
public:explicit MyOpenGLWidget(QWidget *parent = nullptr);void setTriangleColor(const QColor &color);protected:void initializeGL() override;void paintGL() override;private:GLuint VAO, VBO;QOpenGLShaderProgram *shaderProgram;QVector3D triangleColor = QVector3D(1.0f, 0.0f, 0.0f); // 默认红色
};

二、实现OpenGL初始化与绘制

// myopenglwidget.cpp
void MyOpenGLWidget::initializeGL()
{initializeOpenGLFunctions();glClearColor(0.1f, 0.1f, 0.1f, 1.0f);// 顶点数据(三角形位置)float vertices[] = {-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.0f,  0.5f, 0.0f};// 创建VAO/VBOglGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 配置顶点属性glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);// 创建着色器程序shaderProgram = new QOpenGLShaderProgram(this);shaderProgram->addShaderFromSourceCode(QOpenGLShader::Vertex,"#version 330 core\n""layout (location = 0) in vec3 aPos;\n""void main() {\n""   gl_Position = vec4(aPos, 1.0);\n""}");shaderProgram->addShaderFromSourceCode(QOpenGLShader::Fragment,"#version 330 core\n""out vec4 FragColor;\n""uniform vec3 ourColor;\n""void main() {\n""   FragColor = vec4(ourColor, 1.0);\n""}");shaderProgram->link();
}void MyOpenGLWidget::paintGL()
{glClear(GL_COLOR_BUFFER_BIT);shaderProgram->bind();shaderProgram->setUniformValue("ourColor", triangleColor);glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES, 0, 3);shaderProgram->release();
}void MyOpenGLWidget::setTriangleColor(const QColor &color)
{triangleColor = QVector3D(color.redF(), color.greenF(), color.blueF());update(); // 触发重绘
}

三、添加颜色选择按钮

// mainwindow.cpp
#include <QMainWindow>
#include <QPushButton>
#include <QColorDialog>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{MyOpenGLWidget *glWidget = new MyOpenGLWidget(this);setCentralWidget(glWidget);// 创建颜色选择按钮QPushButton *colorBtn = new QPushButton("选择颜色", this);colorBtn->setGeometry(10, 10, 100, 30);connect(colorBtn, &QPushButton::clicked, [=](){QColor color = QColorDialog::getColor(Qt::red, this, "选择三角形颜色");if (color.isValid()) {glWidget->setTriangleColor(color);}});
}

四、运行效果

  1. 窗口显示灰色背景的红色三角形
  2. 点击"选择颜色"按钮弹出颜色选择对话框
  3. 选择颜色后三角形实时更新颜色

关键实现原理

  1. 着色器控制颜色:通过uniform变量传递颜色值到片段着色器
  2. 颜色转换:将Qt的QColor转换为OpenGL的归一化颜色值(0.0-1.0)
  3. 实时更新:调用update()触发OpenGL重绘

相关文章:

  • (第一篇)Springcloud简介与工程搭建
  • Winddows11官网下载安装VMware Workstation Pro17(图文详解)
  • Redis LFU 策略参数配置指南
  • 【C++基础知识】namespace前加 inline
  • 初识Redis · 主从复制(上)
  • 10天学会嵌入式技术之51单片机-day-8
  • Kotlin Multiplatform--01:项目结构基础
  • ctfhow——web入门214~218(时间盲注开始)
  • 【FAQ】安装Agent的主机,为何不能更改显示分辨率
  • SQL Server 2008 R2中varchar(max)的含义
  • Hive 数据同步到 Doris 最佳实践方案:从场景适配到性能调优全解析
  • Python3 基础:控制流结构(条件语句、循环)
  • 【C++基础知识】C++类型特征组合:`disjunction_v` 和 `conjunction_v` 深度解析
  • Visual Studio C/C++编译器cl.exe的/source-charset与/execution-charset设置项
  • 扩展中国剩余定理
  • day 32 学习笔记
  • 【前端】【业务场景】【面试】在前端开发中,如何优化 SVG(可缩放矢量图形)的性能,特别是在处理复杂图形和动画时
  • ZooKeeper配置优化秘籍:核心参数说明与性能优化
  • 多维时序 | LightGBM多变量时序预测(Matlab完整源码和数据,适合基础小白研究)
  • 最高支持高速L3商用,华为发布ADS 4智驾系统
  • 《2025职场人阅读报告》:超半数会因AI改变阅读方向
  • 国际观察|伦敦会谈“降级”凸显美国乌克兰政策窘境
  • 魏晓栋已任上海崇明区委常委、组织部部长
  • 3岁男童疑遭父亲虐待,杭州警方:在异地发生,嫌疑人已被抓
  • 上海五五购物节首次推出商圈精品推广节,9个商圈近百个商场参与促销
  • “80后”阿伯丁大学法学硕士朱江已任四川泸州市副市长