文章目录

  • 一、初始化 OpenGL 矩阵
    • 1、设置投影矩阵
    • 2、设置模型视图矩阵
  • 二、绘制点
    • 1、清除缓冲区
    • 2、设置当前颜色值
    • 3、设置绘制点的大小
    • 4、绘制点
    • 5、将缓冲区绘制到前台
  • 三、部分代码示例
  • 四、运行效果展示
  • 五、相关资源

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

一、初始化 OpenGL 矩阵


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

1、设置投影矩阵

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

  • 参数一 ( GLdouble fovy ) : 摄像机的视口角度
  • 参数二 ( GLdouble aspect ) : 窗口的宽高比
  • 参数三 ( GLdouble zNear ) : 可视的最近的距离
  • 参数四 ( GLdouble zFar ) : 可视的最远距离
void APIENTRY gluPerspective (GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);

设置投影矩阵代码示例 :

   // 矩阵环境初始化 , 主要是投影矩阵和模型矩阵 // ( 选中投影矩阵 ) 设置矩阵模式 , 告知 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 ) 矩阵 , 然后进行设置 , 下面的代码中设置的是一个 单位阵 ;

   // 上述设置好了摄像机的参数 , 具体的摄像机能看什么东西 , 就需要模型视图矩阵设置// ( 选中模型矩阵 )glMatrixMode(GL_MODELVIEW);// ( 设置模型矩阵值 ) , 这里设置的是单位矩阵glLoadIdentity();

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

二、绘制点


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

1、清除缓冲区

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

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

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

     // 清除缓冲区 , // 使用之前设置的 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 ;

代码示例 :

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

3、设置绘制点的大小

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

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

4、绘制点

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

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

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

5、将缓冲区绘制到前台

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

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

三、部分代码示例


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

初始化 OpenGL 相关代码 :

   // 创建 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 绘制相关代码 :

     // 渲染场景// 清除缓冲区 , // 使用之前设置的 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);

四、运行效果展示


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

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

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

        // 设置当前的绘制颜色 , 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

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

  1. OpenGL笔记:观察坐标系(模型视图矩阵)、投影变换

    观察坐标系参数 说明:其中观察方向与+Zview相反. 观察平面法向量 观察方向通常沿着Zview轴,因此观察平面,有时也称投影平面一般假设为与该轴垂直.这样,观察平面的方向 及正Zview轴可定义为 ...

  2. ModelMatrix、ModelViewMatrix、ProjectionMatrix、NormalMatrix模型矩阵、模型视图矩阵、投影矩阵、正规矩阵详解

    ModelMatrix.ModelViewMatrix.ProjectionMatrix.ModelMatrix模型矩阵.模型视图矩阵.投影矩阵.正规矩阵详解 1. 前言 在openGL经常用到Mod ...

  3. WEBGL学习【四】模型视图矩阵

    <html lang="zh-CN"> <!--服务器运行地址:http://127.0.0.1:8080/webgl/LearnNeHeWebGL/NeHeWe ...

  4. OpenGL之利用模型视图矩阵和投影矩阵让球体自动旋转

    核心业务 绘制球体(SetupRC()): // 绘制一个球体gltMakeSphere(torusBatch, 0.5f, 10, 20);glPolygonMode(GL_FRONT_AND_BA ...

  5. OpenGL教程 用2D图形介绍OpenGL

    OpenGL教程 用2D图形介绍OpenGL 1.设置OpenGL 要设置OpenGL,取决于您的编程平台,请阅读: 如何在C / C ++中编写OpenGL程序. 如何在Java中编写OpenGL程 ...

  6. 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)

    0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...

  7. OpenGL十二讲代码

    文章目录 OpenGL十二讲代码-by yjq 参考资料 第一讲 画一个矩形 第二讲 画一个五角星 画一个圆 画一个正弦函数 第三讲 画点 画虚线 多边形 多边形的两面 前后反转 剔除多边形表面 镂空 ...

  8. openGL之几何变换(绘制球体)---openGL学习笔记(六)

    openGL中的变换包括:   ①视图(modeling)---指定观察者或者相机位置  GLU.glLookAt() 默认情况下,在透视投影中观察者是从原点向Z轴负方向看去,也可以自行设置.   ② ...

  9. OpenGL第五讲——模型视图变换和投影变换

    Chapter5 OpenGL变换 几种不同的变换: 视图变换:从不同的位置去观察它 模型变换:移动.旋转.放大.缩放 近大远小的透视效果.投影变换 5.1 模型变换和视图变换 从"相对移动 ...

最新文章

  1. RHCE系列之LVM----理论篇
  2. 算法 --- [map的使用]求最大和谐子序列
  3. mysql 字符串类型 小数_在Mysql中,小数数据类型是指由字符串来表示的数字。(  )...
  4. 0.Overview——Deep Learning
  5. The Top 8 Security and Risk Trends We’re Watching
  6. ==和Equal()
  7. 酷比魔方iwork8刷机shell_酷比魔方iwork8超级版双系统刷机教程,remix+Windows10,序列号i1开头数字结尾...
  8. k3cloud是java,JAVA调用K3Cloud接口新增报“调用目标发生异常
  9. KVASER 与 Matlab联合使用
  10. 左神数据结构与算法(基础提升)——01
  11. Android中高级进阶开发面试题冲刺合集(七)
  12. RPG游戏Demo学习笔记一
  13. echarts 象形图背景、柱状图顶部装饰
  14. 提供云媒体服务器图片,云开发 把媒体文件上传到微信服务器 已知报错
  15. Interventional Contrastive Learning with Meta Semantic Regularizer
  16. Google浏览器翻译不能使用的解决办法
  17. 王志文神秘老婆是昔日上海名模陈坚红(图)
  18. 闭环管理--循环往复的闭环系统
  19. 面向复盘的项目管理步骤
  20. Cockos Reaper for Mac(专业数字音频制作软件)

热门文章

  1. AcDream 1079 郭氏数
  2. linux ifconfig命令配置ip地址
  3. java中System重定向输出流
  4. Opencv中cvCopy() 和cvCloneImage()的区别
  5. Concurrent Package
  6. jquery-ui里日期插件的使用
  7. 每日记载内容总结32
  8. 启动nginx服务提示 nginx: [emerg] still could not
  9. Sqlite c/c++ api 学习
  10. python--输出spwm的数组