从零开始手敲次世代游戏引擎(七十九)
一晃又一年过去了。。。 即便这样,如我在系列开头所说,这个系列我是不会放弃的,虽然可能会很慢,但是我会努力继续下去。 因此,今天更新一篇。 其实在这一年当中我对图形部分在不断进行重构。其中一个重点就是对应DX12/Vulkan/Metal的PSO(Pipeline State Object)概念。虽然3个图形API的PSO概念在实现细节方面并不是完全一致,但是大致的概念是共通的:将GPU的管道状态,包括 渲染管道入口处的,附属在vertex(顶点)处的属性layout; 渲染管道出口处的RT/DT的格式 固定功能(Fix Function)的设置,如 深度测试是否有效,深度测试的比较函数(>, >=, ==, <, <=, always true, always false) Stencil测试是否有效,相关测试 Shader的绑定 这些主要的概念。 其实,这基本上就对应现代GPGPU当中的Context,也就是上下文的概念。在以往,特别是诸如OpenGL这样的图形API当中,这些状态设置是混杂在绘图命令当中的,并没有单独分开进行存储。这就导致在需要改变渲染管道状态的时候,需要一系列的命令来对状态进行设置,并且: 要么每次把所有状态都重新设置一遍 要么需要在引擎当中自己跟踪状态的变化,计算出需要改变哪些设置 而DX12/Vulkan/Metal提供了PSO对象