【发布时间】:2011-07-27 19:35:46
【问题描述】:
我正在学习 OpenGL,我很想知道与显卡的交互是怎样的。
我觉得了解它是如何在图形驱动程序中实现的,会让我了解 opengl 的完整内部结构(这样我就可以知道哪些阶段/因素会影响我在 opengl 中的性能决策)。
这条路有什么办法可以继续。探索“Mesa lib”在这方面对我有帮助吗?我走对了吗?
【问题讨论】:
我正在学习 OpenGL,我很想知道与显卡的交互是怎样的。
我觉得了解它是如何在图形驱动程序中实现的,会让我了解 opengl 的完整内部结构(这样我就可以知道哪些阶段/因素会影响我在 opengl 中的性能决策)。
这条路有什么办法可以继续。探索“Mesa lib”在这方面对我有帮助吗?我走对了吗?
【问题讨论】:
您可以在 ryg 博客上找到一个包含 10 部分的优秀系列文章来准确解释这一点。 http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-1/ 它是根据 DirectX 进行解释的,但实际驱动程序对这两个 API 的处理非常相似。 描述实际硬件性能特征的最佳文章之一是 GPU Gems 2 文章http://developer.nvidia.com/node/52。这篇文章本身已有几年的历史,但它肯定会增加您对问题空间的认识。此外,研究 NVIDIA 无绑定图形扩展 (http://developer.nvidia.com/content/bindless-graphics) 将为您提供一些额外的见解,如果您了解它为什么会加快速度。另外,“Batch批批”演示是CPU/GPU交互优化的经典(http://www.nvidia.de/docs/IO/8230/BatchBatchBatch.pdf)。
但是,我觉得有必要回到最初的问题。问问自己哪个是第一:知道如何编程 C++,或者知道 GCC 的内部结构。几乎开放的每个人都将 3d api 视为黑匣子,这是有充分理由的。驱动程序因硬件而异(API / NVIDIA),性能特征也加倍。我真的建议您开始编写一些 OpenGL 代码,并通过优化代码来学习。你可以做一个小技巧(比如视差遮挡),或者,可能更好的是,用不同种类的动态灯光、阴影、延迟渲染和后期处理来编写一个完整的场景。然后留出几周的时间来优化它,看看你能走多远。
优化 3d 渲染确实有点玄学,几乎没有“在每种情况下都正确”的答案。最好的学习方式是来之不易的经验。
这些准则可能与任何人都可以得到的一样接近:
【讨论】:
如果不熟悉 OpenGL API,您将很难理解 OpenGL 驱动程序(Mesa/Gallium 术语中的状态跟踪器)的内部结构。
OpenGL 本身是根据抽象图形机器定义的,实际上从这个有利位置理解 OpenGL 比尝试通过驱动程序来理解要容易得多。
查看驱动程序的源代码肯定会帮助您了解与此特定驱动程序相关的任何瓶颈。当然,它有助于查看其他驱动程序中的模式。但阅读有关 GPU 架构的技术文档会有所帮助。
【讨论】: