MJP
therealmjp.github.io · Personal blog · on HN since 2019
MJP is a graphics programmer who writes about real-time rendering, shaders, DirectX 12, and subsurface scattering, plus occasional retro development.
What HN saysHN commenters call his posts classic and excellent references on deferred texturing, subsurface scattering, and shader permutation and compilation stutter.
17HN people shared it
8linked it in comments
15stories submitted
291story points
4 months agolast shared
2019people per year2026
Most-shared posts
- 1The Shader Permutation Problem – Part 1: How Did We Get Here?5 people · 1 points · first shared 2023 · discussion on HN
- 2An Introduction to Real-Time Subsurface Scattering3 people · 149 points · first shared 2019 · 4 comments on HN
- 3To Early-Z, or Not To Early-Z3 people · 4 points · first shared 2025 · discussion on HN
- 4Ten Years of D3D122 people · 83 points · first shared 2025 · 66 comments on HN
- 5Shader permutations part22 people · first shared 2023
- 6Shader Printf in HLSL and DX121 people · 48 points · first shared 2024 · 6 comments on HN
- 7Adventures in Retro Development: SNES Edition1 people · 2 points · first shared 2023 · discussion on HN
- 8Half the Precision, Twice the Fun: Working with FP16 in HLSL1 people · 1 points · first shared 2019 · discussion on HN
- 9Hello, Hugo1 people · 1 points · first shared 2019 · discussion on HN
- 10GPU Memory Pools in D3D121 people · 1 points · first shared 2022 · discussion on HN
- 11What Is a Barrier?1 people · 1 points · first shared 2019 · discussion on HN
- 12Bindless texturing for deferred rendering and decals1 people · first shared 2022
- 13Pix with xna1 people · first shared 2023
What HN people wrote when they linked it
jms55 · 2024-12-01
Ah yeah pipeline compilation is a very non-trivial problem[1]. Unreal is also struggling with this a lot. I hear you that it's an issue.
The Bevy issue you want to follow is https://github.com/bevyengine/bevy/issues/10871.
[1]: https://therealmjp.github.io/posts/shader-permutations-part1 + https://therealmjp.github.io/posts/shader-permutations-part2
Jasper_ · 2022-07-27
The classic post on Deferred Texturing is MJP's, if you want to learn more about the technique: https://therealmjp.github.io/posts/bindless-texturing-for-deferred-ren…
Also see the recent post here which covers more benchmarks and details: http://filmicworlds.com/blog/visibility-buffer-rendering-with-material…
rangibaby · 2020-09-18
Human skin is translucent too. Real time Sub-surface scattering has existed for years and is now to making it into games. There's an excellent writeup here:
https://therealmjp.github.io/posts/sss-intro/
Realtime reflections seem to be on their way too:
https://youtu.be/pNmhJx8yPLk
frogblast · 2023-11-10
If you're interested in more background about one user-visible problem being directly attacked by this new GPU architecture, that could be "shader compilation stutter" (although there are many others).
These are two excellent posts that go deep on this:
The Shader Permutation Problem - Part 1: How Did We Get Here?
The Shader Permutation Problem - Part 2: How Do We Fix It?
In particular, the second post has the line:
We probably should not expect any magic workarounds for static register allocation: if a callable shader requires many registers, we can likely expect for the occupancy of the entire batch to suffer. It’s possible that GPUs could diverge from this model in the future, but that could come with all kinds of potential pitfalls (it’s not like they’re going to start spilling to a stack when executing thousands of pixel shader waves).
... And that is exactly what has been done.
https://therealmjp.github.io/posts/shader-permutations-part1/
https://therealmjp.github.io/posts/shader-permutations-part2/
formerly_proven · 2026-07-07
Console vs PC is a red herring since UE games still stutter on consoles, people just notice that less because most games run at 30 fps anyway. You can read Unreal's own blog posts on this and they'll actually explain that this is mostly down to their material system (and game logic/scripts reaching into it) being designed to create nearly infinite shader variations on the fly in response to arbitrary world/game states. This design choice separates engines which have shader stutters from those which do not.
https://www.unrealengine.com/tech-blog/game-engines-and-shader-stutter… https://medium.com/@GroundZer0/what-unreal-doesnt-tell-you-about-shade… https://therealmjp.github.io/posts/shader-permutations-part1/
rasz · 2025-12-24
Because GPU developers started to be less lazy :)
No T&L meant everything was culled, clipped, transformed and per-vertex divided (perspective, lighting) on CPU.
Then you have brute force approach. Voodoo 1/2/3 doesnt employ any obvious speedup tricks in its pipeline. Every single triangle pushed into it is going to get textured (bilinear filtering, per pixel divide), shaded (lighting, blending, FOG applied) and then in the last step the card finally checks Z-buffer to decide between writing all this computed data to buffer or simply throwing it away.
It took a while before GPU devs started implementing low-hanging fruit optimizations https://therealmjp.github.io/posts/to-earlyz-or-not-to-earlyz/
Hierarchical-Z, Fast Z clearing, Compressed Z buffer, Compressed Textures, Tiled shading. It all got added slowly one step at a time in early 2000.
apitman · 2025-12-17
The PSO problem is referring to this, right? https://therealmjp.github.io/posts/shader-permutations-part1/
ArtWomb · 2023-08-03
Oh The Danger Zone had essential XNA knowledge ~2010
https://therealmjp.github.io/posts/pix-with-xna/