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

OpenGl实战笔记(1)基于qt5.15.2+mingw64+opengl绘制三角形

一、实现效果
在这里插入图片描述
二、实现原理
(1)各函数作用与原理

  • initialize()
    作用: 初始化 OpenGL 函数(initializeOpenGLFunctions()) 设置背景清除颜色为 rgba(0.2, 0.3, 0.4, 1.0)。
    原理: initializeOpenGLFunctions() 是 Qt 提供的,用于初始化当前 OpenGL 上下文下的函数指针(比如 glGenBuffers, glCreateShader 等)。glClearColor(…) 设置了在清屏时使用的颜色。
  • resize(int w, int h)
    作用:设置视口大小为窗口的宽高。配置正交投影矩阵(gluOrtho2D),即二维坐标系统,范围为:X ∈ [-1, 1],Y ∈ [-1, 1]。重设模型视图矩阵模式。
    原理:glViewport(…) 定义了渲染区域。glMatrixMode(…) + glLoadIdentity() + gluOrtho2D(…) 设置投影矩阵,相当于告诉 OpenGL“怎么看这个世界”。模型视图矩阵(GL_MODELVIEW)用于定义模型和视图的变换。
  • render()
    作用:清空颜色缓冲区。加载单位矩阵,重置模型变换。开始绘制三角形,每个顶点使用不同颜色。
    原理:glClear(…) 擦除屏幕。glLoadIdentity() 重置当前矩阵为单位矩阵。glBegin(…) … glEnd() 指定绘制图元(此处是一个带有颜色插值的三角形)。

(2)调用顺序(Qt 中 QOpenGLWidget 的典型流程)

  • 程序启动时或第一次显示:Qt 自动调用 initialize() → 设置 OpenGL 状态。
  • 窗口大小变化或首次显示:Qt 调用 resize(width, height) → 设置视口和投影。
  • 每一帧或重绘请求时:Qt 调用 render() → 执行绘图操作。

三、参考代码

//GeometryRenderer 渲染类
#pragma once
#include "rendermoduleinterface.h"
#include <QOpenGLFunctions>
class GeometryRenderer : public RenderModuleInterface, protected QOpenGLFunctions
{
public:void initialize() override;void resize(int w, int h) override;void render() override;
};
#include "geometryrenderer.h"
#include <GL/glu.h>
void GeometryRenderer::initialize()
{initializeOpenGLFunctions();glClearColor(0.2f, 0.3f, 0.4f, 1.0f);
}
void GeometryRenderer::resize(int w, int h)
{glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(-1, 1, -1, 1);glMatrixMode(GL_MODELVIEW);
}
void GeometryRenderer::render()
{glClear(GL_COLOR_BUFFER_BIT);glLoadIdentity();glBegin(GL_TRIANGLES);glColor3f(1.0, 0.0, 0.0); glVertex2f(0.0, 0.5);glColor3f(0.0, 1.0, 0.0); glVertex2f(-0.5, -0.5);glColor3f(0.0, 0.0, 1.0); glVertex2f(0.5, -0.5);glEnd();
}

欢迎关注我,一起交流!

http://www.xdnf.cn/news/3926.html

相关文章:

  • 解决因字段过长使MYSQL数据解析超时导致线上CPU告警问题
  • 技术犯规计入个人犯规吗·棒球1号位
  • [C语言]第一章-初识
  • 【Linux】深入理解Linux基础IO:从文件描述符到缓冲区设计
  • Java求职面试:Spring Boot与微服务的幽默探讨
  • 架构思维:构建高并发读服务_异构数据的同步一致性方案
  • C语言:文件操作
  • Cognito
  • Android基于绑定的控件用法
  • 文献分享:CH-CL配对和VL结构域的完整性影响IgG1分泌过程
  • XGBoost算法原理及Python实现
  • K230的ISP(图像信号处理器)通常支持多通道输出,常见配置为3个独立通道
  • CATIA高效工作指南——曲面设计篇(一)
  • 49. 字母异位词分组
  • 高等数学-第七版-下册 选做记录 习题10-2
  • 【C++11】其他一些新特性 | 右值引用 | 完美转发
  • Allegro23.1新功能之如何设置高压爬电间距规则操作指导
  • AtCoder Beginner Contest 404 C-G(无F)题解
  • Linux之用户管理
  • SimpleLive 1.8.1 |聚合虎牙、斗鱼、哔哩哔哩及抖音直播
  • 胶合目录解释
  • 【with 在长难句中有哪几种翻译?】
  • 洛谷 P2866 [USACO06NOV] Bad Hair Day S
  • UNet 改进(22):结合Transformer结构
  • 《算法导论(原书第3版)》下载
  • Linux watch 命令使用详解
  • Vue 虚拟DOM和DIff算法
  • 从上帝视角看文件操作
  • 杜教筛原理,实现与时间复杂度分析
  • 【服务器通信-listen】——int listen(int sockfd, int backlog)