【OpenGL】初识OpenGL4.0

【OpenGL】初识OpenGL4.0

分类: OpenGL 3.3+   284人阅读  评论(0)  收藏  举报

目录(?)[+]

http://blog.csdn.net/candycat1992/article/details/8829210

这篇文章主要是根据《OpenGL Shading Language Cookbook》一书翻译整理而得,介绍了环境的安装和一些基础知识。下面涉及到的库也可以到这里下载:http://download.csdn.net/detail/candycat1992/5275478

-----------------------------------------------------------------分割线-------------------------------------------------------------------


什么是GLSL

GLSL是OpenGL Shading Language的缩写,顾名思义就是OpenGL渲染语言,它允许我们通过一些接口直接利用现代的图形处理单元(GPUs)进行图形绘制等工作。GLSL语言必须协同OpenGL语言才可以工作。它们嵌入在更庞大的OpenGL语言里,这些迷你的代码通常被称为shader,它们运行在GPU而不是CPU上。从名字上可以看出来,GLSL大多跟3D图像的灯光、渲染等工作有关,但它们的能力绝不仅仅如此。它们还可以用于动画、曲面计算等更深的应用。
Shader语言被设计成可以直接运行在GPU上,并且通常是并行的。例如,对于每个像素,一个fragment shader,片段着色器,可能执行一次,并且是同时在不同的GPU单元上同时执行。显卡上处理器的数量决定了同时可以允许多少个同时执行。这样的特性使得shader具有很好的性能,并允许程序员进行并行运算。
现代显卡的计算能力是让人印象深刻的,下面的表格显示了NVIDIA GeForce 400系列显卡上处理器的数量:

设计者希望Shader程序可以替换传统OpenGL体系结构中的fixed-function pipeline,固定功能管道,部分。在之前,默认的灯光/阴影计算是这个管道的一个核心部分。但是,但我们想要它们实现更多更高级的功能时,我们就需要做非常的工作来实现,而实际上很多是它们无法做到的。GLSL的出现改变了这样的境地,它允许我们使用GLSL语言代替以前的“硬编码”,从而提供了更灵活、更高级的功能。
OpenGL 3.0进入了一个弃用的模型,也就是逐渐被OpenGL规格移除的功能。一些功能和特性可以说是被标志为被弃用了,这意味着它们在未来的OpenGL版本里将会被移除。例如,使用glBegin/glEnd的快速模式渲染在OpenGL 3.0中被标为弃用,在3.1版本里被移除。(我们现在上课还讲来着。。。)
而为了保持向后兼容性,OpenGL 3.2介绍了compatibility profiles,兼容配置文件的概念。如果程序员想要使用特定版本的OpenGL代码(不需要兼容),就可以使用所谓的core profile。而一些人可能希望可以向后兼容,那么就可以使用compatibility profiles。
选择一个a core profile或者a compatibility profile的步骤是跟窗口系统有关的。例如,在最新的Qt版本(现在最新的是5.0)中,我们可以使用下面的代码来选择一个 4.0 core profile :
[plain]  view plain copy print ?
  1. QGLFormat format;  
  2. format.setVersion(4,0);  
  3. format.setProfile(QGLFormat::CoreProfile);  
  4. QGLWidget *myWidget = new QGLWidget(format);  

GLEW

在Windows平台上OpenGL的版本被固定在1.1,这使得Windows平台的开发者不能直接访问最新的OpenGL版本的接口。我们需要进行一系列冗繁的工作来在运行时刻得到一个函数调用的指针,而且还会影响代码的整洁。而且,Windows自带的头文件是遵循OpenGL1.1版本,据称,Windows也不准备更新自带的gl.h和opengl32.lib。幸运的是,有人为我们做了这些事情还提供了相应的库和接口。GLEW就是其中一个。

安装GLEW

为了安装GLEW,以WIndows平台为例,我们可以到http://glew.sourceforge.net下载最新的glew版本,将其中的glew.h和wglew.h文件复制到编译器的对应文件夹下(例如VS的include文件夹),把glew32.lib文件复制到对应的库文件夹下(如VS的lib文件夹),以及glew32.dll复制到系统的根目录下(如system32/下)。

