High-Level Rendering Using Render Graphs
ourmachinery.com
ourmachinery.com
At the dawn of real-time rendering everything was both bespoke and fixed-function. You would call a different optimized codepath to draw a floor, a wall, or a ceiling. If the platform was amenable to it you might use self-modifying code to optimize the time/space tradeoff. The datasets were small enough that a simple array was always the default "right" choice until you were running out of memory.
Gradually the demands generalized and became more algorithmic than low-level in nature. DOOM's best-known optimization was in using BSP for visibility.
Now - while there's still a great demand for smarter algorithms - most of the pipeline complexity comes in this kind of generalized dependency analysis stuff to maximize use of resources across a broad, complex, configurable pipeline without hand-tuning everything, which is a familiar compiler problem to have.
Apparently running bytecode interpreters on the GPU is not uncommon: https://dolphin-emu.org/blog/2017/07/30/ubershaders/
Not a single pretty image.
What gives?
http://www.gdcvault.com/play/1024656/Advanced-Graphics-Tech-... and https://www.gdcvault.com/play/1024612/FrameGraph-Extensible-...
for a more in depth view.
I would describe it as such: A scene graph specifies _what_ needs to be drawn, while a render graph specifies _how_ it should be drawn and what the dependencies of each step in drawing is. For example, a render graph is used to reduce the number of image layout transitions in a frame by looking at what layout is expected for each operation and figuring out where to put the layout transitions, instead of letting a human place the layout transitions which will inevitably lead to unnecessary transitions when the scene becomes complex enough.
I didn't think this article was bad even if it is maybe less concrete than the slides I linked.