导航

OpenGL 基础【转】

Posted on 2012-03-07 09:00  网名还没想好  阅读(399)  评论(0编辑  收藏  举报

1.OpenGL概念:

  OpenGL可以说是一个图形软件开发包,一套函数库,或者一套API.它提供了100多个图形操作函数.

2.OpenGL工作流程:

  OpenGL独立于硬件,以流水线的工作方式.输入OpenGL的可以是图像或者几何元,最终结果都是光栅化后的图像.

  对于图像,OpenGL首先通过像素解包把其像素格式转换成OpenGL内部格式,然后通过像素操作直接光栅化输出或作为其他物体的表面纹理.

  对于几何图元,OpenGL中的所有几何图形都是用顶点来描述的.OpenGL首先通过顶点解包将不同格式的顶点数据转化成内部标准格式,然后对顶点及其相关数据进行操作,在进行光栅化,最终得到可见的图像.

3.OpenGL的绘图流程:

  1)设置像素格式:包括建立OpenGL回执风格,颜色模式,颜色位数,深度位数等.

  2)建立景物模型:根据基本图形单元建立景物模型,对所建立的模型进行数学描述.在OpenGL中把点,线,多边形,图像和位图都作为基本图形单元.

  3)舞台布景:把景物模型放在三维空间中的合适位置,并且设置视点(viewpoint)以观察所感兴趣的景观.

  4)效果处理:设置物体对象的材质(颜色,光学性质以及纹理映射等),加入光照及光照条件.

  5)光栅化:把景物模型的数学描述及其色彩信息转换至可在计算机上显
示的像素格式,这个过程就是光栅化.

  在这些步骤执行过程中,OpenGL可能执行其他的一些操作,例如自动消隐处理等,另外,景物光栅化之后被送入帧缓冲器之前还可以根据需要对像素数据进行操作.

4.OpenGL函数库:

  OpenGL图形库一共有100多个函数,它们分别属于OpenGL的核心库(gl),实用库(glu),辅助库(aux),实用工具库(glut),窗口库(glx,agl,wgl)和扩展库等不同库.

  ----扩展函数放在glext.h,glxext.h,wglext.h中.扩展函数格式<对哪部分的扩展>_<谁开发的扩 展>_<扩展名>---GL:对核心库的扩展,WGL:对windows平台的扩展,GLX:对UNIX/Linux平台的扩 展,GLU:对OpenGL Utility Library的扩展.

  OpenGL函数的命名规律:<库前缀><根命令><可选参数个数><可选参数类型>

5.OpenGL状态变量:

  在OpenGL中,除了提供各种库函数意外,OpenGL本身又提供很多状态变量,这些状态变量均可作为OpenGL函数的参数,OpenGL将根据具体 的参数值来决定如何绘制图形,如何显示图形和如何处理错误.状态变量一般可以通过glEnable(),glDisable()函数来这是有效或无效状 态.通常情况可以通过如下4个函数来获取某个状态变量的值:

  void glGetBooleanv(GLenum, GLboolean *params);
  void glGetIntergerv(Glenum, GLint *params);
  void glGetFloatv(GLenum, GLfloat *params);
  void glGetDoublev(GLenum, GLdouble *params);  

6.OpenGL的变换:

  1)视点变换:

  视点变换是在视点坐标系中进行的.视点变换确定了场景中物体的视点位置和方向.它像是在场景中放置了一架照相机,让照相机对准要拍摄的物体.默认时,相机(即视点)定位在坐标系的原点和物体模型的默认位置是一致的.

  执行视点变换的命令和执行模型转换的命令是相同的.视点转换和模型转换必须接合在一起来考虑.

  除了用模型转换命令执行视点转换之外,OpenGL还提供了gluLookAt()函数来设置视点.

  通常视点转换在模型转换操作之前发出,以便模型转换先对物体发生作用.场景中物体的顶点经过模型转换之后移动到所希望的位置,然后在对场景进行视点定位等操作.模型转换和视点转换一起构成了模型视景矩阵.

  2)模型变换:

  模型变换是在世界坐标系中进行的,目的是设置模型的位置和方向,包括平移,旋转,缩放和反射3种:

  1`平移:
 
  glTranslate{fd}(TYPE x, TYPE y, TYPE z);

  用指定的x,y,z值沿着x,y,z轴平移物体.

  2`旋转:

  glRotate{fd}(TYPE angle, TYPE x, TYPE y, TYPE z);

  以(0,0,0)点和(x,y,z)点的连线为轴逆时针旋转物体angle度.

  3`缩放和反射:

  glScale{fd}(TYPE x, TYPE y, TYPE z);

  将物体沿着x,y,z轴分别进行放大和缩小,函数中的3个参数分别是x,y,z轴方向的比例转换因子.默认都是1.0.

  3)投影变换:

  投影变换类似于选择相机的镜头,其目的就是定义一个视景体,使得视景体外多余的部分被裁剪掉,最终进入图像的只是视景体内的有关部分.OpenGL提供了两种基本类型的投影:透视投影和正视投影.不管是那种投影函数,为了避免不必要的变换,其前面必须如下一下两句:

  glMatrixMode(GL_PROJECTION);        //设置当前矩阵
  glLoadIdentity();

  1`透视投影:

  透视投影的视景体类似于一个顶部和底部都被进行切割过的棱锥,即棱台.它的特点是:近大远小.OpenGL透视投影有两个函数:

  void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
 
  void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);

  2`正视投影:
 
  正视投影的视景体是一个矩形的平行管道.它的特点是:投影后物体的大小尺寸不变.OpenGL提供的正视投影函数有两个:

  void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);

  void gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top);

  4)视口变换:

  投影变换和视口变换共同决定了场景是如何映射到计算机屏幕上的.投影变换指定了映射发生的机制,而视口变换则决定了场景所映射的有关所在屏幕区域的形状, 也就是将视景体内投影的物体显示在二维的视口平面上.视口变换可以看成是定义了最终经过处理的相片的大小和位置.OpenGL提供的相关函数:

  glViewport(GLint x, GLint y, GLsize width, GLsize height);

  ---在编程的时候OpenGL变换顺序是反过来的.