作者:empty 页数:561 出版社:empty |
欢迎来到OpenGL的世界。这个工程只是我(Joey deVries) 的一次小小的尝试·希望能够建立起一个完善的OpenGL教学平台·无论你学习OpenGL是为了学业·找工作·或仅仅是因为兴趣·这个网站都将能够教会你现代(Core-prof le) OpenGL的基础·中级·以及高级知识·Leam OpenGL的目标是使用易于理解的形式·使用清晰的例子·展现现代OpenGL的所有知识点·与此同时为以后的学习提供有用的参考·如果您喜欢这个系列教程的话·不妨到Joey deVries的Pat re on上支持一下作者·让这个教程能够持续完善并更新·为什么要阅读这些教程呢?在互联网上·关于学习OpenGL的有成千上万的文档与资源·然而其中大部分的资源仅仅讨论了OpenGL的立即渲染模式(Immediate Mode·通常会说旧OpenGL) ·亦或是不完整·缺少适当的文档·或仅仅不适合你的味·所以我的目标是提供一个既完整·又易懂的平台供人们学习·
如果你很享受那些提供手把手指导的教程·那些提供清晰例子的教程·和那些不会一下将你淹没在细节中的教程·我的这些教程很可能就会适合你。这些教程旨在让那些没有图形编程经验的人们能够理解·又让那些有经验的读者有阅读下去的兴趣·这些教程同样也讨论了一些常用的概念,只需要你再有一点创造力·就能将你的想法变成眞正的3D程序·如果如果你觉得前面这些讲的都是你·欢迎继续阅读我的教程·你将学会什么呢?我这些教程的核心是现代OpenGL·学习(和使用) 现代OpenGL需要用户对图形编程以及OpenGL的幕后运作有非常高的理解才能在编程中有很好的发挥。所以·我们会先讨论核心的图形概念·OpenGL怎样画像素到屏幕上·还有如何利用黑科技做出一些很酷的效果。除了核心概念之外·我们将会讨论许多有用的技巧·它们都可以用在你的程序中·比如说在你的场景中移动·做出漂亮的光效·加载一些建模软件导出的一些自定义的模型·做一些很酷的后期处理技巧等·最后·我们也将会使用我们已学的知识从头开始做一个小游戏,让你真正体验一把图形编程的魅力·关于中文翻译这里是Learn OpenGL教程的中文翻译·英文版的地址为:http//learnopengl.com/由于翻译可能无法做到精确表达原文意思·我们推荐您在对问题有疑惑的时候去阅读一下英文版的教程·如果您对翻译有更好的建议·可以去我们的Git Hub工程上提交ls sue或者PullRequest。如果是对教程的内容有问题·请先查看原文·如果不是翻译错误的话·请直接在原网站评论区向作者(Joey DeVries) 反馈。如果教程中的源码无法打开的话·可以到教程的Git Hub页面上去寻找所需的代码·每一节教程的源码以及练习都位于src目录下的对应章节日录中。
在开始这段旅程之前我们先了解一下OpenGL到底是什么·一般它被认为是一个应用程序编程接(Application Programming Interface, API) ·它包含了一系列可以操作图形、图像的方法。然而·OpenGL本身并不是一个API·仅仅是一个规范·由Khronos组织制定并维护·OpenGL严格规定了每个函数该如何执行·以及它们该如何返回。至于内部具体每个函数是如何实现的·将由OpenGL库的升发者自行决定(注:这里开发者是指编写OpenGL库的人) 。囚为OpenGL规范并没有规定实现的细节·具体的OpenGL库允许使用不同的实现·只要其功能和结果与规范相區配(亦即·作为用户不会感受到功能上的差异)。实际的OpenGL库的开发者通常是显卡的生产商·每个你购买的显卡都会支持特定版本的OpenGL·通常是为一个系列的显卡专门开发的·当你使用苹果系统的时候·OpenGL库是由苹果自身维护的·在Linux下·有显卡生产商提供的OpenGL库·也有一些爱好者改编的版本。这也意味着任何时候OpenGL库表现的行为与规范规定的不一致时·基本都是库的开发者留下的bug·(快甩锅)!!!Important由于openGL的大多数实现都是由显卡厂商编写的·当产生一个bug通常可以迫过升经星卡服动来解决·这些强包括你的呈卡能支持的最新版本的OpenGL·这也是为什么总是建放你偶尔更新一下显卡动·所有版本的OpenGL规范书都被寄存在Khronos那里·并且都是公开的。有兴趣的读者可以找到OpenGL 3.3(我们将要使用的版本) 的规范书。如果你想深入到OpenGL的细节(只关心函数的功能描述而不是函数的实现)·这是个很好的选择·该规范还提供一个强大的可以寻找到每个函数具体功能的参考·核心模式(Core-profile) 与立即渲染模式(Immediate mode)早期的OpenGL使用立即渲染模式(也就是固定染管线) ·这个模式下绘制图形很方便。OpenGL的大多数功能都被库隐藏起来·开发者很少能控制OpenGL如何进行计算。而开发者希望更多的灵活性。随着时间推移·规范越来越灵活·开发者也能更多的控制绘图细节·立
即渲柴模式确实容易使用和理解·但是效率太低。因此从OpenGL 3.2开始·规范书开始皮弃立即渲染模式·推出核心模式·这个模式完全移除了旧的特性·当使用核心模式时·OpenGL迫使我们使用现代的做法·当我们试图使用一个度弃的函数时·OpenGL会抛出一个错误并终止绘图·现代做法的优势是更高的灵活性和效率·然而也更难于学习·立即渲染模式从OpenGL实际操作中抽象掉了很多细节·因而它易于学习的同时·也很难去把握OpenGL具体是如何操作的。现代做法要求使用者真正理解OpenGL和图形编程·它有一些难度·然而提供了更多的灵活性·更高的效率·更重要的是可以更深入的理解图形编程。这也是为什么我们的教程面向OpenGL 3.3的核心模式。虽然上手更困难, 但是值得去努力。现今更高版本的OpenGL已经发布(目前最新是4.5) ·你可能会问:为什么我们还要学习3.3?答案很简单·所有OpenGL的更高的版本都是在3.3的基础上·添加了额外的功能·并不更改进核心架构·新版本只是引入了一些更有效率或更有用的方式去完成同样的功能·因此所有的概念和技术在现代OpenGL版本里都保持一致·当你的经验足够·你可以轻松使用来自更高版本OpenGL的新特性·!!!Attention当使用新版本的OpenGL特性时·只有新一代的显卡能够支持你的应用程序·送也是为什么大多数开发者基于较低版本的OpenGL写程序·并有选择的启用新特性。在有些教程里你会发现像如下方式注明的新特性。扩展(Extension)OpenGL的一大特性就是对扩展的支持·当一个显卡公司提出一个新特性或者渲染上的大优化·通常会以扩展的方式在驱动中实现·如果一个程序在支持这个扩展的显卡上运行·开发者可以使用这个扩展提供的一些更先进更有效的图形功能·通过这种方式·开发者不必等待一个新的OpenGL规范面世·就可以方便的检查显卡是否支持此扩展·通常, 当一个扩展非常流行或有用的时候·它将最终成为未来的OpenGL规范的一部分·使用扩展的代码大多看上去如下:if(GL ARB_extension_name)使用OpenGL 3.3时·我们很少需要使用扩展来完成大多数功能·但是掌握这种方式是必须OpenGL自身是一个巨大的状态机:一个描述OpenGL该如何操作的所有变量的大集合。OpenGL的状态通常被称为OpenGL上下文(Context) 。我们通常使用如下途径去更改OpenGL状态:设置一些选项·操作一些缓冲。最后·我们使用当前OpenGL上下文来渲染·假设当我们想告诉OpenGL去画线而不是三角形的时候·我们通过改变一些上下文变量来改变OpenGL状态·从而告诉OpenGL如何去绘图·一旦我们改变了OpenGL的状态为绘制线段·用OpenGL工作时·我们会遇到一些状态设置函数(State-changing Funcion) ·以及一些在这些状态的基础上状态应用的函数(State-using Function) 。只要你记住OpenGL本质上是个大状OpenGL库是用C语言写的·同时也支持多种语言的派生·但是核心是一个C库。一些C语言的结构不易被翻译到其他高层语言·因此OpenGL设计的时候引入了一些抽象概念。“对象 就在OpenGL中一个对象是指一些选项的集合·代表OpenGL状态的一个子集。比如, 我们可以用一个对象来代表绘图窗的设置·可以设置它的大小、支持的颜色位数等等。可以把对象使用0penGL时·建议使用OpenGL定义的原始类型·比如使用 float 时我们加上前GL(国此写作“GLfloat)int*·uint ·char'.bool*等等类似OpenGL定义的这些GL原始型是平台无关的内存排列方式·而int等原始类型在不同平台上可能有不同的内存排列方式·使用GL原始类型可以保证你的程序在不同的平台上工作一致,当我们使用一个对象时·通常看起来像如下一样(把OpenGL上下文比作一个大的结构体) :