OpenGL 基础

摘要:
或者一组API。它提供100多种图形操作功能。2.OpenGL工作流程:OpenGL中的所有几何图形都由顶点描述。OpenGL首先通过顶点解包将不同格式的顶点数据转换为内部标准格式,然后对建立的模型进行数学描述。在OpenGL中,场景模型的数学描述及其颜色信息被转换为可以在计算机上显示的像素格式。场景光栅化后,像素数据可以在发送到帧缓冲区之前根据需要进行操作。4.OpenGL函数库:

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变换顺序是反过来的.

免责声明:文章转载自《OpenGL 基础》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇自制精排 ePub 集、不定期更新(UPDATA-2015-8-2)Java 将两个List转换为流合并List下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Nexus3.x帐号权限配置

一、使用admin登录后,点击上方齿轮图标 二、打开左侧导航,Security Privileges:具体的权限明细,比如我创建一个test仓库,这里就会生成 Roles:添加角色,设置每个角色可看到的页面或者仓库,每个角色也可拥有其他的角色 Users:添加帐号密码,帐号密码邮箱这些必填信息不说了,这里要选择一个角色 Anonymous:这个打开后对...

Windows编程系列:Windows中的消息

win32控制台程序 控制台程序整个执行过程是按照代码的顺序依次执行,到main函数的结束,标志着整个程序的退出。 1 int main() 2 { 3 4 return 0; 5 } 整个过程可以描述为以下: Windows应用程序 Windows应用程序会响应来自用户和操作系统的事件。 来自用户的事件包括:鼠标单击,按键,触摸屏手势...

拓端数据tecdat|R语言中实现广义相加模型GAM和普通最小二乘(OLS)回归

原文链接:http://tecdat.cn/?p=20882  1导言 这篇文章探讨了为什么使用广义相加模型 是一个不错的选择。为此,我们首先需要看一下线性回归,看看为什么在某些情况下它可能不是最佳选择。   2回归模型 假设我们有一些带有两个属性Y和X的数据。如果它们是线性相关的,则它们可能看起来像这样:       a<-ggplot(m...

编译器扩展deprecated

背景 当前的工作与SVN有关,今天使用SVN库编写了一个小程序,编译代码时发现编译器告警:“warning: 'svn_client_ls2' is deprecated (declared at”。svn@linux-rwdx:~/objs/motadou> make g++ webdav.cpp -o webdav -I/home/svn/ap...

Scalaz(4)- typeclass:标准类型-Equal,Order,Show,Enum

  Scalaz是由一堆的typeclass组成。每一个typeclass具备自己特殊的功能。用户可以通过随意多态(ad-hoc polymorphism)把这些功能施用在自己定义的类型上。scala这个编程语言借鉴了纯函数编程语言Haskell的许多概念。typeclass这个名字就是从Haskell里引用过来的。只不过在Haskell里用的名称是typ...

.net core 学习小结之 配置介绍(config)以及热更新

命令行的配置 var settings = new Dictionary<string, string>{ { "name","cyao"}, {"age","18"} }; var builder = new Configura...