我想知道如何实现一个OpenGL驱动程序来学习OpenGL内部



我正在学习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)将给你一些额外的见解,如果你明白为什么它加快了。此外,"BatchBatchBatch"演示是关于CPU/GPU交互优化的经典演示(http://www.nvidia.de/docs/IO/8230/BatchBatchBatch.pdf)。

但是,我觉得有必要回到最初的问题。问问你自己哪个更重要:知道如何编程c++,还是知道GCC的内部原理。几乎所有人都将3d api视为黑盒,这是有充分理由的。驱动程序是不同的(API/NVIDIA)取决于硬件,性能特点更是如此。我真的建议您开始编写一些OpenGL代码,并通过优化代码来学习。你可以使用一些小技巧(如视差遮挡),或者更好的方法是,使用不同类型的动态光线、阴影、延迟渲染和后期处理来编写一个完整的场景。然后留出几周的时间来优化,看看你能走多远。

优化3d渲染确实是一种黑色艺术,并且很少有"在每种情况下都是正确的"答案。学习的最好方法是汲取来之不易的经验。

这些指导方针可能是任何人都能得到的最接近的:

  1. 广泛使用LOD(网格,纹理和着色器)
  2. 尽量保持你的draw count越低越好
  3. 尝试保持你的中间缓冲区尽可能小(计数和大小)延迟渲染
  4. 尝试在半分辨率下做一些渲染(例如粒子和后处理)
  5. 总是在着色器中纹理访问之前优先选择算术
  6. 永远记住"好看"胜过"正确"
  7. 优先于算法优化,而不是低级优化

如果不熟悉OpenGL API,您将很难理解OpenGL驱动程序(Mesa/Gallium术语中的状态跟踪器)的内部结构。

OpenGL本身是根据抽象图形机定义的,实际上从这个角度理解OpenGL比试图通过驱动程序来理解要容易得多。

查看驱动程序的源代码肯定会帮助您理解与该特定驱动程序相关的任何瓶颈。当然,这也有助于了解其他驱动程序的模式。但阅读有关gpu架构的技术文档更有帮助。

最新更新