OpenGL 笔记

1.OpenGL是一套应用程序接口,能够访问图形硬件。它具有一套精心定义的接口函数用来和图形系统进行交互

2.OpenGL起初来自于GL(graphic library),是由SGL公司开发的

3.OpenGL和平台无关,即可以跨平台,他没有任何输入和窗口,如果要使用窗口,可以借助GLUT(OpenGL Utility Toolkit)函数库来实现,它包含大多数窗口系统所共有的标准操作,可以实现鼠标和键盘输入

4.现代图形系统支持两种不同的对象类型:几何类型和图像类型,几何对象通常存在于三维空间中,即包括直线,点,多边形等简单对象,也包括二次曲面或更一般的曲线和曲线面的复杂实体。计算机图形系统只与几何对象打交道

5.随着硬件技术的发展,图形系统目前也可以对图像进行处理,图像实际上就是像素的矩形数组,其中的每个元素用来表示像素的颜色、灰度、或其他属性

6.关于OpenGL的三种观点:

   1:程序员的观点:(1)指定绘制对象 (2)描述对象的属性 (3)定义这些对象被观察的方式

   2.OpenGL状态机:把OpenGL看成一个又输入输出的状态机,输入的为几何对象的描述信息比如线段和多边形,他们都是通过     OpenGL函数指定的,然后输出一个图像的像素几何,这样OpenGL分为两种类型的函数:一种是指定输入对象的函数,一种是修改这些信息状态的函数,状态修改函数包括那些指定颜色,材质属性等函数,状态决定了输入的处理方式

3.OpenGL绘制流水线

 几何处理器:负责对图元进行变换,包括旋转,平移,缩放以及相对于OpenGL摄像机为图元进行定位

光栅化器是生成片段

片段处理器是对这些片段上色,并判别这些片段是否被其他对象遮挡,以及在图像中是否真的可见

帧缓存存储用来显示的像素信息

 

7.编程约定:

      OpenGL包括两个库gl(核心库)、glu(实用库),gl库里面的函数以gl为前缀,glu里面的函数以glu为前缀

      glvertex3f()接收3个float类型的参数,glvertex3i()接收3个int类型的参数,glvertex*泛指接收所有形式的参数

      float在gl中定义为glfloat  int 为glint  double为gldouble

      如果以指针来传递顶点数据,则函数后面要加一个v,比如glvertex3fv(),这就表示接收一个指针类型的数据,这个数据包含3个float类型的数据,

    

8.OpenGL的一些函数:

   1. void gluInit(int *arg ,char **argv):初始化glut,应该在其它glut函数和OpenGL函数之前调用,glutinit()接收来自main函数的参数,glut函数以glut为前缀

   2.int glutCreateWindow(char *title):在屏幕上创建一个窗口,标题由title给出,如果由多个窗口,该函数返回一个标识所创建窗口的整数,来代表这是第几个窗口,默认创建一个300*300的在屏幕左上角的窗口

  3.void glutDisplayFunc(void (*func)(void)):这是一个显示回调函数,在每次显示窗口的时候都需要回调func函数,func是一个无参函数,回调函数借助glutDisplayFunc来完成注册,如果需要对回调函数传参,需要在注册完成之后,借助全局变量

  4.glutMainloop():使程序进入无休止的时间处理循环,在他下面的代码将不能执行,该函数应作为main函数的最后一条语句出现

  5.void glVertex<234><sifd>(type x,type y):比如void glVertex2s(short x,short y)

     void glVertex<234><sifd>v(type* cooridinate),指定顶点是2维 3维 4维,位置坐标,坐标类型维short(s),int(i),float(f),double(d).如果函数名后面出现了v,则type为一个指向指定类型的坐标数组的指针

  6.void glbegin(glenum mode):指定mode类型对象的起始点,mode可以为GL_POINTS,GL_LINES,GL_POLYGON

  7.void glEnd()指定顶点列表的终止点,注意在定点列表的末尾不要忘记加glEnd()

  8.OpenGL将绘制的图像放在一个称为颜色缓存的内存区域中,该缓存通常在显卡中,颜色缓存是构成帧缓存的多种类型之一,颜色缓存的内容可以显示在屏幕上,后面还有其它类型的缓存,在绘制矩阵之前,应利用函数glclear清除我们要使用的颜色缓存

  9.glclear(GLbitfield mask)清空mask指示的所有缓存中的位,其中mask可由定义在gl.h中的常量通过逻辑或运算构成。表示清空多个缓存,这里GL_COLOR_BUFFER_BIT,指颜色缓存

  10.void Flush()强制执行之前缓存的所有OpenGL命令

  11.void glutInitDisplayMode(unsigned int mode):请求mode所表示的显示模式,mode的值可以是一些选项,入颜色模式(GLUT_RGB,GLUT_INDEX)和颜色缓存模式(GLUT_SINGLE、GLUT_DOUBLE)用逻辑或组合而成

  12.void glutInitWindowSize(int width,int height):以像素为单位指定窗口的大小

  13.void glutInitWindowPosition(int x,int y)以像素为单位指定窗口的左上角相对于屏幕左上角的位置

