OpenGL 学习笔记(一)

一、 OpenGL库及函数简介

1.1、OpenGL函数的命名格式如下

        OpenGL常见的库前缀有gl、glu、glut、aux、wgl、glx、agl 等。库前缀表示该函数属于 OpenGL 哪一个开发库。 从函数名后面中还可以看出需要多少个参数以及参数的类型。I 代表 int 型,f 代表 float 型,d 代表 double 型,u 代表无符号整型。例如 glColor3f() 表示了该函数属于gl库,参数是三个浮点数。

        OpenGL 函数库相关的 API 有核心库(gl)、实用库(glu)、实用工具库(glut)、辅助库(aux)、窗口库(glx、agl、wgl)和扩展函数库等。gl是核心,glu是对gl的部分封装。glut是为跨平台的OpenGL程序的工具包,比aux功能强大。glx、agl、wgl 是针对不同窗口系统的函数。扩展函数库是硬件厂商为实现硬件更新利用OpenGL的扩展机制开发的函数。本博客只对常用的四个库做简单介绍:

1.2、OpenGL 核心库 GL

        核心库包含有115个函数,函数名的前缀为gl。这部分函数用于常规的、核心的图形处理。此函数由gl.dll来负责解释执行。由于许多函数可以接收不同数以下几类。据类型的参数,因此派生出来的函数原形多达300多个。核心库中的函数主要可以分为以下几类函数:

(1).绘制基本几何图元的函数:

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

(2).矩阵操作、几何变换和投影变换的函数:

        如矩阵入栈函数glPushMatrix(),矩阵出栈函数glPopMatrix(),装载矩阵函数glLoadMatrix(),矩阵相乘函数glMultMatrix(),当前矩阵函数glMatrixMode()和矩阵标准化函数glLoadIdentity(),几何变换函数glTranslate()、*glRotate*()和glScale(),投影变换函数*glOrtho()、glFrustum()和视口变换函数glViewport()

(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).选择与反馈函数:

        主要有渲染模式glRenderMode()、选择缓冲区glSelectBuffer()和反馈缓冲区glFeedbackBuffer()

(9).曲线与曲面的绘制函数:

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

(10).状态设置与查询函数:

glGet*()、glEnable()、glGetError()

1.3、OpenGL 实用库 GLU

        包含有43个函数,函数名的前缀为glu。OpenGL提供了强大的但是为数不多的绘图命令,所有较复杂的绘图都必须从点、线、面开始。Glu 为了减轻繁重的编程工作,封装了OpenGL函数,Glu函数通过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操作。此函数由glu.dll来负责解释执行。OpenGL中的核心库和实用库可以在所有的OpenGL平台上运行。主要包括了以下几种:

(1).辅助纹理贴图函数:

gluScaleImage() 、gluBuild1Dmipmaps()、gluBuild2Dmipmaps()

(2).坐标转换和投影变换函数:

定义投影方式函数gluPerspective()、gluOrtho2D() 、gluLookAt(),拾取投影视景体函数gluPickMatrix(),投影矩阵计算gluProject()和gluUnProject()

(3).多边形镶嵌工具:

gluNewTess()、gluDeleteTess()、gluTessCallback()、gluBeginPolygon()、gluTessVertex()、gluNextContour()、gluEndPolygon()

(4).二次曲面绘制工具:

主要有绘制球面、锥面、柱面、圆环面gluNewQuadric()、gluSphere()、gluCylinder()、gluDisk()、gluPartialDisk()、gluDeleteQuadric()

1.4、OpenGL 工具库 GLUT

包含大约30多个函数,函数名前缀为glut。glut是不依赖于窗口平台的OpenGL工具包,由Mark KLilgrad在SGI编写(现在在Nvidia),目的是隐藏不同窗口平台API的复杂度。函数以glut开头,它们作为aux库功能更强的替代品,提供更为复杂的绘制功能,此函数由glut.dll来负责解释执行。由于glut中的窗口管理函数是不依赖于运行环境的,因此OpenGL中的工具库可以在X-Window, Windows NT, OS/2等系统下运行,特别适合于开发不需要复杂界面的OpenGL示例程序。对于有经验的程序员来说,一般先用glut理顺3D图形代码,然后再集成为完整的应用程序。这部分函数主要包括:

(1).窗口操作函数:

窗口初始化、窗口大小、窗口位置函数等 glutInit()、glutInitDisplayMode()、glutInitWindowSize()、glutInitWindowPosition()

(2).回调函数:

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

(3).菜单函数:

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

(4).程序运行函数:

glutMainLoop()

二、 OpenGL的绘制方式

OpenGL可以支持很多不同的图元类型,最基础的为点,线,或三角形。线和三角形可以组合成条带,循环体或者扇面三角形。点,线,或三角形也是大部分图象硬件设备支持的基础图元类型。

