前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【OpenGL】十、OpenGL 绘制点 ( 初始化 OpenGL 矩阵 | 设置投影矩阵 | 设置模型视图矩阵 | 绘制点 | 清除缓冲区 | 设置当前颜色值 | 设置点大小 | 绘制点 )

【OpenGL】十、OpenGL 绘制点 ( 初始化 OpenGL 矩阵 | 设置投影矩阵 | 设置模型视图矩阵 | 绘制点 | 清除缓冲区 | 设置当前颜色值 | 设置点大小 | 绘制点 )

作者头像
韩曙亮
发布于 2023-03-28 12:56:16
发布于 2023-03-28 12:56:16
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

文章目录

上一篇博客 【OpenGL】九、OpenGL 绘制基础 ( OpenGL 状态机概念 | OpenGL 矩阵概念 ) 简单介绍 OpenGL 中的一些理论概念 ; 本篇博客开始使用 OpenGL 绘制 点 ;

一、初始化 OpenGL 矩阵


OpenGL 矩阵环境初始化 , 主要是 投影 ( Projection ) 矩阵 和 模型视图 ( ModelView ) 矩阵 ;

1、设置投影矩阵

设置 投影 ( Projection ) 矩阵 : 首先要选中投影矩阵 , 告知 GPU 当前要操作的矩阵是投影矩阵 , 然后再进行设置 ; 通过调用 gluPerspective 方法设置投影矩阵参数 , 其四个参数的含义分别是 :

  • 参数一 ( GLdouble fovy ) : 摄像机的视口角度
  • 参数二 ( GLdouble aspect ) : 窗口的宽高比
  • 参数三 ( GLdouble zNear ) : 可视的最近的距离
  • 参数四 ( GLdouble zFar ) : 可视的最远距离
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void APIENTRY gluPerspective (
    GLdouble fovy, 
    GLdouble aspect, 
    GLdouble zNear, 
    GLdouble zFar);

设置投影矩阵代码示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   // 矩阵环境初始化 , 主要是投影矩阵和模型矩阵 

   // ( 选中投影矩阵 ) 设置矩阵模式 , 告知 GPU 当前要操作的矩阵是投影矩阵
   glMatrixMode(GL_PROJECTION);
   // ( 给投影矩阵设置值 ) 向投影矩阵设置参数
   // 参数一 : 50.0f 是摄像机的视口角度
   // 参数二 : 800.0f / 600.0f 是窗口的宽高比
   // 参数三 : 0.1f , 可视的最近的距离
   // 参数四 : 1000.0f , 可视的最远距离
   gluPerspective(50.0f, 800.0f / 600.0f, 0.1f, 1000.0f);

摄像机的视口角度就是下面的 可视角度 , 视口角度越大 , 可视范围越大 ;

空间中只有处于下面 椎体范围内的物体 , 才能被转到视口中 , 最终 投影到屏幕中显示 , 处于椎体外部的空间无法显示 ;

设置的 参数三 就是 近平面的距离 near , 参数四 就是 远平面距离 far ,

角度 + 近平面 + 远平面 确定了一片三维空间 , 这个空间中就是要在屏幕中显示的空间 ;

2、设置模型视图矩阵

设置 模型视图 ( ModelView ) 矩阵 : 首先选中 模型视图 ( ModelView ) 矩阵 , 然后进行设置 , 下面的代码中设置的是一个 单位阵 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   // 上述设置好了摄像机的参数 , 具体的摄像机能看什么东西 , 就需要模型视图矩阵设置

   // ( 选中模型矩阵 )
   glMatrixMode(GL_MODELVIEW);
   // ( 设置模型矩阵值 ) , 这里设置的是单位矩阵
   glLoadIdentity();

设置矩阵的套路就是 , 先选中指定的矩阵 , 然后再设置该矩阵 ;

二、绘制点


绘制点的操作需要以下几步 , ① 清除缓冲区 , ② 设置当前的颜色 , ③ 设置当前绘制的点的大小 , ④ 开始绘制点 , ⑤ 将缓冲区绘制到前台 ;

1、清除缓冲区

每次渲染场景前 , 都需要清除缓冲区 ;

OpenGL 绘制时 , 如果设置帧率为 60 FPS , 每秒中绘制 60 次 , 每次绘制都需要 以 清除缓冲区开始 , 以将缓冲区绘制到前台结束 ;