8.1 颜色设置命令

   1.清屏的颜色默认以黑色填充,多边形颜色默认以白色填充,OpenGL支持两种颜色模式,一种为RGB一种为RGBA

    glColor3<b i f d ub us ui >(type r, type g, type b)

    glColor3<b i f d ub us ui >v(type * color)

    glColor4<b i f d ub us ui >(type r, type g, type b,type a )

    glColor4<b i f d ub us ui >v(type *color )

    用标准类型来指定RGB或RGBA的颜色值

  2.void glClearColor(GLclampf r,GLclamp g,GLclampf b,GLclamp a),用于指定清除颜色缓存的颜色值,用于清除操作的颜色必须为rgba颜色,且每个分量的类型必须为GLclampf--->值为0-1之间

  8.2 二维取景

    1.void gluOrtho2D(GLdouble left,GLright,GLbottom,GLtop):指定一个矩形裁剪区域,其左下角的坐标为left,bottom,右上角的坐标为right,top。它的前缀是glu说明它属于GLU库,它是glortho()的一个特例,位于该窗口内的对象是可见的

    2.void glViewport(GLint x,GLint y,GLint w,GLint h):将视口的宽度设置为w,高为h,左下角的坐标为(x,y),默认情况下,视口初始为整个窗口。视口就是窗口中的一部分,它用来显示上一个取景区域内的内容

   3.OpenGL所需要的坐标系转换有两个矩阵决定,一个是模型视图矩阵,一个是投影矩阵,这些矩阵也是OpenGL的状态的一部分,设置投影矩阵分为三步:一:指定我们希望修改的矩阵,二:将矩阵设为单位矩阵,三:修改当前矩阵为用户所期望的矩阵

   比如:glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(-1,1,-1,1)

  4.void glMatrixMode(GLenum mode):指定哪个矩阵将会受到后续变换函数的影响。mode通常取GL_MODELVIEW或GL_PROJECTTION

  5.void glLoadIdentity():将当前矩阵初始化为单位矩阵

  6.void glPointSize(GLfloat size):对点尺寸状态进行设定,尺寸的度量单位为屏幕中的像素,默认值为1.0

    glPointSize 设置点的大小,要在begin之前就设置,然后进行绘制

  7.glbegin(GLenum mode)  mode中表示线段的有:GL_LINES:每两个顶点绘制成一条直线

     GL_LINE_STRIP:顶点之间首尾相连,但是最后一个顶点和第一个顶点不相连

     GL_LINE_LOOP:所有的顶点之间首尾相连,包括最后一个顶点和第一个顶点

  8.线段的属性包括颜色,线宽,以及模式(该模式允许我们创建虚线和点划线)

     void glLineWidth(GLfloat width):以像素为单位设置线宽

     void glLineStipple(GLint factor,GLushort pattern)为所绘制的直线定义了一个16为模式。如果模式中的某一位为1,则直线上的像素被绘制,如果为0,则不被绘制,pattern中的1和0的连续组将被重复绘制factor次,factor的取值范围为1-256,为了绘制一条完整的线断,点划模式需要重复必要的次数。pattern中位的使用是从最低为开始的

 9.比如glcolor3f(1.0,1.0,0.0);

           glLineWidth(2.0);

           glLineStipple(3,0xcccc);

 将绘制颜色为黄色,线宽为2个像素,其中每六个像素为一组,一上色,一组不上色,因为0xcccc表示成2进制为1100110011001100,每个相邻的1和0要重复3次,所以就变成了111111000000111111000000111111000000111111000000

  10.OpenGL的特性,比如光照,消隐,纹理映射,点划模式,这些都是OpenGL的特性,可以独立的开关,因为这些特性会影响绘制处理的速度,

      void glEnable(GLenum feature)

      void glDisable(GLenum feature)启用或者关闭OpenGL的一些特性

     比如:glEnable(GL_LINE_STIPPLE);在使用某些特性之前,要先开启该特性,否则,即使设置了参数也没用

  11.填充图元

       填充图元:具有内部区域的图元。在显示的时候可以以某种颜色或模式进行填充,共有6中填充图元

  GL_POLYGON :定义一个多边形

  GL_TRIANGLE:每连续的三个顶点划为一组,多余的顶点被忽略

  GL_TRIANGLE_STIPPLE:前三个顶点构成一个三角形,每个后续顶点都与前两个顶点构成一个新的三角形

  GL_TRIANGLE_FAN:前三个顶点构成一个三角形,每个后续顶点和第一个顶点以及它的前一个顶点构成一个三角形

  GL_QUADS:每四个顶点构成一个四边形

  GL_QUAD_STRIP:头四个顶点定义一个四边形,每个后续顶点对都与之前的一对顶点构成一个新的四边形

