c++ - 从 1.x、2.x、3.x 和 4.x 到 OpenGL 有哪些变化?

标签 c++ opengl 3d

是什么让 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 支持支持 提取)。

在 OpenGL 3.0 中,固定函数已被弃用,但仍作为向后兼容功能受到支持。几乎所有“现代 OpenGL”都作为 OpenGL 3.x 的核心功能实现,具有明确的要求和保证,并且具有(几乎)完全可编程的管道。编程模型完全基于使用保留模式和着色器。除了顶点和片段着色器之外,还提供几何着色器。
第 3 版收到了很多负面批评,但在我看来这并不完全公平。出生过程无疑是一场公关惨败,但结果并不全是坏事。与以前的版本相比,OpenGL 3.x 是幸福的。

OpenGL 4.x 有一个额外的曲面 segmentation 着色器阶段,它需要 OpenGL 3.x 兼容硬件中不存在的硬件功能(尽管我敢说这是市场原因,而不是技术原因)。支持旧硬件无法处理的新纹理压缩格式。
最后,OpenGL 4.x 引入了一些与底层硬件无关的 API 改进。 这些在 OpenGL 3.x 下也可用作 100% 相同的核心扩展。

总而言之,我对开始学习 OpenGL 的每个人的建议是立即从版本 3.3 开始(如果您使用 Apple,则为 3.2)。

如今,OpenGL 3.x 兼容硬件几乎无处不在。没有理智的理由去假设任何更老的东西,而且你会为自己省去很多痛苦。从经济的角度来看,支持任何更老的东西是没有意义的。入门级 GL4 卡目前的价格约为 30 美元。因此,买不起 GL3 卡的人也无法支付您的软件费用(不过,维护 2 个代码路径的工作量是原来的两倍)。
此外,您最终将别无选择,只能使用现代 OpenGL,因此,如果您从 1.x/2.x 开始,您将不得不忘记并在以后重新学习。

另一方面,直接进入 4.x 版是可能的,但我暂时建议不要这样做。 API 中不依赖于硬件的任何内容在 3.x 中也可用,曲面 segmentation (或计算着色器)通常严格不是立即必需的,您可以随时添加的内容.

关于c++ - 从 1.x、2.x、3.x 和 4.x 到 OpenGL 有哪些变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13871723/

相关文章:

c++ - C++生成随机20个非重复数

c++ - 如何向 socks5 代理服务器添加身份验证?

c# - 如何从 Protocol Buffers .NET 代码生成 .proto 文件?

c++ - 调整大小后丑陋的字体,OpenGL

java - 主线程 AWTAnimator 尚不支持 JOGL Immutable glNamedBufferStorage

javascript - 有人可以建议我体素化 3d 模型的方法吗?

c# - 关于 Vector3.normalize(); 的问题

c++ - 避免 local() 调用 tbb enumerable_thread_specific 变量

opengl - 为什么我的漫反射/镜面照明不起作用?

wpf - 绕着自己的轴旋转模型