Shader Components: Modular and High Performance Shader Development
Yong HeTheresa FoleyTeguh HofsteeHaomin LongKayvon Fatahalian
ACM Trans. Graph. (2017)
teaser

Modern game engines seek to balance the conflicting goals of high rendering performance and productive software development. To improve CPU performance, the most recent generation of real-time graphics APIs provide new primitives for performing efficient batch updates to shader parameters. However, modern game engines featuring large shader codebases have struggled to take advantage of these benefits. The problem is that even though shader parameters can be organized into efficient modules bound to the pipeline at various frequencies, modern shading languages lack corresponding primitives to organize shader logic (requiring these parameters) into modules as well. The result is that complex shaders are typically compiled to use a monolithic block of parameters, defeating the design, and performance benefits, of the new parameter binding API. In this paper we propose to resolve this mismatch by introducing shader components, a first-class unit of modularity in a shader program that encapsulates a unit of shader logic and the parameters that must be bound when that logic is in use. We show that by building sophisticated shaders out of components, we can retain essential aspects of performance (static specialization of the shader logic in use and efficient update of parameters at component granularity) while maintaining the modular shader code structure that is desirable in today's high-end game engines.

Yong He, Theresa Foley, Teguh Hofstee, Haomin Long, Kayvon Fatahalian (2017). Shader Components: Modular and High Performance Shader Development. ACM Trans. Graph., 36(4), 100:1--100:11.

@article{He:2017:ShaderComponent,
author = {Yong He and Theresa Foley and Teguh Hofstee and Haomin Long and Kayvon Fatahalian},
title = {Shader Components: Modular and High Performance Shader Development},
journal = {ACM Trans. Graph.},
issue_date = {July 2017},
volume = {36},
number = {4},
month = jul,
year = {2017},
pages = {100:1--100:11},
articleno = {100},
numpages = {11},
publisher = {ACM},
}