12:矩形

  1. void glRect<sifd>(type x1,type y1,type x2,type y2)

   void glRect<sifd>(type*v1,type*v2)

   分别用矩形左上角和右下角的坐标来绘制一个矩形

  我们也可以启用多边形的点划模式,glEnable(GL_POLYGON_STIPPLE)

  模式由glPolygonStipple()决定

   void glPolygonStipple(const Glubyte*mask),它和直线的点划模式一样,只不过是二维的

 13.多边形

    一个多边形可以有三种方式显示,填充方式、边线方式、与顶点对应的点集方式,二维多边形由两个面,正面和反面,OpenGL可以选择部分或全部绘制,沿着观察的方向看,多边形的顶点的绕徐是逆时针方向,则盖面未正面,否则为背面

 void glPolygonMode(GLenum face,GLenum mode):指定表面如何进行绘制,face可以为GL_FRONT,GL_BACK,GL_FRONT_AND_BACK

 mode可以为GL_POINT,GL_LINE,GL_FILL,默认情况下对正面和背面都填充

2.void glCullFace(GLenum mode):裁剪指定的面,mode可以为GL_FRONT,GL_BACK,GL_FRONT_AND_BACK

   裁剪是OpenGL的特性,必须通过glEnable(GL_CULL_FACE);来开启

3.void glFrontFace(GLenum mode)允许将逆时针(GL__CCW)或顺时针(GL_CW)方向定义为正面朝向

4.如果我们想把多边形的边也绘制出来,则需要绘制两次,第一次绘制的时候设置多边形模式为fill,第二次为line

  比如  glpolygonmode(gl_front_and_back,gl_fill);

           glcolor3f(1.0,0.0,1.0);

            square();

            glpolygonmode(gl_front_and_back,gl_line)

           glcolor3f(1.0,1.0,0.0);

           square();

  红色和黄色叠加可能产生意想不到的后果,可以让红线向外偏移一些,但是偏移的量不好把控,可以多试几次

  void glPolygonOffset(GLfloat factor,GLfloat units)

  这个也是一个特性,需要开启才能使用 glEnable(GL_POLYGON_OFFSET_LINE);

5.void glShadeModel(GLenum mode):将明暗模型设为平滑模式(GL_SMOOTH)或平面模式(GL_FLAT),默认为平滑模式,即确定了两点的颜色,两点之间点的颜色是这二个点的插值

6. 如果想要只显示一个非凸多边形的边,如下图,虚线部分不显示

 

   通过glEdgeFlag(GLboolean flag)来决定哪些边显示,哪些边不显示,若边的标记为GL_TRUE,则虚线不显示,若为GL_FALSE,则虚线显示,当多边形模式为GL_LINE时,该选项起作用

7.

  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

TO_ZRG

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

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

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

打赏作者

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

抵扣说明:

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

余额充值