OpenGL 4.x学习资源

40

我知道有一些问题与学习OpenGL相关。以下是我的了解:

  • 3D数学
  • 3D理论

以下是我想了解的: - OpenGL 4.0核心框架(或更高版本) - 着色器语言 400(或更高版本) - 上述内容的每一个方面(即使它不能跨供应商使用,也不会对我造成麻烦)

以下是我不想了解的: - 固定功能管线(永远不会使用!) - 较旧的OpenGL版本 - 兼容性框架

我更喜欢较完整的信息,例如教程,文章系列和书籍。

PS:如果您知道关于OpenGL 3.x核心框架的资源,请也一并提供。


5
@Calvin Nehe的文章并不是“已废弃”,但它们充斥着糟糕的实践,并且非常非常古老,使用了被禁止的做法和/或早已消失的库。 - Dr. Snoopy
4
回答问题。找到 NeHe 很容易,但很难发现它使用“旧式学习方法”。但我更不喜欢 NeHe 的每个教程只有一点点知识。我更喜欢连续且深入的信息。原文中的"I'm not so green :)" 意为 "我不是那么幼稚 / 没那么嫩",表示自己有一定经验或知识。 - przemo_li
4
好的,我会尽力进行翻译。以下是翻译的结果:谢谢您加上OpenGL-4标签。我会将此信息转达给相关人员。 - przemo_li
我已经阅读了OpenGL 4.1核心规范。它非常适合作为检查函数行为的参考,但不适合作为学习材料。 - przemo_li
没有一个全面的信息来源足以理解OGL,也没有任何关于OGL 4.x的“去那里然后读这个”的指南(除非你不介意阅读关于OGL3.3的内容)。尽管openglbook.com很好,但它似乎已经死了。OpenGL Shading Language Cookbook也不错,但它假定读者具备先前的OpenGL知识(由于没有好的OGL4.x教程,它不能被视为完整的答案),而OGL超级圣经的第六版还未准备好。 - przemo_li
显示剩余10条评论
11个回答

30

我非常不喜欢负面的回答,但是我必须给这个问题一个负面答案。

您最终要求的是使用OpenGL 4.0及以上版本唯一功能的初学者材料。那么,让我们来看看4.x的一些独特功能。

也许最大的特点是曲面细分(tessellation)。这是什么意思?它意味着通过细分原语来生成更多原语。在理解这意味着什么之前,必须先了解如何渲染原语。这使用了低于4.x级别的功能。

但即使对渲染方式有坚实的理解,仍然存在一个问题。为了对曲面细分着色器进行任何有意义的讨论,必须首先深入了解曲面细分算法。而这并不是一个简单的主题。为了教授用户使用曲面细分着色器,教程将首先介绍样条曲线和路径或细分表面。这两个主题都是冗长的主题,有许多白皮书专门研究。只有在详细介绍算法之后,用户才能准备好看到这些算法如何在曲面细分着色器中实现。

或者,换句话说,曲面细分着色器不是初学者材料。我甚至不认为它们符合中级材料的资格。

4.x级别硬件的另一个重要特性是着色器图像加载存储(以及其伴侣原子计数器),在4.2中核心。它可以实现一些非常棒的功能,包括无序透明度。然而,为了让用户开始理解它周围的所有怪癖,用户需要对现代着色器硬件的深层工作方式非常熟悉。因此,任何教程都必须首先解释现代VLIW / SIMD型硬件的工作原理,以及如何使用这种硬件与着色器。再次强调,这不是琐碎的材料。

4.x硬件的另一个重要特性是间接渲染,即将glDraw调用的参数放入缓冲对象本身中。问题在于实际上只有一个原因使用此功能:因为GPU直接在一个或多个缓冲区中生成数据以供稍后渲染。而这通常涉及某种形式的GPGPU操作,这绝非初学者级别的话题。

所有这些功能都是有用且具有真正的目的。但是,没有一项应该由初学者使用;在某些情况下,甚至中级程序员也不应该触及它们。