清除缓冲区示例代码 : 清除缓冲区会在界面中绘制背景颜色 , 该颜色就是之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色 , 该 清除颜色 值也是属于 OpenGL 状态机中的值 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
		// 清除缓冲区 , 
		// 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区
		// 红色背景
		glClear(GL_COLOR_BUFFER_BIT);

更多细节参考 【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★ 博客 ;

2、设置当前颜色值

设置当前的绘制颜色 : 调用 glColor4ub 函数设置当前绘制颜色 , 传入的参数是 4 个 unsigned byte 类型的值 ;

四个参数分别是 R 红色 G 绿色 B 蓝色 A 透明度 , 每个颜色分量占 1 字节 , 取值范围 0 ~ 255 ;

代码示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        // 设置当前的绘制颜色 , 4 个 unsigned byte 
        // 每个颜色的分量占一个字节
        // 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
        // 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
        glColor4ub(255, 255, 255, 255);

3、设置绘制点的大小

设置绘制点的大小 , 这里设置的是 20 像素 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        // 设置绘制点的大小 20 像素
        glPointSize(20.0f);

4、绘制点

绘制点时, 会将从 glBegin 到 glEnd 之间的所有的点都绘制出来 , 可以调用 glVertex3f 方法设置点 ;

设置了几个点 , 就会绘制几个点 , 如下代码中设置了一个点 , 那么就只绘制这一个点 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        // 绘制点时, 会将从 glBegin 到 glEnd 之间的所有的点都绘制出来
        // 可以调用 glVertex3f 方法设置多个点
        // 绘制点开始
        glBegin(GL_POINTS);

        // 设置绘制点的位置
        glVertex3f(0.0f, 0.0f, -0.5f);

        // 绘制点结束
        glEnd();

5、将缓冲区绘制到前台

上述的操作都是缓冲区绘制操作 , 绘制完毕后 , 再调用 SwapBuffers 方法 , 正式将缓冲区绘制到屏幕上 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
		// 将后缓冲区绘制到前台
		SwapBuffers(dc);

三、部分代码示例


这里只展示部分代码 , 完整代码可以到 博客源码快照 中查看 , 已上传 CSDN 资源 , 关注即可下载 ;

初始化 OpenGL 相关代码 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   // 创建 OpenGL 的渲染上下文

   // 获取窗口设备 
   dc = GetDC(hWnd);

   // 颜色描述符, 像素格式描述符 , 选取 OpenGL 渲染的像素格式
   PIXELFORMATDESCRIPTOR pfd;

   // 将 PIXELFORMATDESCRIPTOR 结构体清空
   memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));

   // 填充结构体

   // 设置版本号
   pfd.nVersion = 1;
   // 结构体大小
   pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
   // 颜色缓冲区 32 位
   pfd.cColorBits = 32;
   // 深度缓冲区 24 位
   pfd.cDepthBits = 24;
   pfd.cStencilBits = 8;
   // 颜色格式
   pfd.iPixelType = PFD_TYPE_RGBA;
   pfd.iLayerType = PFD_MAIN_PLANE;

   // 分别设置 绘制到桌面窗口 , OpenGL 支持 , 双缓冲 标志位 
   // 双缓冲区可以让画面更流畅 
   pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;

   // 选择像素格式 , 如果返回 -1 , 说明选择像素格式失败 , 一般情况下该选择是成功的 
   int pixelFormat = ChoosePixelFormat(dc, &pfd);

   // 设置像素格式
   SetPixelFormat(dc, pixelFormat, &pfd);

   // 创建 OpenGL 上下文对象 , 注意该操作必须在设置完像素格式后进行操作
   HGLRC rc = wglCreateContext(dc);

   // 设置 OpenGL 上下文对象 , 将 rc 和 dc 作为当前的渲染设备
   wglMakeCurrent(dc, rc); 

   // 设置清除缓冲区背景颜色
   // glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
   // 对应的参数是 红色 , 绿色 , 蓝色 , 透明度
   // 这里设置的是红色
   glClearColor(1.0, 0.0, 0.0, 1.0);


   // 矩阵环境初始化 , 主要是投影矩阵和模型矩阵 

   // ( 选中投影矩阵 ) 设置矩阵模式 , 告知 GPU 当前要操作的矩阵是投影矩阵
   glMatrixMode(GL_PROJECTION);
   // ( 给投影矩阵设置值 ) 向投影矩阵设置参数
   // 参数一 : 50.0f 是摄像机的视口角度
   // 参数二 : 800.0f / 600.0f 是窗口的宽高比
   // 参数三 : 0.1f , 可视的最近的距离
   // 参数四 : 1000.0f , 可视的最远距离
   gluPerspective(50.0f, 800.0f / 600.0f, 0.1f, 1000.0f);

   // 上述设置好了摄像机的参数 , 具体的摄像机能看什么东西 , 就需要模型视图矩阵设置

   // ( 选中模型矩阵 )
   glMatrixMode(GL_MODELVIEW);
   // ( 设置模型矩阵值 ) , 这里设置的是单位矩阵
   glLoadIdentity();