使用GLEW

为了使用glew,请确保在包含OpenGL头文件之前包含glew.h:
  1. #include <GL/glew.h>  
  2. #include <GL/gl.h>  
  3. #include <GL/glu.h>  

在初始化GL后、调用任何OpenGL代码前,加入以下代码:
  1. GLenum err = glewInit();  
  2. if( GLEW_OK != err )  
  3. {  
  4. fprintf(stderr, "Error initializing GLEW: %s\n",  
  5. glewGetErrorString(err) );  
  6. }  

其他库

另一个管理OpenGL扩展的库时GLEE,具体信息可见http://www.elf-stone.com/glee.php。它和GLEW类似,但是不需要在运行时刻初始化。

使用GLM库进行数学运算

在计算机图形学中,计算是一个核心的功能。以前的OpenGL版本提供了进行坐标变换和投影的标准矩阵栈(GL_MODELVIEW and GL_PROJECTION)。在最新的OpenGL 4.0里,这些功能都被移除了。因此,需要我们自己提供坐标和投影变换矩阵,然后将它们传递给shader。当然你还是可以自己写一个库来管理这些,但是不推荐这样。
一个类似的库时Christophe Riccio编写的GLM。它的设计是基于GLSL规则的,因此它的语法和GLSL语言很相似。同时,它提供了一些OpenGL扩展来弥补缺失的那些OpenGL功能,例如glOrtho,,glRotate, gluLookAt。

安装GLM

你可以在http://glm.g-truc.net网站下载安装包,解压后将glm文件夹复制到编译器对应的文件夹下(例如VS的include文件)。

使用GLM

和普通的核心头文件相似,你可以使用下面的代码来包含矩阵变换和transform2扩展:
  1. #include <glm/glm.hpp>  
  2. #include <glm/gtc/matrix_transform.hpp>  
  3. #include <glm/gtx/transform2.hpp>  

然后你就可以使用glm命名空间进行编码了。下面是一个例子:
  1. glm::vec4 position = glm::vec4( 1.0f, 0.0f, 0.0f, 1.0f );  
  2. glm::mat4 view = glm::lookAt( glm::vec3(0.0,0.0,5.0),  
  3. glm::vec3(0.0,0.0,0.0),  
  4. glm::vec3(0.0,1.0,0.0) );  
  5. glm::mat4 model = glm::mat4(1.0f);  
  6. model = glm::rotate( model, 90.0f, glm::vec3(0.0f,1.0f,0.0) );  
  7. glm::mat4 mv = view * model;  
  8. glm::vec4 transformed = mv * position;  

不要使用下面的代码来引入glm的命名空间:
  1. using namespace glm;  

这通常会引起命名空间的冲突。相反,你应该使用下面的代码来包含某一个符号:
  1. #include <glm/glm.hpp>  
  2. using glm::vec3;  
  3. using glm::mat4;  

使用GLM作为OpenGL的输入

GLM支持使用OpenGL的向量函数(以"v"为后缀)直接向OpenGL传递一个GLM类型(通常是为了向shader传递参数)。例如:
  1. #include <glm/glm.hpp>  
  2. #include <glm/gtc/matrix_transform.hpp>  
  3. ...  
  4. glm::mat4 proj = glm::perspective( viewAngle, aspect,  
  5. nearDist, farDist );  
  6. glUniformMatrix4fv(location, 1, GL_FALSE, &proj[0][0]);  

更多文档可以详见http://glm.g-truc.net(需要翻墙)。

使用GLFW进行窗口管理

这里再介绍一个库GLFW。在以前的OpenGL版本里我们通常会使用glut来进行窗口的创建、按键监听等工作,但据说这个库已经很久没更新了,那么glfw就是一个可以作为替代的库。它是网址是http://www.glfw.org/。安装方法和上面两个库类似。使用方法可以详见自带的文档。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值