OpenGL | 搭建OpenGL 画画框架

news2024/12/26 11:25:22

一、搭建OpenGL 画画框架

    • 3D场景初始化

(1) 代码

void Init()
{
    glMatrixMode(GL_PROJECTION);     //将当前矩阵指定为投影矩阵,对投影矩阵操作
    gluPerspective(50.0f, 800.0f / 600.0f, 0.1f, 1000.0f);//创建一个对称的透视投影矩阵,并且用这个矩阵乘以当前矩阵
    glMatrixMode(GL_MODELVIEW);      //将当前矩阵指定为模型视图矩阵,对模型视图矩阵操作
    glLoadIdentity();                //把矩阵设为单位矩阵
}

(2)相关函数介绍

a. glMatrixMode 指定矩阵模式

glMatrixMode()命令将当前矩阵设置成参数所指定的模式,以满足不同绘图所需执行的矩阵变换。一般而言:

  • 在需要绘制出对象或要对所绘制对象进行几何变换时,需要将变换矩阵设置成模型视图模式;

  • 而当需要对绘制的对象设置某种投影方式时,则需要将变换矩阵设置成投影模式;

  • 只有在进行纹理映射时,才需要将变换矩阵设置成纹理模式。

与glLoadIdentity()一同使用,glLoadIdentity()功能是重置当前指定的矩阵为单位矩阵。

void glMatrixMode(GLenum mode)

mode 指定哪一个矩阵堆栈是下一个矩阵操作的目标,可选值: 

  • GL_MODELVIEW:对模型视图矩阵堆栈应用随后的矩阵操作。可以在执行此命令后,输出自己的物体图形了。

  • GL_PROJECTION:对投影矩阵堆栈应用随后的矩阵操作。可以在执行此命令后,为我们的场景增加透视。

  • GL_TEXTURE:对纹理矩阵堆栈应用随后的矩阵操作。可以在执行此命令后,为我们的图形增加纹理贴图。

b. gluPerspective 创建透视投影矩阵

OpenGL支持两种类型的投影变换,即透视投影和正交投影。

void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear, GLdouble zFar);

创建一个对称的透视投影矩阵,并且用这个矩阵乘以当前矩阵。

  • 参数fovy定义视野在Y-Z平面的角度,范围是[0.0, 180.0];

  • 参数aspect是投影平面宽度与高度的比率;

  • 参数Near和Far分别是近远裁剪面到视点(沿Z负轴)的距离,它们总为正值。

2. 绘制一个三角形

(1)代码

void Draw()
{
    glClearColor(1, 1, 1, 1.0f);  //白色背景
    glClear(GL_COLOR_BUFFER_BIT);

    glBegin(GL_TRIANGLES);        //注意是逆时针绘制
    glColor4ub(0, 0, 255, 255);   //蓝
    glVertex3f(-0.2f, -0.2f, -1.5f);
    
    glColor4ub(255, 0, 0, 255);   //红
    glVertex3f(0.2f, -0.2f, -1.5f);

    glColor4ub(0, 255, 0, 255);   //绿
    glVertex3f(0.0f, 0.2f, -1.5f);
    glEnd();
}

注意:绘制完成三角形之后,需要SwapBuffers交换缓冲区,否则画面绘制不出三角形。

