![渲染管道的哪个部分编译着色器?](https://linux22.com/image/1562034/%E6%B8%B2%E6%9F%93%E7%AE%A1%E9%81%93%E7%9A%84%E5%93%AA%E4%B8%AA%E9%83%A8%E5%88%86%E7%BC%96%E8%AF%91%E7%9D%80%E8%89%B2%E5%99%A8%EF%BC%9F.png)
通常,使用顶点和片段着色器的视频游戏和其他图形软件将以实际着色器源代码(通常为 glsl 或 hlsl)的形式提供所述着色器,并在运行时编译它们以供显示硬件使用。 (据我了解,着色器实际上无法预编译到游戏二进制文件中,因为显示硬件使用的实际着色器机器代码取决于显卡品牌甚至其型号/代,并且它们可能彼此不兼容。)
尽管我自己从事游戏编程领域并使用着色器,但我实际上并不知道图形管道的哪个部分实际上将着色器编译为显卡使用的机器代码。编译着色器本质上是一个黑匣子:将着色器源代码放入您正在使用的任何库中,它会在幕后发挥其魔力。
我感兴趣的是确切了解编译过程发生的位置。整个系统的哪个部分会获取着色器源代码并从中生成着色器机器代码?
我的(大胆)猜测这是由显卡驱动程序完成的(因为驱动程序知道应该输出什么样的机器代码,以及如何针对特定品牌和型号的显卡对其进行优化)。
(如果确实如此,那么至少可以部分解释为什么图形驱动程序对于游戏运行效率如此重要,因为它对着色器机器代码的优化会对渲染速度产生很大影响。)