1、点绘制

点可以通过单一的顶点来表示,点实际上不存在面积,在OpenGL中它通过屏幕上的一个矩形区域来模拟,在渲染点源的时候,OpenGL会通过光栅化规则类判断点的位置。以点位中心绘制一个四边形区域,四边形区域的边长等于点的大小,它是一个固定的状态,可以调用函数glPointSIze()设置。

void glPointSIze(GLfloat size); //设置固定像素大小,如果没有开启GL_PROGRAM_POINT_SIZE,那么默认用于设置点的大小

OPenGL渲染点的时候,每个点的片元的会执行片元着色器,在本质上都是屏幕上的方形区域,而每个像素都可以使用不同的颜色来着色。OPenGL的片元着色器提供了一种特殊的内置变量来完成,叫gl_PointCoord,其中包含了当前片元在点区域内的坐标信息,它只能在片元着色器中工作,它的值只对点的渲染游戏。

2、线,条带与循环线

OpenGL中的线表示一条线段,一个线可以通过两个顶点来表达,多段线可以使用多个线段链接来表示,首尾闭合的多段线叫循环线,线的宽度可以由glLineWidth()来设置。

void glLineWidth(GLfloat width);

width表示线的宽度,默认值位1.0,它必须是一个大于0.0的值,否则会报错。

3、三角形,条带和扇面

三角形的方式绘制时每个三角形之间都是互相独立的,如果以三角形的方式绘制一个矩形那么需要绘制两个三角形,提供6个顶点。 条带绘制需要4个顶点,前三个顶点构成第一个三角形,后继的顶点将与之前三角形的后两个顶点一起构成新的三角形。 扇面绘制的时候,第一个顶点会作为一个共享点存在,它作为每一个后继三角形的组成部分,之后的每两个顶点都会与这个共享点组成新的三角形。

绘制方式和OpenGL枚举对应关系:

绘制方式实例,先构建一个顶点数组

float points[] = {

-0.6f, 0.2f, 1.0f, 0.0f, 1.0f,

-0.6f, -0.2f, 1.0f, 1.0f, 1.0f,

-0.2f, 0.2f, 0.0f, 0.0f, 1.0f,

-0.2f, -0.2f, 1.0f, 0.0f, 0.0f,

0.2f, 0.2f, 0.0f, 0.0f, 1.0f,

0.2f, -0.2f, 0.0f, 1.0f, 0.0f,

};

在空间中的分布位置及顺序:

点绘制:

设置点的大小

glPointSize(5);

glDrawArrays(GL_POINTS, 0, 6);

点绘制效果:

·

线段绘制:

设置线段的宽

glLineWidth(10);

glDrawArrays(GL_LINES, 0, 6);

线段绘制效果:

多线段绘制:

glDrawArrays(GL_LINES, 0, 6);

多线段绘制效果:

循环线绘制:

glDrawArrays(GL_LINE_LOOP, 0, 6);

循环线绘制效果:

独立三角形绘制:

一共六个顶点,相当于绘制了两个三角形

glDrawArrays(GL_TRIANGLES, 0, 6);

独立三角形绘制效果 :

三角形条带绘制:

绘制了六个三角形,组成了一个矩形

绘制方法:

glDrawArrays(GL_TRIANGLE_STRIP, 0, 6);

三角形条带绘制效果:

三角扇面绘制:

以第一个点为共享点,和后续的点组成三角形。

重新构建顶点数组

float points[] = {

0.0f, 0.0f, 1.0f, 0.0f, 0.0f,

0.4f, 0.0f, 0.0f, 1.0f, 0.0f,

0.346f, 0.2f, 0.0f, 0.0f, 1.0f,

0.2f, 0.346f, 0.0f, 0.0f, 1.0f,

0.0f, 0.4f, 1.0f, 0.0f, 1.0f,

-0.2f, 0.346f, 1.0f, 1.0f, 1.0f,

};

在空间中的分布位置及顺序:

绘制方法:

glDrawArrays(GL_TRIANGLE_FAN, 0, 6);

三角扇面绘制效果:

多边形渲染模式:

可以将多边形渲染为点集,轮廓线或填充。

可以调用glPolygonMode()函数进行设置

void glPolygonMode(GLenum face, GLenum mode);

参数:face必须设为GL_FRONT_AND_BACK

mode 可以设置为GL_POINT,GL_LINE,GL_FILL,分别对应点集,轮廓线,填充。

以上面的扇形为例:

点集效果:

glPolygonMode(GL_FRONT_AND_BACK ,GL_POINT);

轮廓线效果:

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

填充效果:

glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

     

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大王算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值