OpenGL 绘制相关代码 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
		// 渲染场景

		// 清除缓冲区 , 
		// 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区
		// 红色背景
		glClear(GL_COLOR_BUFFER_BIT);

        // 设置当前的绘制颜色 , 4 个 unsigned byte 
        // 每个颜色的分量占一个字节
        // 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
        // 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
        glColor4ub(255, 255, 255, 255);

        // 设置绘制点的大小 20 像素
        glPointSize(20.0f);

        // 绘制点时, 会将从 glBegin 到 glEnd 之间的所有的点都绘制出来
        // 可以调用 glVertex3f 方法设置多个点
        // 绘制点开始
        glBegin(GL_POINTS);

        // 设置绘制点的位置
        glVertex3f(0.0f, 0.0f, -0.5f);

        // 绘制点结束
        glEnd();



		// 将后缓冲区绘制到前台
		SwapBuffers(dc);

四、运行效果展示


设置的清除缓冲区背景颜色是红色 , 因此整体背景显示的是红色 ,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   // 设置清除缓冲区背景颜色
   // glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
   // 对应的参数是 红色 , 绿色 , 蓝色 , 透明度
   // 这里设置的是红色
   glClearColor(1.0, 0.0, 0.0, 1.0);

设置的 当前绘制颜色 是白色 , 设置当前绘制点的大小 20 像素 , 绘制的效果就是一个 20 像素的点 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        // 设置当前的绘制颜色 , 4 个 unsigned byte 
        // 每个颜色的分量占一个字节
        // 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
        // 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
        glColor4ub(255, 255, 255, 255);

        // 设置绘制点的大小 20 像素
        glPointSize(20.0f);

五、相关资源


GitHub 地址 : https://github.com/han1202012/OpenGL

博客源码快照 : https://download.csdn.net/download/han1202012/14505038

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
手机通讯录删除怎么恢复?主要靠它们
  手机通讯录删除怎么恢复?现在的社交工具遍天都是,不过最初的社交工具还属通讯录,毕竟在最初大家都是通过通讯录来交流的,打电话发短信。现在使用的都觉少了也不会在意手机里面的通讯录的,当需要时发现手机中的通讯录删除了怎么办?手机通讯录删除怎么恢复?
科技第六人
2019/09/05
1.2K0
手机通讯录删除怎么恢复?主要靠它们
手机通讯录误删怎么恢复?最好用的方法一学就会
  手机通讯录误删怎么恢复?在手机上总会遇到一些误删除的情况,比如删除了手机上的照片,通讯录,短信等数据,我们都比较的担心能不能将这些删除的数据进行找回?其实是可以恢复的,要恢复这些数据应该怎么办呢?现在都是可以从网上找到答案的,到底手机通讯录误删怎么恢复?
科技第六人
2019/08/13
8060
手机通讯录误删怎么恢复?最好用的方法一学就会
手机通讯录误删怎么恢复?常见方法分享
手机通讯录误删怎么恢复?在使用通讯录的与他人联系的时候把手机里面的通讯录不小心删除了,但是不知道怎么才能将这些删除的联系人恢复,之后就去找了一些方法将手机通讯录找回来,下面就分享一些可以恢复手机通讯录的方法。一起看看吧。
科技第六人
2019/08/26
1.3K0
手机通讯录误删怎么恢复?常见方法分享
苹果手机怎么恢复短信?简单方法教你恢复
  苹果手机怎么恢复短信?在手机中有时候一天会收到很多的短信,当然也有一些垃圾短信在里面,不过大多数都是垃圾短信收到的都比较多,一旦多了就想删除这些垃圾短信。由于太多短信偶尔会将手机中的重要短信当做垃圾短信。
