OpenGL等图形库的目的是什么?

22

我知道这可能是个愚蠢的问题,但在尝试弄清楚为哪些项目使用哪些库之前,我认为真正理解这些库的目的是有意义的。

许多视频游戏使用像OpenGL这样的库。所有我看到的这类库的教程都演示了如何编写代码告诉计算机绘制一些东西。事实上,现今的游戏中一切都是使用Zbrush、Maya或3ds Max等软件建模的。模型已经被贴上贴图并可直接使用。似乎你只需要编写一个动画循环,重复地绘制和更新模型,而不是编写代码来绘制每个小细节。那会非常耗时并使模型无用。所以,在视频游戏和3D艺术方面,OpenGL或Direct 3D的作用是什么?当所有图形已经创建好并只需要被加载和绘制时,它们有什么非常关键的作用?主要是用于着色器和特效吗?

也许这个问题只表明了我对此的新鲜程度,但我从未听过这样的问题。我刚开始学习编程,对代码和逻辑的理解还不错,但我完全不理解图形库或某些框架,教程也没有帮助过我。


2
你读过http://en.wikipedia.org/wiki/OpenGL吗?建模软件有完全不同的目的。 - Matt Ball
我已经阅读过了。我知道建模软件的作用。问题是,我能找到的唯一有关图形库的教程都演示了如何使用代码对物体进行建模,而在实际项目中,当您使用外部软件来获取图形时,这种方法就没有意义了。我根本不明白图形库在图形方面扮演的角色。 - user1558737
OpenGL或Direct3D是相当低级的抽象层。它们是更高级别工具构建的基石。 - Flexo
我为什么感到困惑的一个例子是,在实现2D游戏的图形时,你基本上不断地加载图像,然后将它们绘制到屏幕上。唯一涉及的事情就是编程语言和要加载的图像。我不明白为什么不能用3D做到这一点。是什么让像OpenGL这样的东西成为必需品呢? - user1558737
那这只是为了优化而已吗? - user1558737
显示剩余3条评论
5个回答

11
似乎你只需要编写一个动画循环,以反复绘制模型并更新,而不是实际编写代码来绘制每个小部分。
计算机中所有发生的事情都是由某种形式的程序告诉它 确切要做什么。构成此消息的字母之所以出现,是因为你选择的网络浏览器通过TCP/IP协议下载了此文件,解码了其UTF-8编码的文本,并根据XML、HTML、JavaScript等标准对该文本进行解释,然后根据Unicode文本布局标准定义的可见部分在HTML等方面进行显示和窗口处理。
从文件下载到显示的每个操作都由一段代码控制。你看到的屏幕上的每个像素都是因为某些代码把它放在那里。
仅靠 HTML 是没有意义的。你无法只取出一个 HTML 文件并将其显示在屏幕上。必须有一些代码来解释它。你可以将 HTML 解释为文本文件,但这样会失去所有格式,并且你可以看到所有标记。如果使用 Web 浏览器将其解释为正确的 HTML,则可以查看格式。但在每种情况下,HTML 文件的含义取决于如何使用它。
你提出的算法中的 "绘制模型" 部分必须由某人完成。如果你不编写该代码,那么你必须使用库或其他系统来使模型出现。那个库是做什么的?它如何使模型出现?
模型(如 HTML 网页)本身是没有意义的。或者换句话说,你的算法可以归结为:
  1. 动画模型。
  2. ????
  3. 赚钱!

您缺少了一个关键组成部分:如何实际解释模型并使其出现在屏幕上。OpenGL/D3D/软件光栅化器等对于这项任务至关重要。


我很感激你的回答。所以可以说一个图形库只是一组函数/方法的集合,让你选择如何在屏幕上绘制事物以及绘制的位置,这样说准确吗?我觉得我困惑的根源是我最早接触的编程是一些Java的东西,而Java包括了Swing和AWT中的paint()等方法。我没有意识到Java中包含的GUI工具包实际上有图形库,所以我一直认为那些方法是理所当然的。 - user1558737
是的。某个地方必须实际绘制这些物体。OpenGL是一个可移植、相对较低级别的API,用于进行3D图形绘制的编码。 - comingstorm

