openGL从零学起之入门介绍

  最近项目中涉及到了一些特效,如字体描边、场景调色和精灵的一些着色等,接触到了openGl部分,再加上之前有过unity3d的开发经验,就越发的对openGl感兴趣,应该说是对3D感兴趣吧。其实自己一直都感兴趣的就是虚拟现实的仿真技术和人工智能,希望以后能有机会进入这两个领域。废话不多说,直接开始openGl之旅,这个以前没接触过,有什么理解不到位或者完全错误的地方,请大神们直接指出,在此谢过了。

  当前,三维图形编程工具中最为突出的是SGI公司的OpenGL(Open Graphics Language,开放式的图形语言),它已经成为一个工业标准的计算机三维图形软件开发接口。值得一提的是,虽然微软有自己的三维编程开发工具DirectX,但它也提供OpenGL图形标准,因此,OpenGL可以在微机中广泛应用。OpenGL非常接近硬件,是一个图形与硬件的接口,包括了100多个图形函数用来建立三维模型和进行三维实时交互。

  简单地说,OpenGL具有建模、变换、色彩处理、光线处理、纹理影射、图像处理、动画及物体运动模糊等功能,具体内容会逐步学习。

  大体概括一下openGl的渲染绘制过程:

①根据基本图元建模(OpenGL中把“点、线、多边形、图像和位图”都作为基本图形单元)。

②调整模型位置和设置视图观察点。

③渲染色彩,添加光照、材质和纹理映射。

④光栈化:把模型的数学描述信息和色彩信息转化为计算机屏幕上的像素,完成绘制。

库函数

  开发基于OpenGL的应用程序,必须先了解OpenGL的库函数。它采用C语言风格,提供大量的函数来进行图形的处理和显示。

  常用四种函数库来提供所需要的函数,分别是基本库、实用库、辅助库、工具库。我们需要记住一些常用函数是出自哪个库的,因为不同的库的函数前缀不同。

1、基本库:核心库

包含的函数有115个,提供最基本的函数,其前缀是“gl”;这部分函数用于常规的、核心的图形处理,由gl.dll来负责解释执行。

例如:

<1>绘制--基本--几何图元的函数

  glBegain()、glEnd()、glNormal*()、glVertex*()

<2>矩阵操作、几何变换和投影变换的函数

  矩阵入栈:glPushMatrix()                   位置变换:glTranslate*()          投影变换函数glOrtho()、glFrustum()

  矩阵出栈:glPopMatrix()                     旋转变换:glRotate*()                 视口变换函数glViewport() 

  装载矩阵:glLoadMatrix()                   缩放变换:glScale*()

  矩阵相乘:glMultMatrix()

  矩阵模式:glMatrixMode()

  矩阵标准化:glLoadIdentity()

<3>颜色、光照和材质的函数

  颜色:glColor*()、glIndex*()

  光照:glLight*() 、glLightModel*()

  材质:glMaterial*()

<4>显示列表函数

  创建:glNewList()

  结束:glEndList()

  生成:glGenLists()

  调用:glCallList()

  删除:glDeleteLists()

<5>纹理映射函数

  一维纹理:glTexImage1D()

  二维纹理:glTexImage2D()

  设置纹理参数:glTexParameter*()

  纹理环境:glTexEnv*()

  纹理坐标:glTetCoord*()

<6>特殊效果函数

  融合函数glBlendFunc()、反走样函数glHint()和雾化效果glFog*()。

<7>光栅化、象素操作函数

  像素位置:glRasterPos*()

  线型宽度:glLineWidth()

  多边形绘制模式:glPolygonMode()

  读取象素:glReadPixel()

  复制象素:glCopyPixel()

<8>曲线与曲面的绘制函数

  生成曲线或曲面的函数glMap*()、glMapGrid*(),求值器的函数glEvalCoord*() glEvalMesh*()。

<9>状态设置与查询函数

  glGet*()、glEnable()、glGetError()等。

2、实用库(OpenGL utility library,GLU)

包含的函数功能更高级一些,如绘制复杂的曲线曲面、高级坐标变换、多边形分割等,共有43个,前缀为“glu”。

Glu函数通过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操作,即做了一个封装。

库中常用函数:

<1>辅助纹理贴图函数

  gluScaleImage() 、gluBuild1Dmipmaps()、gluBuild2Dmipmaps()。

<2>坐标转换和投影变换函数

相对于基本库,这里的变换函数更高级一些,个人感觉体现在维度的不同,偏三维更复杂。

  透视投影:gluPerspective()

  正交投影:gluOrtho2D()

  三维视点(观察点):gluLookAt()

