[译]学习现代OpenGL
一个关于现代 OpenGL 和它为什么给我们带来了这么多价值的小引导。
介绍
好的,既然你想学OpenGL,非常棒,但是你知道它是什么,你又有哪些可行的方法么?你是否有必要去买那些昂贵的专业书籍或者网上的基本教程就已经足够了?
在本文中,我会尝试回答上面一些问题并带领大家看看OpenGL创造的精彩世界。
让我们开始吧。
为什么是现代
我想回答的第一个问题是我为什么称它为现代OpenGL,难道也有古代OpenGL么?
现代OpenGL是用的"可编程式图形管线",之前则是用的"固定管线"。
它们有什么不同呢?这个问题很广,我认为可以这样解释,固定管线就像一个黑盒,你输入顶点数据,最终获得三角形写入到帧缓存中。你当然可以用这个黑盒来解决你的需求,但是某些方面,它还是不够的。
可编程管线更像是一个白盒,它是透明的,并不是你输入数据之后就等待输出结果的,你同样可以操作它的内部渲染机制的。它有一个大体的结构,但是其中很多部分你是完全可以控制的--这得要感谢shaders。
shader可以处理很多事情,并且是运行在GPU上的。它可以转换顶点,计算片段的颜色,删除或增加三角形等等...
为了举例说明这2种管线,我准备了2张图。

这是固定管线

可编程管线
尽管上面的图片非常非常简单,他们仍然展示出可编程管线扩展性更好,程序员也能更好的控制它。这都要感谢shaders,我们可以用它去创造固定管线所不能达到的效果。
目前,我们用最新发布版的图形API(比如OpenGL或者DirectX),可以越来越多的控制GPU。我们看一下现在的游戏引擎,很大一部分都是完全在GPU上运行。于是我们更有必要去学习这种现代的渲染方式。
你应该学什么
我建议从下面这些主题开始:
- 计算机图形学的基础知识
- 平台的区别(PC vs Mobile vs Web vs Console)
- 图形管线。
- 3D方面的数学知识 -- 矩阵,向量,投影。
- 摄像机模块。
- Shaders(Vertex and Fragment)
- 纹理(Texture)
- 缓冲区基础(Basics of Buffers)
- 光照基础。
然后:
- Shaders (Geometry, Tessellation, Compute)
- 缓冲区的内存管理。
- 阴影(Shadows)
- Global Illumination
- GPU上的基本计算。
- ...
我故意把第二章表单留了白,当你完成上面这些部分,你会对你想达到的层次有更加清晰的愿景并且知道怎么去做了。
只能选择C++么
就像你注意到的,很多书籍和网站上的程序都以C++来编写范例程序。看起来C++像是这个领域最合适的选择。但是如果你懂其他的语言,同样没问题。
OpenGL只是一系列的API,并且有很多语言都有bingdings.
所以:
- 对于Java,参考:Java™ Binding for the OpenGL® API 或者 LWJGL
- minecraft用的就是LWJGL
- 很多Android应用使用的基于Java的sdk就是用的OpenGL来渲染图形。
- 手机开发(HTML也一样)中,可以关注下libgdx -- 它是基于OpenGL2.0和3.0的跨平台游戏和可视化开发框架。使用语言:Java。
- 使用C#(或者VB) -- .net平台 -- openTK
- 使用javascript,可以用WebGL
- 其他语言,可以参考这里:opengl wiki pages
值得注意的是,不管你选择什么编程语言,图形学的原理都是一样的。所以只要你知道用一种语言怎么去实现某种特效,那么就可以相对简单的用不同语言实现它。
资料和链接
- GLSL Core Tutorial » Lighthouse3d.com -- GLSL Tutorial for Core versions
- OpenGL - Introduction -- 一个广泛引用的,对新手友好的,引导大家用现代OpenGL在各个平台开发游戏。
- Learning Modern 3D Graphics Programming -- Jason L. McKesson出品的非常棒的教程。
- reddit/r/opengl -- 有丰富的新闻,问题和教程。
结论
在本文中,我企图给你们更多的资源让大家在图形编程中能有更好的进步。OpenGL现在是非常流行的技术了。你现在可以用现代OpenGL的更好的API体验来做出更酷的东西来。
如果还想了解关于图形编程的知识,可以浏览本文作者的blog:http://www.bfilipek.com/
感谢原文作者奉献:原文链接

浙公网安备 33010602011771号