1
0
mirror of https://github.com/LearnOpenGL-CN/LearnOpenGL-CN.git synced 2025-08-23 04:35:28 +08:00
Files
LearnOpenGL-CN/01 Getting started/01 OpenGL.md
gjy_管 69d733defc add
2015-06-15 20:10:50 +08:00

5.5 KiB
Raw Blame History

本文作者JoeyDeVries由gjy_1992翻译自http://learnopengl.com

##OpenGL

未翻译完成...

在进行这段旅程之前我们先解释下OpenGL到底是什么。它一般被认为是一个应用程序编程接口API包含了一系列可以操作图形、画像的方法。然而OpenGL本身并不是一个API仅仅是一个规范Khronos组织制定并维护。

OpenGL规范严格规定了每个函数该如何执行以及它们该如何返回。至于内部具体每个函数是如何实现的将由openGL库的开发者自行决定这里开发者是指编写OpenGL库的人。因为OpenGL规范并没有规定实现的细节具体的OpenGL库允许使用不同的实现只要其功能和结果与规范相匹配亦即作为用户不会感受到功能上的差异

实际的OpenGL库的开发者通常是显卡的生产商。每个你购买的显卡都会支持特定版本的OpenGL通常是为一个系列的显卡专门开发的。当你使用苹果系统的时候OpenGL库是由苹果自身维护的。在Linux下有显卡生产商提供的OpenGL库也有一些爱好者改编的版本。这也意味着任何时候OpenGL库表现的行为与规范规定的不一致时基本都是库的开发者留下的bug。快甩锅

由于大多数实现都是由显卡厂商编写的当产生一个bug时通常可以通过升级显卡驱动来解决。这些驱动会包括你的显卡能支持的最新版本的OpenGL这也是为什么总是建议你偶尔更新一下显卡驱动。

Khronos公开主持所有版本的OpenGL规范书的制定。有兴趣的读者可以找到OpenGL3.3(我们将要提到的版本)的规范书。如果你想深入到OpenGL的细节注意只描述函数的功能而不管实现这是个很好的选择。该规范还提供一个强大的可以寻找到每个函数具体功能的参考。

##对比核心模式和立即渲染模式

早期的OpenGL使用立即渲染模式固定渲染管线这个模式下绘制图形很方便。OpenGl的大多数功能都被隐藏起来开发者很少能控制OpenGL如何进行计算。开发者最终希望更多的灵活性。随着时间推移规范越来越灵活开发者也能更多的控制绘图细节。立即渲染模式确实容易使用和理解但是效率太低。因此从OpenGL3.2开始,规范书开始废弃立即渲染模式,推行核心模式,这个模式完全移除了旧的特性。

当使用核心模式时OpenGL迫使我们使用现代的做法。当我们试图使用一个废弃的函数时OpenGL会抛出一个错误并终止绘图。现代做法的优势是更高的灵活性和效率然而也更难于学习。立即渲染模式从OpenGL实际操作中抽象掉了很多细节因而它易于学习的同时也很难去把握OpenGL具体是如何操作的。现代做法要求使用者真正理解OpenGL和图形编程它有一些难度然而提供了更多的灵活性更高的效率更重要的可以更深入的理解图形编程。

这也是为什么我们的教程面向OpenGL3.3的核心模式。虽然上手更困难,但是值得去努力。

现今更高版本的OpenGL已经发布目前最新是4.5你可能会问为什么我们还要学习3.3答案很简单所有OpenGL的更高的版本都是在3.3的基础上添加了额外的功能并不更改核心架构。新版本只是引入了一些更有效率或更有用的方式去完成同样的功能。因此所有的概念和技术在现代OpenGL版本里都保持一致。当你的经验足够你可以轻松使用来自更高版本OpenGL的新特性。

当使用新版本OpenGL的新特性时只有新一代的显卡能够支持你的应用程序。这也是为什么大多数开发者基于较低版本的OpenGL编写程序并有选择的启用新特性。

在有些教程里你会发现像如下方式注明的新特性。

##扩展

OpenGL的一大特性就是对扩展的支持当一个显卡公司提出一个新特性或者渲染上的大优化通常会以扩展的方式在驱动中实现。如果一个程序在支持这个扩展的显卡上运行开发者可以使用这个扩展提供的一些更先进更有效的图形功能。通过这种方式开发者不必等待一个新的OpenGL规范面世就可以方便的检查显卡是否支持此扩展。通常当一个扩展非常流行或有用的时候它将最终成为未来的OpenGL规范的一部分。

使用扩展的代码大多看上去如下:

	if(GL_ARB_extension_name)
	{
    	// Do cool new and modern stuff supported by hardware
	}
	else
	{
		// Extension not supported: do it the old way
	}

使用OpenGL3.3时,我们很少需要使用扩展来完成大多数功能,但是掌握这种方式是必须的。

##状态机

OpenGL自身是一个巨大的状态机一个描述OpenGL该如何操作的所有变量的大集合。OpenGL的状态通常被称为OpenGL上下文context。我们通常使用如下途径去更改OpenGL状态设置一些选项操作一些缓存。最后我们使用当前OpenGl上下文来渲染。