<3>二次曲面绘制工具

  创建和删除二次曲面:gluNewQuadric()、gluDeleteQuadric()

  球面:gluSphere()

  圆柱面:gluCylinder()

<4>错误反馈工具

  获取出错信息的字符串gluErrorString()等。

3、OpenGL辅助库(OpenGL auxiliarylibrary,GLAUX)

包括简单的窗口管理、输入事件处理、某些复杂三维物体绘制等函数,共有31个,前缀为aux。

创建aux库是为了学习和编写OpenGL程序,它更像是一个用于测试创意的预备基础接管。

Aux库在windows实现有很多错误,因此很容易导致频繁的崩溃。在跨平台的编程实例和演示中,aux很大程度上已经被glut库取代。OpenGL中的辅助库不能在所有的OpenGL平台上运行。

因此这里就不再研究,重点研究的工具库。

4、OpenGL工具库(OpenGL Utility ToolKit)

包含大约30多个函数,函数名前缀为“glut”,此函数由glut.dll来负责解释执行。

常用函数包括:

<1>窗口操作函数

  窗口初始化:glutInit(),对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。其格式比较死板,一般照抄这句glutInit(&argc, argv)就可以了。

  窗口显示模式:glutInitDisplayMode(),设置显示方式。

  窗口大小:glutInitWindowSize()。

  窗口位置:glutInitWindowPosition()

  窗口创建:glutCreateWindow("窗口标题"),根据前面设置的信息创建窗口。窗口被创建后,并不立即显示到屏幕上,需要调用glutMainLoop才能看到窗口。

  设置绘图函数:glutDisplayFunc(),传入一个用来绘图的函数进行绘制。

  开启绘图循环:glutMainLoop,死循环,监听所有事件处理。

<2>回调函数

  响应刷新消息、键盘消息、鼠标消息、定时器函数等,GlutDisplayFunc()、glutPostRedisplay()、 glutReshapeFunc()、glutTimerFunc()、glutKeyboardFunc()、 glutMouseFunc()。

<3>创建复杂的三维物体

  实心球体:glutSolidSphere()

  网状球体:glutWireSphere()

<4>菜单函数

  创建添加菜单的函数GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu() 和glutAttachMenu()。

OpenGl数据类型

和C语言中的类型差不多,只不过在类型名前添加前缀:GL

如:GLint整型、GLfloat浮点型、GLvoid空类型等

OpenGl函数命名规律

以点系列函数名为例:glVertex*()系列

glVertex2d

glVertex2f

glVertex3f

glVertex3fv

数字表示参数的个数,2表示有两个参数,3表示三个,4表示四个。

字母表示参数的类型:

  s   短整型,表示16位整数(OpenGL中将这个类型定义为GLshort),

  i    整型,表示32位整数(OpenGL中将这个类型定义为GLint和GLsizei),

  f   浮点型,表示32位浮点数(OpenGL中将这个类型定义为GLfloat和GLclampf),

  d   双精度浮点型,表示64位浮点数(OpenGL中将这个类型定义为GLdouble和GLclampd)。

  v   数组型,表示传递的几个参数将使用指针的方式。

GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f};//这三个参数以数组的形式传递过去

glVertex3fv(VertexArr3);

说了这么多,都是一些基本概念,下一篇开始对每一个知识点进行梳理并写出完整的小例子。

时间: 2024-10-12 17:08:57

openGL从零学起之入门介绍的相关文章

从零学编程2-做个工资计算器

回顾上一篇:从零学编程1-写一封情书 做个工资计算器 主人公两枚: 鹰:从零学编程 我:从零教编程 我:阿鹰问你个问题,你喜欢做贡献吗? 鹰:不喜欢. 我:囧.OK,那我们换个问法,你喜欢钱吗? 鹰:喜欢!!!有钱我就可以买CF神器了,我跟你说啊最近粗了一把狙.. 我: OK,OK我们聊钱(强颜欢笑中) 大家都喜欢钱,但是钱的本质是什么呢?上过高中的都知道,它是商品交换的产物.商品不可能大街上去捡.就算是大街上去捡垃圾,那也是付出了劳动,清洁了环境不是吗?所以金钱的来源,就是做贡献.只有为社会做

教你零基础如何快速入门大数据技巧

现在是大数据时代,很多人都想要学习大数据,因为不管是就业前景还是薪资都非常的不错,不少人纷纷从其他行业转型到大数据行业,那么零基础的人也想要学习大数据怎么办呢?下面一起探讨下零基础如何快速入门大数据技巧吧. 很多人都需要学习大数据是需要有一定的基础的,编程语言就是必备的条件之一,编程语言目前热门的有:Java.Python.PHP.C/C++等等,无论是学习哪一门编程语言,总之要精细掌握一门语言是非常必须的,我们先拿应用广泛的Java说起哦. .在入门学习大数据的过程当中有遇见学习,行业,缺乏系

DOJO开发: 入门介绍

决定写么这么一个前端框架的系列文章, 还是很需要勇气的. 因为从现在软件开发岗位分工来说, 我一是个标准的后台开发岗, 所以前端的知识(html, css, javascript)还是捉襟见肘的, 所以大家还是多多包涵下, 如果文中有什么问题, 请帮忙指出来. 一般很多后端的同学有这样的需求: 一个人要开发完一个完整的管理系统, 而又没有前端开发资源, 这时候只能一切靠自己了. 嗯, 做一个全栈工程师, 我骄傲!  首先我介绍下我的前端知识体系. 对于html, css, javascript的

Scratch2.0入门介绍

Scratch2.0入门介绍 [教学目标] 1. 演示Scratch2.0作品,激发学习兴趣. 2. 认识Scratch2.0界面及分享平台 3. 了解创作作品的步骤 [教学课时]      15分钟 [对象]      零基础中小学生及父母 [教学重点.难点]      教学重点:Scratch2.0编辑器的下载与安装.在线注册用户 [教学方法与手段]      演示法.自主探究学习法 [教学准备] 教学课件 [教学过程] 一. 创设情境,激发兴趣 演讲者:看见电视里的动画.或者别人制作的游戏

Android入门介绍

Android入门介绍 3G.4G 第三代移动通信技术(3rd - Generation),速率一般在几百Kbps,较之前的2G和2.5G在数据传输速度上有很大提升. 第四代移动通信技术(4th - Generation),速度可达到100Mbps以上,几乎可以满足人们的所有传输数据的需求. 目前主流的3G技术标准有三种: WCDMA:全球80%以上的3G网络都是采用此种制式.中国联通运营.186 CDMA2000:目前日韩及北美使用较多.中国电信运营. 189 TD-SCDMA:中国自主知识产

带你从零学ReactNative开发跨平台App开发(二)

ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 上一篇教程我们一步步配置了开发RN的必备环境,这篇文章我们依然配置环境,昨天配置的是CRNA模式开发的环境,我们今天配置原生混合开发环境. 第一次写系列教程,写的不好,多多担待,有错误欢迎评判指正. 说一下这个系列教程的目标吧,实战一个CRNA模式开发的跨平台App打包并发布,并将这个App用原生混合开模式实现并打包发布. 废话不多说开始撸码,你准备好了吗? 环境配置 配置原生混合模式开发的环

Kafka入门介绍

1. Kafka入门介绍 1.1 Apache Kafka是一个分布式的流平台.这到底意味着什么? 我们认为,一个流平台具有三个关键能力: ① 发布和订阅消息.在这方面,它类似一个消息队列或企业消息系统.(生产和消费消息) ② 以容错的方式存储消息流.(存储消息) ③ 当消息流发生时处理它们.(处理消息) 1.1.1 kafka的优势 它应用于两大类应用: ① 构建实时的流数据管道,可靠地获取系统和应用程序之间的数据.(获取数据) ② 构建实时流的应用程序,对数据流进行转换或反应.(处理数据)

【转帖】Kafka入门介绍

https://www.cnblogs.com/swordfall/p/8251700.html 最近在看hdoop的hdfs 以及看了下kafka的底层存储,发现分布式的技术基本上都是相同的. 都是通过增加一个coordinator的节点作为存储元数据, 将实体数据放到datanode 里面来提高容量.而且也跟微服务类似,将一个单体应用拆开分多份,放到不同的node节点中来 并且通过replication 来保证高可用.通过服务注册中心统一进行管理. 微服务 hadoop kafka 都是通过

从零学编程1-写一封情书

一哥们闲暇之余想学编程,博主作为"会装系统的人"自然脱不了干系,这哥们名字叫鹰,初中文化,对于电脑的认识属于只会上网听歌看电影,差点忘了他强调过CF玩的不错. 那就教起吧. 主人公两枚: 鹰:从零学编程的哥们 我:从零教编程的作者 !!注意为了便于新手理解,使用大量的便于理解的语句,不代表本人知识水平.我怎么会告诉你Windows启动过程呢.(- o -)~ 开始我们的故事 我:今天让我们写一封电子情书. 鹰:我听说过,但是网上说得太复杂了- 我:会非常简单的.先下载个编程工具.就用我