OpenGL Superbible 7th 序

 当OpenGL还很年轻的时候,能够运行它的最高端SGI图形卡Reality Engine 2的造价是80,000美元,它每秒只能渲染200,000个纹理三角形,即每帧3,333个三角形(60Hz),那个时代的CPU比现在慢,主频差大概为100MHz,每个三角形需要500个CPU Cycles。在那个时候,图形很容易受到限制。并且图形API支持立即模式!以及用于绘制静态几何形状的显示列表。这就使得绘制图形很容易受到限制。

     当OpenGL 不再年轻的时候,能够运行它的最高端GPU造价大概为1000美元,并且他们甚至都不在他们产品描述中列出每秒渲染三角形数量了,因为现在每秒渲染三角形的数量已超过了60亿个了。今天的GPU运算速度是每秒数万亿次浮点运算,带宽达到每秒几百GB。同时CPU也变得更快了,4核3GHz已是常见配置,并且达到每秒200亿次浮点运算,带宽每秒20GB。所以我们在早期绘制一个三角形用500 CPU Cycles,到今天我们只用0.5 CPU Cycles。甚至我们可以完美的把4个核都利用起来,这将为每个三角形提供2个CPU Cycles!

     这一切足以说明,GPU硬件性能的增长已经超越了常规CPU的性能,性能提高了几个数量级。这种结果在今天是相当明显的,不仅CPU经常是图形性能的限制因素,而且我们还有一个基于不同假设设计的API。

     好消息是OpenGL也在进化,首先,它添加了顶点数组(Vertex Arrays),这样一个CPU开销相当低的指令就会被放大成大量GPU工作量,这在一段时间内起了作用,但还不够。我们增加了实例化渲染,以进一步增加GPU工作量,但是这是一种有限的工作量放大形式。因为我们并不总希望在自然真实的场景中绘制许多相同对象的实例。

     认识到API中出现的这些限制,必须以某种方式规避,OpenGL的设计者开始扩展接口,以尽可能的从接口中去除CPU方面的开销,无绑定的(“bindless”)扩展允许GPU直接引用缓冲区和纹理,而不是在驱动程序中经过昂贵的绑定调用。直接映射允许应用程序直接管理GPU同时引用的那块内存。这听起来很危险,也的确如此。但是,允许应用程序管理内存存在风险,却也减轻了驱动程序的巨大负担,并允许更简单。

     采用和上面类似的机制,稀疏纹理数组允许应用程序以类似的方法管理纹理内存,有非常低的开销。最后,多重绘制(multi-draw)意味着GPU可以生成非常多的缓冲区,这使得CPU有更多时间用于其他工作。

     所有这些OpenGL的改进都被松散的收集在AZDO (Approaching Zero Driver Overhead) 下面,并且他们中的许多已经被放到核心API中(OpenGL core API),我们仍然有许多需要改进的地方,因为我们试图得到一个API,允许开发者尽可能多的渲染,以他们想要的方式,而不用担心CPU驱动开销会碍事。这些特性需要一些工作量来使用它,但是结果真的令人惊叹,这个OpenGL超级宝典中包含许多新的例子,就使用了AZDO里的特性,并提供了很好的指导,在如何让CPU不碍事方面。特别的,您将学习使用零拷贝,无绑定等方法。

你可能感兴趣的:(OpenGL,专栏,OpenGL)