Opengl

学习网站

想要系统的学,推荐learnopengl网站官网链接.,同时可以看工具书《OpenGL编程指南(第8版)》

目前市面上的教程,大部分是针对新版本的opengl,即核心渲染模式,核心渲染模式更灵活也更难,因项目需要,我目前只是紧急的学习了opengl1.0+版本的简单操作,以后有机会的话再学习3.3版本的。

入门理解

opengl是一个渲染工具库,我们能操作的只用两种,一种是设置函数,一种是使某个设置生效函数

glClearColor(1.0, 1.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);

如上述两个,一个设置了clear清除动作时候用什么颜色清除,第二行表示开始clear这个动作,清除的对象就是GL_COLOR_BUFFER_BIT,即颜色缓冲池

简单绘制

在1.0+版本中,绘制几何图形非常简单,通过glbegin开始,glend结束,中间写需要的数据点,通过不同的绘制模式,来绘制不同的几何形状:

glBegin(GLenum mode);
glVertex3d(x,y,z);
glEnd();

常用的绘制模式有:
GL_POINTS 画离散的点
GL_LINES 画线(每两个点连成一条线)
GL_LINE_STRIP 画线(所有点相互相连,首尾不相连)
GL_LINE_LOOP 画线(所有点相互相连,首尾相连)
GL_POLYGON 填充面(将所有点围成的面进行填充)
GL_QUADS 填充面(将每四个点围成的面进行填充,相邻点之间不填充)
GL_QUAD_STRIP 填充面(每两个点构成一条线,每两个线构成一个四边形)
GL_TRIANGLES 填充三角形(将每三个点围成的三角形进行填充,相邻的点之间不填充)
GL_TRIANGLE_STRIP 填充三角形(将每三个点围成的三角形进行填充,相邻的点之间填充)
GL_TRIANGLE_FAN 填充三角形(以第一个点为顶点,之后每两个点合起来围成的三角形进行填充,相邻的点之间填充)

理解世界坐标、窗口坐标

这一节建议仔细看learnopengl网站,坐标系统这一章节,教程链接: link.
个人理解:
所有的工作目的,都是为了将一个我们构建的3d世界,在2d的电脑屏幕上合理地显示出来。其中有三个主要的矩阵,通过改变这些矩阵,能做到控制展示的效果。
一般通过改变GL_MODELVIEW矩阵,来旋转、平移、缩放世界中的物体
一般通过改变GL_PROJECTION矩阵,来改变投影的效果
opengl会时刻维护这两个矩阵,提供的关于矩阵的操作函数,都是对于当前矩阵来说的,如果想用一个矩阵乘modelview矩阵,那么需要先把modelview矩阵切换到当前矩阵,再使用乘法操作。
为了更好的理解坐标的问题,以下是一些实际例子讲解

// 创建了两个vector,用来保存opengl的两个矩阵std::vector<double> projectionmatrix;std::vector<double> modelviewmatrix;glMatrixMode(GL_MODELVIEW);
// 切换当前矩阵为GL_MODELVIEW矩阵
glLoadIdentity();
// 设置当前矩阵为单位阵,即物体没有变化
glTranslated(0,0,-2);
// 移动当前矩阵,沿z轴负向2单位,即站在0,0,0看,物体在0,0,-2
glGetDoublev(GL_MODELVIEW_MATRIX, &modelviewmatrix[0]);
// 获取当前的矩阵,并保存到自定义的modelviewmatrix
glMultMatrixd(&modelviewmatrix[0]);
// 乘法操作,这样操作会让modelviewmatrix矩阵与当前矩阵相乘
// 这一步操作没有实际意义,只是为了展示如何进行乘法操作
// 在我们需要时,可以将数据存到modelviewmatrix,再乘进当前矩阵
glMatrixMode(GL_PROJECTION);
// 切换当前矩阵为GL_PROJECTION矩阵

通过glVertex3d(x,y,z)这种方式设置的数据,opengl在获得了所有的数据之后,会按比例,把他们的坐标缩放到【-1,1】之间,初始时,所有数据构成的整体会在世界坐标(0,0,0)处,经过modelview矩阵,他们会被整体旋转平移,例如上例中,如果使用了glTranslated,他们就会被平移。
在经过裁剪、投影,最终会被呈现在我们的2d窗口上。具体投影、裁剪的过程,如果不设置不干预,opengl自己会做。

从鼠标窗口坐标到世界坐标转化

这是一个很常用的功能,展示一下标准代码 :