科技第六人
2019/09/09
1.9K0
苹果手机怎么恢复短信?简单方法教你恢复
手机短信删除了怎么恢复?简单方法了解一下
  手机短信删除了怎么恢复?日常生活中会有收到很多的短信,不管是一些重要短信还是一些垃圾短信都会保存到手机里面,垃圾短信太多就会想去清理掉那些不需要的短信,在清理的过程中不慎将一些重要的短信删除了怎么办?手机短信删除了怎么恢复?
科技第六人
2019/08/30
3K0
手机短信删除了怎么恢复?简单方法了解一下
手机删除的通讯录怎么恢复?实用的简单技巧
  手机删除的通讯录怎么恢复?现在使用通讯录的次数越来越少了,只有在联系不到的时候才会通过手机联系人来通过打电话的方式来对与其进行联系,正常时间都不怎么会使用,虽然长时间不用手机通讯录但是有时候会发现有些通讯录莫名消失,那么怎么恢复这些通讯录呢?手机删除的通讯录怎么恢复?
科技第六人
2019/09/11
1.1K0
手机删除的通讯录怎么恢复?实用的简单技巧
新华社点名批评!有些 App 太贪婪了。开发者如何应对?
源 / 新华网 文 / 颜之宏/汪奥娜/周蕊/李黔渝 一款普通的手机浏览器,不开启定位权限就无法正常使用;一个普通的手机输入法,拒绝它收集你的信用卡号和密码等个人信息就不给你用…… 继手机App被媒体曝光过度获取用户权限后,一些软件开发者不仅没有改正错误,还耍起了“强制索权”的蛮横。是用户真的“对隐私不敏感”,还是没有选择余地?新华社“中国网事”记者对时下流行的一些App进行了随机测试。 App嗑着“猛药”玩套路:不授权不给用 “我想掌握自己的流量使用情况,所以下载了一个电信营业厅App,结果
顶级程序员
2018/04/26
9100
新华社点名批评!有些 App 太贪婪了。开发者如何应对?
手机通讯录误删了怎么恢复?这样快速恢复
  手机通讯录误删了怎么恢复?通讯录是我们手机上的一项重要数据,虽然现在使用到通讯录的次数会越来越少,所以有时候也不会在意手机里面的通讯录,通讯录里面肯定会有很多重要的联系人在里面,万一里面的通讯录数据被删除了怎么办?手机通讯录误删了怎么恢复?
科技第六人
2019/10/16
1.3K0
手机通讯录误删了怎么恢复?这样快速恢复
手机通讯录删除了怎么恢复?教你快速恢复方法
  手机通讯录删除了怎么恢复?现在我们手机上都会有很多重要的数据,其中通讯录就是一项重要的数据之一,虽然现在很多人都未必会使用到通讯录,但是还是特别重要的数据,有时候我们会使用通讯录进行通话,如果发现有些联系人被删除了怎么办?手机通讯录删除了怎么恢复?
科技第六人
2019/10/22
1.1K0
手机通讯录删除了怎么恢复?教你快速恢复方法
手机通讯录删除了怎么恢复?用过都收藏了
  手机通讯录删除了怎么恢复?相信很多人的手机里面都存在很多的通讯录,不过现在来说通讯录并没有多少人会用了,毕竟现在使用通讯录联系的并不多了,不过还是会有不少人会使用到通讯录,可是当在使用通讯录联系人的时候发现通讯录被删除了怎么办?手机通讯录删除了怎么恢复?
科技第六人
2019/08/20
1.3K0
手机通讯录删除了怎么恢复?用过都收藏了
手机通讯录删除了怎么恢复?这几个方法你不知道
  手机通讯录删除了怎么恢复?相信大家在手机里面还存着很多的重要联系人,虽然现在没有去使用过,不过以后说不定可能就会用到了。有时候会去更新一些联系人,但是如果发现了手机里面有的联系人被删除了怎么办?手机通讯录删除了怎么恢复?
科技第六人
2019/09/30
1.4K0
手机通讯录删除了怎么恢复?这几个方法你不知道
苹果手机通讯录怎么恢复?简单方便的方法恢复
  苹果手机通讯录怎么恢复?很多没有使用过苹果系统的用户对手机都比较的陌生,在操作方面也不是很熟悉,所以我们有时候可能会误删除了手机里面的数据,手机里面的通讯录就有很多也可能将联系人删除了,当想要查找时却不知道该怎么恢复?苹果手机通讯录怎么恢复?
