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

时间:2011-07-26 19:16:06

标签: opengl graphics

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

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

有没有办法继续这条道路。探索'Mesa lib'会在这方面帮助我吗?我是在正确的道路上吗?

2 个答案:

答案 0 :(得分:4)

有一个很好的10部分系列解释了你可以在ryg博客上找到的。 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. 在低级优化之前优先选择算法优化

答案 1 :(得分:3)

您将很难在不与OpenGL API密切合作的情况下尝试了解OpenGL驱动程序的内部结构(Mesa / Gallium术语中的状态跟踪器)。

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

查看驱动程序的源代码肯定会帮助您理解与此特定驱动程序相关的任何瓶颈。当然,它有助于查看其他驱动程序中的模式。但是阅读有关GPU架构的技术文档会有很多帮助。