void SketcherInteractiveWindow::pick_point(int x, int y)
{// 这是我在qt里的程序,x,y是qt窗口获取到鼠标事件的,鼠标的x,y窗口坐标makeCurrent();// 这个函数是“激活”了当前opengl状态机,因为多线程情况下,要保证正确,调用这个函数,就能保证你现在做的操作,操作的是当前的opengl状态机glMatrixMode(GL_PROJECTION);glLoadMatrixd(&projectionmatrix[0]);glMatrixMode(GL_MODELVIEW);glLoadMatrixd(&modelviewmatrix[0]);// 把当前矩阵保存下来GLint viewport[4];glGetIntegerv(GL_VIEWPORT, viewport);   // 获取你的视口大小,注意,视口和窗口可能一致,可能不一致,opengl最后呈现在视口,qt是窗口坐标GLdouble winX = double(x);GLdouble winY = double(height() - y);// qt的xy方向和opengl xy方向不一致winY = winY / height() * viewport[3];// 这里是我的qt窗口和opengl视口大小不一样,我做了一个等比例修改GLfloat winZ = 0.0;glReadPixels((int)winX, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);// glReadPixels,功能是读取当前winx,winy下,世界里,第一个深度值// 怎么理解?当3d变成2d,会有深度的区别,这个函数能读取你鼠标指的那个位置的// 最前面的那个像素,返回winz的值double newx,newy,newz;gluUnProject(winX, winY, (GLdouble)winZ, &modelviewmatrix[0], &projectionmatrix[0], viewport, &newx, &newy, &newz);// 注意,这里winx、winy、winz都是上面的视口坐标// modelviewmatrix、projectionmatrix都是我上个例子给出的,我自己保存的opegnl两个矩阵// 整个函数的功能是,根据屏幕上面展示的坐标,倒退,找到世界坐标}

视口、投影、裁剪

之后会把这节更新上,未完待续……

Opengl 入门,学习网站,常用函数详解 (gluproject,gluUnProject,glReadPixels)相关推荐

  1. QT:常用函数详解--常用操作记录(个人笔记)

    QT:常用函数详解(个人笔记) PS:一下内容个人笔记,要求自己看懂,随笔,阅读体验会很差很差! Qt setContentsMargins()函数 函数原型:void QLayout::setCon ...

  2. python的shutil模块是内置的_Python之shutil模块11个常用函数详解,python内置函数是什么...

    Python之shutil模块11个常用函数详解,python内置函数是什么 shutil 是 Python 中的高级文件操作模块,与os模块形成互补的关系,os主要提供了文件或文件夹的新建.删除.查 ...

  3. 电子元器件从入门到精通pdf_电子元件入门基础,常用电子元器件详解大全作用-涨知识必读...

    1.电子元器件筛选的必要性 电子元器件的固有可靠性取决于产品的可靠性设计, 在产品的制造过程中, 由于人为因素或原材料. 工艺条件. 设备条件的波动, 最终的成品不可能全部达到预期的固有可靠性. 在每 ...

  4. python中反三角函数用法_Python入门之三角函数atan2()函数详解

    python 的 Python入门之三角函数atan2()函数详解 描述 atan2() 返回给定的 X 及 Y 坐标值的反正切值. 语法 以下是 atan2() 方法的语法: import math ...

  5. MySql截取字符串的几个常用函数详解

    MySql截取字符串的几个常用函数详解 MySQL 截取字符的几个常用函数:left(), right(), substring(), substring_index(),mid(), substr( ...

  6. blankcount函数python,Python pandas常用函数详解

    本文研究的主要是pandas常用函数,具体介绍如下. 1 import语句 2 文件读取 df = pd.read_csv(path='file.csv') 参数:header=None 用默认列名, ...

  7. 【Python入门】Python之OS模块39个常用函数详解

    os,语义操作系统,所以该模块就是操作系统相关的功能了,用于处理文件和目录这些我们日常手动需要做的操作,比如新建文件夹.获取文件列表.删除某个文件.获取文件大小.重命名文件.获取文件修改时间等,该模块 ...

  8. UE4 C++入门之路4-PostInitProperties函数详解(设置属性默认值的四种方法)

    PostInitProperties函数详解 前言 设置属性默认值的四种方法 一 声明时赋值 二 构造函数赋值 三 构造函数初始化列表 四 PostInitProperties 前言 也许在工作或者学 ...

  9. shell入门学习笔记-12-命令详解: echo与printf

    系列目录与参考文献传送门: shell入门学习笔记-序章 命令详解 admindeMacBook-Pro:myshell admin$ type cd cd is a shell builtin ad ...

最新文章

  1. java log 封装_工具类之LogUtils
  2. zabbix 3.2安装部署(一)
  3. python怎么读文件夹下的文件夹-python2.7读取文件夹下所有文件名称及内容的方法...
  4. 多帧点云数据拼接合并_多工作簿数据合并,还在手动复制粘贴就out了,用批处理一键搞定...
  5. 牛客 - 牛牛的Link Power II(线段树)
  6. php入门篇-------PHPCMS 入口文件,自动加载系统函数和URL规则
  7. 了解cron以及使用cron定时备份MySQL
  8. 国内计算机专业最好的大学有哪些
  9. 云服务器的安全组各个端口代表什么意思?
  10. 实用机器人设计(一)-机器人技术基础
  11. java实现文章伪原创_网站伪原创的方法 - 百度搜狗360神马网站快速排名 - OSCHINA - 中文开源技术交流社区...
  12. matlab初学者_脚本文件调用函数文件
  13. gmail注册方法_如何在Gmail中释放空间:5种回收空间的方法
  14. 4.分支语句和循环语句
  15. openmv和stm32串口通信完成二维码识别
  16. java 分转元_java元转分分转元
  17. 渗透中超全的Google hack语法
  18. 单元格中添加自适应斜线
  19. 怀旧服一区和五区服务器位置,魔兽怀旧服战场分组怎么看?怀旧服战场分组一区五区怎么分的?...
  20. CCF201803-4-棋局评估

热门文章

  1. linux 玩 dosbox 游戏,在debian Linux上玩 dos 游戏(转)
  2. D. Black and White Stripe
  3. 科技云报道:RPA三大阵营 角逐软件自动化大市场
  4. VMware-Ubuntu连接U盘
  5. 第43课: Spark 1.6 RPC内幕解密:运行机制、源码详解、Netty与Akka等
  6. 用户体验至上 富士通iX500馈纸式扫描仪评测
  7. Ardunio开发实例-TMP006红外热电堆测温传感器
  8. 【gitHubDailyShare】Google 的研究科学家 Kevin P Murphy的概率机器学习
  9. Vue报错_normalized‘ of undefined
  10. 上下架和橱窗推荐如何设置,优化过程需要注意的地方