9
很多视频游戏使用像OpenGL这样的库。
首先,OpenGL不是一个库,而是一个API(规范)。OpenGL API可以以软件库的形式实现,但现在更常见的是以驱动程序的形式实现OpenGL,将OpenGL函数调用转换为控制命令,发送到坐落在图形卡(GPU)上的图形处理器。
所有我看过的这类库的教程都展示了如何编写告诉计算机绘制某些东西的代码。
是的,因为需要绘制物体才能利用它们。
问题在于,如今的游戏中,一切都是使用Zbrush、Maya或3ds Max等软件建模的。
此时,模型只是由大量数字组成的列表,还有其他数字表示这些数字形成某种几何形状的方式。这些数字并不是一种可直接使用的图像。
这些模型被纹理化并且已经准备就绪。
它们只是一堆数字,其中还有一些额外的数字来控制纹理。纹理本身也只是数字。
看起来你只需要编写一个动画循环来绘制模型并进行重复更新,而不是实际编写绘制每个小物体的代码。
那么你认为这个绘制会发生在哪里呢?没有什么神奇的“这里有一个模型,将其显示”函数。因为首先由组成模型的数字可能具有任何类型的含义。所以必须有一些程序给这些数字赋予意义。这就是渲染器。
再次说明,没有什么神奇的“绘制它”的函数。绘制模型涉及到遍历其每个数字,将其转换为向GPU发出的绘图命令。
那将会非常耗时,并且会使模型变得无用。这句话并不正确。模型控制OpenGL命令的发出。或者你认为OpenGL被用于实际“创建”模型吗?
那么OpenGL或Direct 3D在视频游戏和3D艺术中的作用是什么?它们用于将从建模软件保存下来的3D模型数字转换为令人愉悦的东西。
当模型完成时,图形尚未创建。创建的是模型和一些辅助数据,如纹理和着色器,然后在程序执行时间实时将其转换为图形。
既然一切都已经创建好了,只需要加载和绘制,那么OpenGL或Direct 3D对此有什么关键作用呢?

加载后,模型只是一堆数字。而绘图意味着将这些数字转化为可视化的内容,这需要使用类似OpenGL或Direct3D的API向图形处理器(GPU)发送绘图命令。

它们主要用于着色器和特效吗?

它们用于将3D建模程序(Blender、Maya、ZBrush)生成的数字转化为实际的图片。


我知道没有什么神奇的绘图函数。我从Java开始,它带有GUI工具包,其中包含各种绘制方法。因为这是我开始的方式(并不久之前),所以我不知道其他语言没有预先提供这样的方法。 - user1558737
@user1558737:即使是Java的GUI工具包SWING和AWT也只是建立在操作系统的图形原语之上。而在某些操作系统上,这实际上是OpenGL。Java本身(语言)并没有图形能力。 - datenwolf

3
您有数据。就像模型一样,其中包括顶点、法线和纹理。如@datenwolf上面所述,这些都只是存储在硬盘或RAM中的数字,而不是屏幕上的颜色。
您的CPU(运行您编写程序的位置)不能直接与屏幕通信。相反,您将要绘制的数据发送到GPU。然后由GPU绘制数据。类似OpenGL和Direct3D的图形API允许在CPU上运行的程序向GPU发送数据并自定义GPU绘制方式。这是一个非常简化的描述,但听起来您只需要概述。
最终,每个图形程序必须通过图形API。例如,当您绘制图像时,会将图像发送到GPU,GPU会在屏幕上绘制它。绘制文本?将数据发送至GPU。GPU会将其绘制出来。请记住,您的代码无法直接与屏幕通信。通过OpenGL或Direct3D,您可以与GPU通信,GPU会绘制数据。

2

在OpenGL和DirectX出现之前,游戏必须使用特定的指令来适应不同的显卡。当你购买新游戏时,你必须仔细检查你的显卡是否被支持,否则你将无法使用该游戏。

OpenGL和DirectX是标准化的图形卡API。由卡片制造商提供一个库。如果他们遵循规范,你可以保证游戏能够正常工作(如果它们也遵循相同的规范)。


-2

OpenGL(开放图形库)是一个跨语言、跨平台的应用程序编程接口(API),用于渲染2D和3D矢量图形。该API通常用于与图形处理单元(GPU)交互,以实现硬件加速渲染。


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