【问题标题】:What is the purpose of a graphics library such as OpenGL?OpenGL等图形库的目的是什么?
【发布时间】:2012-07-27 21:17:28
【问题描述】:

我意识到这可能是一个荒谬的问题,但在试图弄清楚哪些库用于哪些项目之前,我认为首先真正了解这些库的目的是有意义的。

很多视频游戏都使用 OpenGL 等库。我见过的所有此类库的教程都演示了如何编写代码来告诉计算机绘制一些东西。问题是,如今在游戏中,一切都是使用 Zbrush、Maya 或 3ds Max 等软件建模的。这些模型有纹理,很容易上手。似乎您需要做的就是编写一个动画循环来重复绘制模型和更新,而不是实际编写代码来绘制每一件小事。这将非常耗时,并且会使模型变得无用。那么 OpenGL 或 Direct 3D 与视频游戏和 3d 艺术有什么关系呢?当所有图形都已经创建并且只需要加载和绘制时,它们有什么如此重要?它们主要用于着色器和效果吗?

这个问题可能只是证明我对此有多么陌生,但这是我从未听说过的问题。我刚开始学习编程,对代码和逻辑的理解还不错,但我根本不懂图形库或某些框架,教程也无济于事。

【问题讨论】:

  • 你读过en.wikipedia.org/wiki/OpenGL吗?建模软件的用途完全不同。
  • 我已经读过了。我知道建模软件的作用。问题是我能找到的唯一的图形库教程是演示如何用代码建模,当您使用外部软件获取图形时,这在实际项目中没有意义。我只是不明白图形库在图形中的作用。
  • OpenGL 或 Direct3D 是相当低级的抽象。它们是构建更高级别工具的基础。
  • 我对它的用途感到困惑的一个例子是,为了实现 2D 游戏的图形,您基本上不断地加载图像,然后将它们绘制到屏幕上。唯一涉及的是编程语言和您要加载的图像。我不明白为什么你不能用 3D 做到这一点。是什么让 OpenGL 之类的东西变得如此必要?
  • 所以只是为了优化?

标签: opengl graphics direct3d


【解决方案1】:

看起来你需要做的只是编写一个动画循环来重复绘制模型和更新,而不是实际编写代码来绘制每一件小事。

计算机中发生的一切都是因为某种形式的程序告诉它确切地做什么。仅显示此消息所包含的字母是因为您选择的 Web 浏览器通过 HTTP 协议通过 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 工具包实际上包含图形库,所以我认为这些方法是理所当然的。
  • 是的。某处,某处,必须实际绘制这些东西。 OpenGL 是一个可移植的、相对低级的 API,用于执行 3D 图形的代码。
【解决方案2】:

很多视频游戏都使用 OpenGL 等库。

首先:OpenGL 本身不是一个库,而是一个 API(规范)。 OpenGL API 可以以软件库的形式实现,但如今更常见的是以驱动程序的形式实现 OpenGL,该驱动程序将 OpenGL 函数调用转换为对位于图形卡 (GPU) 上的图形处理器的控制命令。

我看到的所有关于此类库的教程都演示了如何编写代码来告诉计算机绘制一些东西。

是的。这是因为需要绘制东西才能使用它们。

问题是,如今在游戏中,一切都是使用 Zbrush、Maya 或 3ds Max 等软件建模的。

此时,模型仅包含大量数字,以及更多的数字,这些数字说明其他数字如何形成某种几何形状。这些数字不是某种现成的图像。

这些模型有纹理,很好用。

它们是一堆数字,它们有一些额外的数字来控制纹理。纹理本身只是数字。

您似乎只需要编写一个动画循环绘制模型

你认为这幅画会如何发生?没有神奇的“这里有一个模型,展示它”功能。因为组成模型的数字可能具有任何意义。所以一些程序必须赋予这些数字意义。那是一个渲染器。

并反复更新,而不是实际编写代码来绘制每一件小事。

同样,没有神奇的“绘制”功能。绘制一个模型需要遍历它的每一个数字,它由这些数字组成,然后将这些数字转换为 GPU 的绘图命令。

这将非常耗时,并且会使模型变得无用。

当模型控制向 OpenGL 发出命令时,它们是如何无用的。还是您认为 OpenGL 是用来实际“创建”模型的?

那么 OpenGL 或 Direct 3D 与视频游戏和 3d 艺术有什么关系?

它用于将 3D 模型的数字(因为它从建模者那里保存下来)变成令人愉悦的东西。

当所有图形都已创建时,它们的关键是什么

模型完成后,图形尚未创建。创建的是一个模型,以及一些纹理和着色器形式的辅助数据,然后在程序执行时实时转换为图形。

只需要加载和绘制?

同样,加载后的模型只是一堆数字。而绘图意味着,将这些数字变成可以查看的东西,这需要向图形处理器 (GPU) 发送绘图命令,这需要使用 OpenGL 或 Direct3D 等 API 来实现

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

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

【讨论】:

  • 我知道没有魔术绘制它的功能。我从 Java 开始,它带有 GUI 工具包,其中包含各种绘制事物的方法。由于我就是这样开始的(不久前),我不知道其他语言没有与已经可用的此类方法捆绑在一起。
  • @user1558737:即使是 Java 的 GUI 工具包 SWING 和 AWT 也只是建立在操作系统的图形原语之上。在某些操作系统上,这实际上是 OpenGL。 Java 本身(语言)没有图形功能。
【解决方案3】:

你有数据。像模型一样,具有顶点、法线和纹理。正如上面的@datenwolf 所说,这些都只是位于硬盘驱动器或 RAM 中的数字,而不是屏幕上的颜色。

您的 CPU(这是您编写的程序运行的地方)无法直接与屏幕对话。相反,您将要绘制的数据发送到 GPU。 GPU 然后绘制数据。 OpenGL 和 Direct3D 等图形 API 允许在 CPU 上运行的程序将数据发送到 GPU 并自定义 GPU 绘制数据的方式。这是一个粗略的简化,但听起来您只需要一个概述。

最终,每个图形程序必须通过图形 API。例如,当您绘制图像时,您将图像发送给 GPU,然后 GPU 将其绘制在屏幕上。画一些文字?将数据发送到 GPU。 GPU 绘制它。请记住,您的代码无法与屏幕对话。它可以通过 OpenGL 或 Direct3D 与 GPU 对话,然后由 GPU 绘制数据。

【讨论】:

    【解决方案4】:

    在 OpenGL 和 DirectX 之前,游戏必须根据您拥有的显卡使用特殊指令。当您购买新游戏时,您必须仔细检查您的卡是否支持,否则您将无法使用该游戏。

    OpenGL 和 DirectX 是图形卡的标准化 API。库由卡的制造商提供。如果它们遵循规范,则可以保证游戏可以正常运行(如果它们也遵循相同的规范)。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-17
        • 1970-01-01
        相关资源
        最近更新 更多