1.什么是OpenGL
下面是来自百度百科的回答:
OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近350个不同的函数调用组成,用来绘制从简单的图形比特到复杂的三维景象。简单点来说就是用来画图的。
2.学习opengl的用处大吗
有些小伙伴可能觉得学习过之后就能做游戏开发了。自己回去做个吃鸡,csgo啥的。这在孟同学眼里纯属扯淡。
就目前的IT环境来说,工作中需要到opengl的工作岗位是少之又少。opengl在工作中的主要方向是做游戏引擎。当然现在大火的短视频,AR应用领域也有很多应用到opengl的地方,但是如果只是会opengl的话,可以说基本上是找不到工作的。所以如果是面向就业的学习,opengl的优先级并没有那么高。
对于学生学习而言,数据结构,算法肯定是第一优先级了。这是编码的灵魂。opengl可以结合计算机视觉,图论等等一起学习,毕竟opengl更倾向于是一种工具,并且是相对基层的工具。做一些简单的图形,一些基本的渲染操作还是要 掌握的。
3.学习opengl需要哪些前置知识
由于OpenGL是一个图形API,并不是一个独立的平台,它需要一个编程语言来工作,我们常用的就是C和C++。(当然也有针对于opengl专门的编程语言)所以对编程语言的熟练掌握是必不可少的。如果你的C语言已经忘的差不多了,赶紧回去复习一下吧。
除此之外也将用到一些数学知识如:线性代数,几何学,三角学。不要被必须的数学知识吓到了,几乎所有的概念只要有基础的数学背景都可以理解。大部分的功能甚至都不需要你理解所有的数学知识,只要你会使用就行。
4.OpenGL的工作原理/特性
OpenGL自身是一个巨大的状态机(State Machine):一系列的变量描述OpenGL此刻应当如何运行。OpenGL的状态通常被称为OpenGL上下文(Context)。
如果OpenGL目前的状态是正在做三角图像,要让它改成做圆形图像。我们要通过改变一些上下文变量来改变OpenGL状态,从而告诉OpenGL如何去绘图。
当使用OpenGL的时候,我们会遇到一些状态设置函数(State-changing Function),这类函数将会改变上下文。以及状态应用函数(State-using Function),这类函数会根据当前OpenGL的状态执行一些操作。只要你记住OpenGL本质上是个大状态机,就能更容易理解它的大
5.Opengl中的对象
此对象非佊对象,是编程语言中的对象,而不是你想要的那种对象。
在OpenGL中一个对象是指一些选项的集合,它代表OpenGL状态的一个子集。比如,我们可以用一个对象来代表绘图窗口的设置,之后我们就可以设置它的大小、支持的颜色位数等等。可以把对象看做一个C风格的结构体(Struct):
struct object_name {
GLfloat option1; GLuint option2; GLchar[] name;};
// 创建对象
GLuint objectId = 0;
glGenObject(1, &objectId);
// 绑定对象至上下文
glBindObject(GL_WINDOW_TARGET, objectId);
// 设置当前绑定到 GL_WINDOW_TARGET 的对象的一些选项
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 将上下文对象设回默认
glBindObject(GL_WINDOW_TARGET, 0);
这一小段代码展现了你以后使用OpenGL时常见的工作流。我们首先创建一个对象,然后用一个id保存它的引用(实际数据被储存在后台)。然后我们将对象绑定至上下文的目标位置(例子中窗口对象目标的位置被定义成GL_WINDOW_TARGET)。接下来我们设置窗口的选项。最后我们将目标位置的对象id设回0,解绑这个对象。设置的选项将被保存在objectId所引用的对象中,一旦我们重新绑定这个对象到GL_WINDOW_TARGET位置,这些选项就会重新生效。就像是C语言中的子函数,当一个程序中需要多次解决同一个问题时,只需要再一次调用这个子函数即可,非常的方便。
6.opengl的核心模式
早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线),这个模式下绘制图形很方便。OpenGL的大多数功能都被库隐藏起来,开发者很少能控制OpenGL如何进行计算的自由。就是你不能随意的根据自己的需求去编码作图。而开发者迫切希望能有更多的灵活性。随着时间推移,规范越来越灵活,开发者对绘图细节有了更多的掌控。立即渲染模式确实容易使用和理解,但是效率太低。因此从OpenGL3.2开始,规范文档开始废弃立即渲染模式,推出核心模式(Core-profile),这个模式完全移除了旧的特性。
当使用OpenGL的核心模式时,OpenGL迫使我们使用现代的函数。当我们试图使用一个已废弃的函数时,OpenGL会抛出一个错误并终止绘图。现代函数的优势是更高的灵活性和效率,然而也更难于学习。立即渲染模式从OpenGL实际运作中抽象掉了很多细节,因而它易于学习的同时,也很难去把握OpenGL具体是如何运作的。现代函数要求使用者真正理解OpenGL和图形编程,它有一些难度,然而提供了更多的灵活性,更高的效率,更重要的是可以更深入的理解图形编程。
7.opengl的一大特性
OpenGL的一大特性就是对扩展(Extension)的支持,当一个显卡公司提出一个新特性或者渲染上的大优化,通常会以扩展的方式在驱动中实现。如果一个程序在支持这个扩展的显卡上运行,开发者可以使用这个扩展提供的一些更先进更有效的图形功能。通过这种方式,开发者不必等待一个新的OpenGL规范面世,就可以使用这些新的渲染特性了,只需要简单地检查一下显卡是否支持此扩展。通常,当一个扩展非常流行或者非常有用的时候,它将最终成为未来的OpenGL规范的一部分。
使用扩展的代码大多看上去如下:
if(GL_ARB_extension_name)
{
// 使用一些新的特性}else{ // 不支持此扩展: 用旧的方式去做}
8.有必要使用新版本的的OpenGL吗?
所有OpenGL的更高的版本都是在3.3的基础上,引入了额外的功能,并没有改动核心架构。新版本只是引入了一些更有效率或更有用的方式去完成同样的功能。因此,所有的概念和技术在现代OpenGL版本里都保持一致。使用新版本的OpenGL特性时只有新一代的显卡能够支持你的应用程序,所以大多数的开发者都基于低版本的OpenGL编写程序。
下节讲opengl环境的配置,让你开启opengl征程的第一部。