//... 
//防止窗口一闪而过
    MSG msg;
    while (true)
    {
        if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
        {
            if (msg.message == WM_QUIT)
            {
                break;
            }
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        //实时绘制
        Draw();
        SwapBuffers(dc);    //交换缓冲区
    }
//...

(2)绘制效果

默认情况下 OpenGL 会绘制正面及背面两面。 点的正面方向是逆时针方向的 , 因此绘制的时候 , 默认是逆时针绘制 , 即第一个点连接第二个点 , 第二个点连接第三个点 , 第三个点连接第一个点 , 这样绘制。

正面就是摄像机对着的那一面,即:我们人眼看时呈逆时针绘制的那一面。

绘制三角形面时 , 在 glBegin 方法中传入 GL_TRIANGLES 参数 , 然后在 glBegin 和 glEnd 之间设置多个点 , OpenGL 会自动将三个点组成一个三角形面 , 绘制出来 。其中每个点都可以设置一个颜色值 , 面上的颜色都是通过三个点的颜色差值出来的。

(3)相关函数介绍

a. glClearColor

指定刷新颜色缓冲区时所用的颜色。注意:glClearColor只起到Set的作用,并不Clear。所以要和glClear联合使用。

b. glClear

清除缓冲区颜色,并设置为预设值。有四个参数:

GL_COLOR_BUFFER_BIT

当前为颜色写入启用的缓冲区。

GL_DEPTH_BUFFER_BIT

深度缓冲区。

GL_ACCUM_BUFFER_BIT

累积缓冲区。

GL_STENCIL_BUFFER_BIT

模具缓冲区。

3.参考文档

  • OpenGL 简介 - Win32 apps | Microsoft Learn

  • OpenGL之glMatrixMode函数的用法_草上爬的博客-CSDN博客_glmatrixmode

  • OpenGL中涉及到的矩阵变换_-yanhui-的博客-CSDN博客_opengl变换矩阵

  • opengl常用头文件 - IceArrow - 博客园 (cnblogs.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/190071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

世界上最大型的 Demo Drop DJ 比赛来到元宇宙!

简要介绍 WBDD 于 2023 年 1 月 26 日至 2 月 8 日进入元宇宙。 认识世界上最大型的 DJ 比赛获胜者,并在元宇宙中伴随着他们的音乐跳舞。 该体验将是线下活动的延伸,由 Mike Williams 担任活动大使。 体验将对所有人开放。 完成 80% 的任务&#xff…

51单片机简易出租车计费系统仿真设计( proteus仿真+程序+报告+讲解视频)

51单片机简易出租车计费系统仿真设计( proteus仿真程序报告讲解视频) 仿真图proteus 8.9及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0036 51单片机简易出租车计费系统仿真设计讲解视频1.主要功能:…

MXNet实现图片的样式风格迁移(Style Transfer)

样式迁移就是将一个样式(风格)应用到一张主图上,改变这张图片的风格,比如说拍摄了一张夜晚的图片,我们可以拿梵高的"星月夜"图片做样式,应用到拍摄的图片上,两者合成后的新图片&#…

linux基本功系列之uptime命令实战

文章目录一. uptime命令介绍二. 语法格式及常用选项三. 参考案例3.1 显示当前系统运行负载情况3.2 显示机器正常运行的时间3.3 显示机器启动时间3.4 关于平均负载的介绍总结前言🚀🚀🚀 想要学好Linux,命令是基本功,企业…

推荐 5 个实用 GitHub 项目

本期推荐开源项目目录:1. AI-For-Beginners2. 一个小巧轻便的 PDF 阅读器3. 开源的智能手表4. 开源内容管理系统5. 程序员海外工作/英文面试手册01AI-For-Beginners之前推荐过 Microsoft 出品的 Web 技术栈课程,本开源项目同样是 Microsoft 的 Azure Clo…

go runtime

go 运行时,也称为 go runtime,类似Java中的JVM虚拟机,不过runtime并非是虚拟机。其本身就是每个 go 程序的一部分,它会跟源码一起编译并链接到目标程序中,即便只写了一个 hello world 程序,这个程序中也包含…

day15 二叉树 | 104、二叉树的最大深度 111、二叉树的最小深度 222、完全二叉树的节点个数

题目 104、二叉树的最大深度 递归法(后序)(必须会) // 定义:输入根节点,返回这棵二叉树的最大深度 int maxDepth(TreeNode root) {if (root null) {return 0;}// 利用定义,计算左右子树的最大…

论文笔记:Graph WaveNet for Deep Spatial-Temporal Graph Modeling

IJCAI 2019 1 abstract & intro 时空数据挖掘问题大多数使用邻接矩阵来建模节点之间的属性关系,这种思路的一个基本假设是:节点信息取决于自身和邻居的历史信息。 但这类模型的假设存在着一些问题: 未能充分建模节点之间的依赖关…

宝塔部署springboot,vue,node.js项目

宝塔部署springboot项目: 先将命令转移到jar包所属文件夹中 分为短暂部署和永久部署 短暂部署:java -jar xxx.jar 永久部署:nohup java -jar demo-1.0.0.jar logs_mark.txt 2>&1 & nohup:linux的命令,代表关闭但持续运行 查看898…

52.Isaac教程--操纵杆

操纵杆 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录操纵杆使用游戏机操纵杆使用其他操纵杆使用 Playstation 操纵杆很容易控制运行 Isaac SDK 的机器人,但也可以使用其他控制器。 使用游戏机操纵杆 按照以下步骤校准您的…

微信小程序018小说在线阅读系统书城

管理员的主要功能有: 1.管理员输入账户登陆后台 2.个人中心:管理员修改密码和账户信息 3.用户管理:对注册的用户信息进行删除,查询,添加,修改 4.小说信息管理:对小说信息进行添加,修…

TCP/IP第六章笔记ICMP协议

文章目录6.1 引言6.2 ICMP报文分组格式和类型6.3 ICMP地址掩码请求与应答6.4 ICMP时间戳请求与应答6.5 ICMP端口不可达差错6.6 ICMP的处理(4.4BSD系统下)6.1 引言 第三章在IP选择路由时,如果一个报文最后限制转发次数用完后还传输不到目的地…

【高并发】- 不可不知道的RPC框架服务通信

前言 前面章节讲解了高并发系统中相关指标、为什么要学习高并发设计思想、高并发系统中每个环节的流量处理等思想。本章节讲解服务通信,来帮助大家更好理解系统间通信过程。 1 RPC框架介绍 RPC(Remote Procedure Call,远程过程调用&#xff0…

Win10家庭版和Win10专业版有什么区别?

win10操作系统拥有7个不同的版本,其中win10家庭版和专业版被人们广泛的应用,很多用户都不知道如何区分win10家庭版和专业版,接下来把win10家庭版和专业版有什么不同的地方告诉大家。我们一起来看看吧。 win10家庭版和专业版的区别&#xff1a…

java服务框架高级之微服务保护 Sentinel 限制规则,流控模式,流控效果

初识Sentinel 雪崩问题: 解决雪崩问题的常见方式有四种: 1.超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待 2.舱壁模式:限定每个业务能使用的线程数,避免耗尽…

2023外企还香吗?2022届计算机谈谈入职外企的感受和经历

互联网寒冬,大规模“毕业”的环境下,2023年外企又香了吗? 大家好,我是2022届计算机应届毕业生,毕业入职了一家大型非互联网外企,2022年由于只上了半年班,所以只有半年工资,总收入在1…

【JavaScript速成之路】一文带你初识JavaScript

📃个人主页:「小杨」的csdn博客 🔥系列专栏:【JavaScript速成之路】 🐳希望大家多多支持🥰一起进步呀! 文章目录前言1,JavaScript1.1,JavaScript概述1.2,Java…

【人工智能学习笔记】人工智能里的数学1——概述

与软件开发相比,人工智能领域需要大量数学知识。主要涉及微积分、线性代数、概率论和最优化。本文主要介绍人工智能里用到了哪些数学知识,试图向您提供一个目录式的、导读式的概述。后期计划一一展开讲解。本文作为我学习人工智能的笔记,主要…

C++继承(上)

我们知道,面向对象有三大特性:封装,继承,多态。封装前面已经说过,这篇文章主要说说继承。 文章目录1.继承的概念及定义1.1继承的概念1.2 继承定义1.2.1定义格式1.2.2继承关系和访问限定符2. 基类和派生类对象赋值转换…

vue.js客服系统实时聊天项目开发(十四)点击加载展示历史消息列表

当访客一进去聊天界面以后,需要获取一下历史消息展示到界面,并且需要能分页的原理展示 在顶部有一个加载更多记录的按钮,点击就能按分页获取数据 //展示历史消息记录getHistoryList(){var _thisthis;let pagesize5;this.$axios.get(this.ApiH…