现在完全公平地讲,有一些4.2功能既不基于硬件(因此它们经常在3.3及以下版本上实现),而且非常有用。例如,单独的程序对象。这些功能发布时,我正在编写基于3.3的教程,并考虑回顾它们并整合这些功能。唯一的原因是实现(驱动程序)仍然对这些功能不太稳定。但是这很有用。

我想表达的主要观点是:如果您的图形知识已经到了可以利用GL 4.x硬件的独特功能的阶段,那么您也有足够的图形经验,不需要明确的逐步教学材料来实现图形硬件的功能。您将是那种可以阅读GL_ARB_tessellation_shader扩展规范并理解如何使它们按照所需执行的人。

话虽如此,如果您有兴趣学习OpenGL核心3.0或更高版本的材料,OpenGL Wiki有一些不错的链接集合。为了完整公开,我写过其中一个。


1
我喜欢你的glut教程。但它有一个巨大的缺点,你写得太慢了;) 但是对于你的回答,我不完全同意。如果OGL 4.1核心是一个高级主题,那就让它成为高级主题吧。无论如何都要写那些该死的文档。OGL 4.1没有任何一致的文档。时期。所以想学习OGL的开发人员,但可以接受4.1的话,他/她别无选择,只能先学习2.1的东西。这就像要求学习DX11之前必须先学习9.c然后是10,最后才能学习11。病态。 - przemo_li
3
D3D API在DX9.x和DX10之间发生了彻底的变化,而OpenGL API从2.1到3.3没有发生根本性的变化。尽管有些改动,但最大的改动是关于着色器的,其中大部分只是语法上的变化(如将attributes和varyings变成了"in"和"out")。glVertexAttribPointer最早出现在GL 1.4发布的扩展中,其含义并没有改变。而glUseProgram则是从2.0开始使用,至今没有发生改变。事实上,如果你掌握了2.1的知识,你可以通过最小量的代码更改就切换到3.3;只需避免使用内置内容即可。而在DX9到DX10之间则不可能这样做。 - Nicol Bolas
4
“着色器、可编程内容、GPU内存、实时阴影、延迟渲染”这些功能在OpenGL 2.1中都可以完成。着色器是2.1核心功能,通过缓冲对象使用GPU内存也是核心功能。阴影映射和阴影体积在1.4版本中就已经可行,并且在2.1版本中肯定可用。延迟渲染在2.1中也是非常可行的(尽管你需要一些来自EXT_framebuffer_object的帮助)。你不理解的是:在4.1中绘制三角形的方式与在2.1中绘制三角形的方式完全相同。这就是向后兼容的含义。 - Nicol Bolas
1
@przemo_li:仅仅因为你可以在2.1中使用glBegin/End并不意味着这是渲染的唯一方式。你可以使用与4.2相同的缓冲区对象渲染来在2.1中进行渲染。你可以编写有效的2.1代码,在4.2核心上下文中运行而无需更改。 - Nicol Bolas
2
如果您有足够的图形经验,那么您不需要一个明确的逐步过程。 - Luca
显示剩余4条评论

11

OpenGL超级宝典第五版最近发布了。该版本反映了OpenGL 3.3,与OpenGL 4.0同时发布,该书仅涵盖核心概念,并假设读者没有先前的OpenGL知识。

这是我从书籍描述中了解到的。我有第四版,它是OpenGL 2.0的绝佳资源,因此我认为新版连同最新的OpenGL着色语言书籍是你正在寻找的。

Durian Software有一系列涵盖现代OpenGL的教程。它们针对OpenGL 2.0,但避免使用任何后续版本中已弃用的功能。


3
将会有新的SuperBile,但我不喜欢第五版的设计,因为它采用了“在你准备好之前我们会对你隐藏东西”的方法,这意味着书中90%的内容都被隐藏了。而且,这本书更适合使用2.1版的人,因为它介绍了如何从新版本中过渡,并模拟旧版的使用方式。 - przemo_li
2
榴莲似乎已经死了 :( 而且覆盖范围太小,对于那些想为转型做准备的人来说帮助不大 :( - przemo_li

10

OpenGL 3.0和4.1之间的区别实际上非常小。如果您坚持使用3.0或更高版本的核心配置文件,您将无法使用固定功能渲染管线。你真正需要的是一个不使用固定功能渲染管线的OpenGL教程。

Jason L. McKesson的优秀教程《学习现代3D图形编程》从最基本的阶段开始使用着色器,从未涉及固定功能渲染管线。

http://www.arcsynthesis.org/gltut/index.html

我强烈推荐它。


不!不!不!不!我询问的是关于OGL 4.1(现在是4.2)的教程。我不知道为什么有那么多人坚持学习OGL 3.3...(顺便说一下,教程非常好!) - przemo_li
我实际上因此给了你-1分!我明确要求OGL 4.0材料,因为我预见到了这样的回放(“我们更清楚您的想法”)。我同意,在缺乏Ogl4.x资源的情况下,3.3核心配置文件资源是最好的选择,但这并没有回答我的问题。 - przemo_li

5

我最近偶然发现了这本在线书籍:OpenGLBook.com

虽然我还没有阅读它,但描述显示它是一本以在线书籍形式呈现的免费OpenGL 4.0编程资源。


1
好书,但要继续走很长的路才能完成。我认为新的超级圣经可能会第一个出版:/不过我已经看过它了,并在我的rss订阅中拥有它。对于初学者来说非常好(是的,我是在跟你@Nicol Bolas说话)。 - przemo_li
我非常不喜欢OpenGL超级宝典的教学方式,我怀疑新旧版本之间的结构变化将是微小的。这本书开始使用作者编写的框架来讲解,但我认为这是一种非常糟糕的教学方式。 - TravisG

4

3

7
虽然作为参考非常有帮助,但这有点像通过阅读词典来学习语言。 - EnabrenTane
是的,它们是有用的,但它们不能提供“大局观”,更多地是:“嗯,这个函数是如何工作的??好吧,我会查看 man 文档!” 但它们也适用于 GLSL! - przemo_li

2

2

Swiftless正在更新教程,以包含新的内容。一篇良好的起始教程,它在快速和简单的VAO、VBO和渲染方面更加直观,位于swiftless.com


它们还不错,但仍然是OpenGL 2.1版本,而不是完整的4.1版本。就像着色器部分只包含顶点和片段着色器一样。 - przemo_li
有一个事实可能被忽视了:GL4不是初学者可以学习的东西。GL 4.0的主要特点是镶嵌。镶嵌什么?基本图元。在学习如何镶嵌基本图元之前,必须先学习如何渲染它们。而这是GL 2.1/3.0级别的内容。因此,即使一些材料会涉及到镶嵌,它也必须从基本的渲染101开始。而基本的渲染并不包括GL 4.0的功能。 - Nicol Bolas
1
我已经厌倦了那种B**********。OpenGL 2.1在现代GPU上以现代方式渲染是行不通的。 - przemo_li
除此之外,你可以在大约2-4小时内学会使用OpenGL 4.2渲染基元,这正是我开始的方式。 - That Realty Programmer Guy
1
没有OpenGL 4.2!最新的是4.1。 :) 我同意你的观点。我可以使用OpenGL 2.1来避免使用即时模式,但这并不明显,并且缺乏良好的文档,而OpenGL 4处理一些事情有所不同。 - przemo_li
显示剩余5条评论

2

我认为你最好的希望之一是Joe的博客。它有几篇关于现代OpenGL的入门文章,而且还有更多(据说)的文章正在路上。


我读了这篇博客,喜欢关于OGL 4.0和3.3特性的文章。 - przemo_li
1
这是关于OpenGL 2.1的问题!!!我不想学它(好的,我已经读了2或3本有关它的书),我想要一些完全专注于像着色器、GPU内存等这样的事情。 - przemo_li

1

OpenGL 4 的主要重点是细分,因此我建议从 OpenGL 4 细分的独立教程开始学习,例如:http://prideout.net/blog/?p=48

在学习手册和教程之后,一个很好的跟进是看看那些基于“新”OpenGL 3/4的开源引擎。作为其中一名开发者,我会推荐 Linderdaum Engine


1
看了那个教程,很棒! - przemo_li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接