在我使用OpenGL的经验中,我经常忘记设置一些状态。因此,我认为状态机可能不是一个好的设计。但现在它必须兼容。我也知道DirectX在早期也是一个状态机。我想知道为什么OpenGL和DirectX最初被设计成状态机?
当人们提到“状态机”时,他们从未解释相反的含义,因此不清楚其意思。因此,我将在OpenGL“状态机”与当前D3D“非状态机”方面从一般和特定的角度进行讨论。
OpenGL和Direct3D都使用全局状态。每个渲染命令都需要设置一堆状态。
为了在这两个API中进行渲染,您必须设置一些全局状态。您必须设置要使用的着色器。您必须设置要使用这些统一变量的当前参数。如果您正在使用纹理,则需要设置它们。您需要设置当前视口参数等等。
采用这种“状态机”的原因很简单:这是硬件通常的工作方式。
每个状态位代表GPU中的一些寄存器。这些寄存器是状态。着色器需要加载才能进行渲染。您需要设置视口寄存器。您需要设置要使用哪些纹理寄存器。等等。因此,这些API是状态机,因为GPU是状态机。
你可以想象这是通过渲染命令完成的。但是请看一下需要传递的对象数量。你需要传递一堆着色器、一堆纹理、顶点数据、帧缓冲区、视口设置、混合设置等等。来自http://www.cs.tufts.edu/research/graphics/resources/OpenGL/OpenGL.htm:
OpenGL操作如状态机是为了避免在每个函数调用上传递许多参数。
最小参数传递
应用程序和OpenGL之间的通信必须最终通过工作站数据总线传递到图形硬件。数据总线通常比工作站CPU和图形硬件慢得多,因此通常可以成为高速图形的瓶颈。为了保持尽可能高的速度,OpenGL在其函数调用中尽可能少地传递参数,这可以通过查看OpenGL文档来看到。所有调用都假定许多内部变量先前已设置为所需值。