我想知道如何实现 OpenGL 驱动程序来学习 opengl 内部结构?

Ayy*_*ppa 4 opengl graphics

我正在学习 OpenGL,非常想知道与显卡的交互方式。

我觉得了解它是如何在图形驱动程序中实现的,会让我知道 opengl 的完整内部结构(这样我可以知道哪些阶段/因素会影响我关于 opengl 性能的决定)。

有什么方法可以让这条路继续下去。探索“Mesa lib”在这方面对我有帮助吗?我在正确的道路上吗?

El *_*cel 5

您可以在 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) 会给你一些额外的见解,如果你明白为什么它会加快速度。此外,“批处理批处理”演示文稿是 CPU/GPU 交互优化的经典之作 ( http://www.nvidia.de/docs/IO/8230/BatchBatchBatch.pdf )。

但是,我觉得有必要回到最初的问题。先问问自己:知道如何编程 C++,还是知道 GCC 的内部结构。几乎所有人都有充分的理由将 3d api 视为黑匣子。驱动程序因硬件而异(API/NVIDIA),而性能特征也是如此。我真的建议你开始敲定一些 OpenGL 代码,然后通过优化代码来学习。你可以做一个小技巧(比如视差遮挡),或者更好的是,用不同种类的动态灯光、阴影、延迟渲染和后期处理来编写整个场景。然后留出几周的时间来优化它,看看你能走多远。

优化 3d 渲染确实有点像黑色艺术,而且“在任何情况下都正确”的答案很少。最好的学习方式是通过来之不易的经验。

这些指南可能与任何人都可以得到的一样接近:

  1. 广泛使用 LOD(网格、纹理和着色器)
  2. 尽量保持你的抽奖次数尽可能少
  3. 尝试保持中间缓冲区尽可能小(计数和大小)以进行延迟渲染
  4. 尝试以半分辨率进行一些渲染(例如粒子和后处理)
  5. 在着色器中访问纹理之前总是更喜欢算术
  6. 永远记住“看起来不错”胜过“正确”
  7. 在低级优化之前更喜欢算法优化