OpenGL从1.x、2.x、3.x和4.x的变化是什么
What Are The Changes To OpenGL From 1.x, 2.x, 3.x And 4.x?
哪些变化使OpenGL与众不同?我听说从OpenGL 3.x开始人们就不喜欢OpenGL了,但是发生了什么?我想学习OpenGL,但不知道是哪一个。我想要新版本的优秀图形,但有什么不好呢?
通常,OpenGL的每个主要版本都大致相当于一代硬件。这意味着,如果你可以运行OpenGL 3.0卡,你也可以运行OpenGL 3.3(如果你有足够新的驱动程序)。
OpenGL 2.x是能够生成DX9的硬件,OpenGL 3.x是DX10,OpenGL 4.x是生成DX11的硬件。没有100%的确切重叠,但这是一般情况。
OpenGL 1.x围绕即时模式展开,该模式在概念上非常易于使用,并且是一个严格固定的函数管道。入学门槛很低,因为你几乎没有什么需要学习的,也几乎没有什么可以做错的
缺点是有相当多的库调用,并且CPU-GPU并行性在该模型中不是最佳的。这在旧硬件上并不重要,但对于从新硬件中获得最佳性能来说变得越来越重要。
从OpenGL 1.5开始,并在2.x中逐渐增加,从立即模式到保留模式编程管道,模式略有转变。顶点着色器和片段着色器可用,具有不同的功能集和可编程性
这些版本中的大部分功能都是通过(通常是特定于供应商的)扩展实现的,有时只有一半或几个不同的步骤,而且对于普通程序员来说,不少功能都有不明显的限制或陷阱(例如,寄存器组合器、缺乏分支、对指令和依赖纹理获取的限制、vtf支持零获取)。
在OpenGL3.0中,固定功能已被弃用,但作为向后兼容性功能仍然受到支持。几乎所有的"现代OpenGL"都是作为OpenGL 3.x的核心功能来实现的,具有明确的要求和保证,并且具有(几乎)完全可编程的管道。编程模型完全基于使用保留模式和着色器。除了顶点着色器和片段着色器外,还提供几何体着色器
版本3受到了很多负面的批评,但在我看来,这并不完全公平。诚然,出生过程是一场公关惨败,但结果并不全是坏事。与以前的版本相比,OpenGL 3.x是一种幸福。
OpenGL 4.x有一个额外的镶嵌着色器阶段,它需要OpenGL 3.x兼容硬件中没有的硬件功能(尽管我敢说这是市场原因,而不是技术原因)。支持旧硬件无法处理的新纹理压缩格式
最后,OpenGL 4.x引入了一些API改进,这些改进与底层硬件无关这些也可以在OpenGL 3.x下作为100%相同的核心扩展提供
总而言之,我建议所有开始学习OpenGL的人立即从3.3版本开始(如果使用Apple,则从3.2版本开始)。
OpenGL3.x兼容硬件现在几乎无处不在。没有理智的理由去假设任何更老的东西,这样你就省去了很多痛苦。从经济角度来看,支持任何年龄较大的人都没有意义。入门级GL4卡目前售价约为30美元。因此,买不起GL3卡的人也无法支付你的软件费用(不过,维护2条代码路径的工作量是原来的两倍)
此外,您最终将别无选择,只能使用现代OpenGL,因此,如果您从1.x/2.x开始,您将不得不放弃学习,以后重新学习。
另一方面,直接进入4.x版本是可能的,但我建议暂时不要这样做。任何不依赖于API中的硬件的东西也可以在3.x中使用,而tessselation(或计算着色器)通常不是一次严格所必需的,并且您可以在以后添加。
有关更改的确切列表,我建议您下载每个OpenGL主要版本的最新规范文档。在每一个版本的末尾都有几个附录,详细记录了版本之间的变化。
大约一年前设计的许多带有英特尔集成图形的笔记本电脑都没有OpenGL 3。
其中包括一些昂贵的商用机器,例如1600美元的Thinkpad x201,截至今天(2013年4月3日)仍在亚马逊上出售(尽管联想已经停止生产),
OpenGL Superbible Rev 5很好地教会了您使用现代OpenGL,而不会依赖于固定的函数管道。如果我从头开始学习OpenGL,我会从这里开始。
如果你想从一个更"历史"的方法开始,他们的rev 4仍然涵盖了固定功能管道。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- OpenGL从1.x、2.x、3.x和4.x的变化是什么
- 是什么变化导致C++中ABI中断
- 当我们从用户模式转移到内核模式时,哪些寄存器会发生变化?!以及转移到内核模式的原因是什么