着色器是作为渲染过程的一部分在GPU上运行的小型程序。它们负责处理从3D模型的几何变换到纹理应用、光照、阴影以及后处理效果等所有环节。它们是现代游戏的基础,也是这些游戏画面如此震撼的原因之一。
不过,情况并非一直如此。早期的显卡依赖于固定功能的硬件,其中有专门的单元负责纹理渲染和光照等任务。虽然这些单元在当时性能强劲,但同时也缺乏灵活性。随着游戏变得越来越复杂,视觉效果也越来越宏大,固定硬件不仅限制了视觉效果,也束缚了创作自由。可编程着色器的出现打破了这些限制。
最早被广泛使用的着色器是像素着色器。它们决定屏幕上每个像素的最终颜色,并能处理光照计算、阴影、纹理、透明度以及模糊或卡通渲染等后处理效果。随后顶点着色器也应运而生,它允许开发者在几何体渲染之前对顶点数据(如位置、颜色和纹理坐标)进行处理。
随后出现了几何着色器,它可以在图形处理管道中实时生成和修改几何体。尽管由于性能开销,如今它们已不常被使用,但正是它们实现了程序化几何体以及粒子特效等效果。细分着色器在此基础上进一步发展,通过动态增加几何细节,使表面看起来更平滑,而无需存储更多的模型数据。
最近,现代API引入了任务着色器和网格着色器。它们用一个更灵活的系统取代了传统顶点、几何体和细分阶段的部分内容,使开发者能够更好地控制几何体的生成和处理方式。
光线追踪着色器是最新加入的功能。它们通过追踪光线在场景中的传播路径,用于实现反射、阴影和全局光照等效果。这些着色器通过 DirectX 光线追踪和 Vulkan 提供支持,且需要相对较新的显卡才能以可玩的水准运行。
如果着色器就是这样,为什么预加载它们需要这么长时间,而且“预加载”到底是什么意思?
这个术语略有误导性。实际上,着色器预加载是指编译和缓存着色器,而不仅仅是加载它们。游戏开发者可以在玩家游戏过程中实时编译着色器,也可以在游戏开始前预先编译好着色器。
在游戏过程中编译着色器虽然在简单情况下可行,但当遇到新的特效或区域时,往往会导致卡顿和画面撕裂。如果需要同时编译大量着色器,帧时间可能会急剧上升,这也是为什么这种做法在开放世界游戏中尤为明显。过多的实时编译通常是PC端优化不佳的迹象。
预加载着色器可以通过预先编译着色器并将结果存储在缓存中来避免这个问题。一旦编译完成,着色器便可在游戏过程中立即被重复使用,从而带来更流畅的性能。其缺点是,首次运行游戏时必须等待着色器编译过程完成。
在游戏进行重大更新或显卡驱动更新后,这种等待现象可能会再次出现,因为着色器二进制文件与游戏版本和显卡驱动都密切相关。由于显卡驱动更新频繁,着色器重新编译已成为PC玩家司空见惯的烦恼。
为什么开发者不能直接发布预编译的着色器呢?在我们心爱的个人电脑上,硬件和驱动程序的环境实在太过多样化。着色器的编译取决于 GPU 架构、驱动程序版本和图形 API,因此在一个系统上能正常运行的预编译着色器,在另一个系统上可能无法运行。游戏主机之所以能避免这个问题,是因为它们是固定平台,而个人电脑则不然。
所以,下次当你盯着着色器预加载画面时,请记住,它的存在是为了在实际游戏时减少卡顿并提升性能。这其实是件好事。
Stay up to date with CORSAIR. Get our latest News, Guides, and Product Updates in your Google feeds.
Add CORSAIR as a preferred sourceThanks for helping us improve this article.
JOIN OUR OFFICIAL CORSAIR COMMUNITIES
Join our official CORSAIR Communities! Whether you're new or old to PC Building, have questions about our products, or want to chat about the latest PC, tech, and gaming trends, our community is the place for you.