科技第六人
2019/09/10
1.2K0
苹果手机通讯录怎么恢复?简单方便的方法恢复
安卓手机删除的照片如何恢复?轻松找回删除照片
  安卓手机删除的照片如何恢复?现在很多需要买手机的用户对手机的像素都会有要求的,现在很多主流相机的手机上市,许多喜欢拍照的用户都会去入手,所以不管是在新手机中还是在以前的手机中都会有很多的照片,当时会有手误的现象将手机照片删除,那么如何恢复?安卓手机删除的照片如何恢复?
科技第六人
2019/10/18
2.6K0
安卓手机删除的照片如何恢复?轻松找回删除照片
手机删除的通讯录怎么恢复?这些方法一看就懂
  手机删除的通讯录怎么恢复?现在的社交工具发展越来越快了,以前使用的很多功能都开始渐渐放弃了,比如手机上的通讯录现在应该不会有很多人用来打电话了,而且里面的通讯录也很少,不过里面的联系人还有不少重要的,万一删除了怎么办?手机删除的通讯录怎么恢复?
科技第六人
2019/10/11
9330
手机删除的通讯录怎么恢复?这些方法一看就懂
手机联系人删除了怎么恢复?不懂得可以看这里
  手机联系人删除了怎么恢复?作为手机上最重要的功能之一经常会有一些号码存入到通讯录里面,一般在手机里面的通讯录都是比较重要的,但先如今已经没有很多机会使用通讯录的联系人通话了所以也不会在意那么多,但是如果发现通讯录里面的联系人删除了怎么办?手机联系人删除了怎么恢复?
科技第六人
2019/10/25
1K0
手机联系人删除了怎么恢复?不懂得可以看这里
手机照片删除了怎么恢复?教你恢复照片的方法
手机照片删除了怎么恢复?前段时间在外面旅游拍摄了很多照片留在手机里面,为了把一些拍的不好的照片删除却不小心删除了之前的重要照片,想要把之前的照片恢复回来不知道该怎么办,手机里面的照片删除了如何找回?手机照片删除了怎么恢复?
科技第六人
2019/08/28
2.1K0
手机照片删除了怎么恢复?教你恢复照片的方法
手机删除的照片如何恢复?超简单方法教你
  手机删除的照片如何恢复?现在来说很多人都比较喜欢使用手机拍照,如今的手机相机像素越来越好,喜欢拍照的小伙伴也很多,这样在手机中就会存入大量的照片在手机中,有时候还会去查看照片,当我们发现手机中有些照片被删除了怎么办?手机删除的照片如何恢复?
科技第六人
2019/09/26
6090
手机删除的照片如何恢复?超简单方法教你
QQ怎么恢复聊天记录?这两个简单方法恢复
  QQ怎么恢复聊天记录?现在使用QQ的已经没有以往多了,不过很多遇到问题的都是差不多的,我们在手机上也会遇到很多的聊天记录删除的情况,而且还有很多的文件在里面,但是有时候会清理手机QQ中的数据,如果不小心清除了一些重要聊天记录怎么办?QQ怎么恢复聊天记录?
科技第六人
2019/09/11
4.4K0
QQ怎么恢复聊天记录?这两个简单方法恢复
苹果手机怎么恢复通讯录?iOS恢复最好方法
  苹果手机怎么恢复通讯录?现在还会有很多人都在使用通讯录,在手机中还会保存在通讯录在手机里面,不过大多数都不会去使用,因为现在都在使用微信了,所以通过通讯录联系的并不多,但是通讯录作为最原始的通讯方式之一,还是比较重要的,如果删除了通讯录怎么恢复。苹果手机怎么恢复通讯录?
科技第六人
2019/08/14
1.2K0
苹果手机怎么恢复通讯录?iOS恢复最好方法
手机误删通讯录怎么恢复?教你很简单的方法
  手机误删通讯录怎么恢复?很多朋友都遇到过手机里面的联系人被删除的情况,虽然现在使用到通讯录的地方不错,但是手机中的联系人还是极其重要的东西,毕竟是联系他人的一个重要信息,不过在操作手机的时候难免会有一些误操作,可能因为某些操作就会将手机中重要的数据删除了,那么该怎么办呢?手机误删通讯录怎么恢复?
科技第六人
2019/11/06
2.6K0
手机误删通讯录怎么恢复?教你很简单的方法
推荐阅读
相关推荐
手机通讯录删除怎么恢复?主要靠它们
更多 >
LV.2
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验