-
Notifications
You must be signed in to change notification settings - Fork 398
Shader Generator ND_mix_bsdf optimization #2499
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Shader Generator ND_mix_bsdf optimization #2499
Conversation
…ization step for ND_mix_bsdf. Replace the mix with an add and modify the upstream weight inputs accordingly to perform the same math as a mix. This allows the BSDF nodes to early out if their contribution is not necessary in the mix.
…e variables with double underscores. Fix asan crash. remove debug print
I'm very excited about the future of this work, @ld-kerley, and my main recommendation would be that we consider it a new investment of research and engineering effort for MaterialX 1.39.5, so that we have the time to validate this approach for all MaterialX shading models, from both a performance and visual parity perspective. Once we're confident that this gives us the same or better performance as #2483, #2459, and #2467, we can replace all of those manual optimizations with this automated approach, with the expectation that other shading models (even custom studio models) will benefit in the same way. |
Hi @ld-kerley , |
I'm not super familiar with the details of codegen here, but can you explain what is different between the two implementations? What can the add/mult nodes do that the mix node cannot ? |
Related to #2480 |
@fpsunflower Its not so much a feature of codegen, as much as function of the HW shader language backends here. The implementation of the BSDF nodes that accept a weight input are written to early out if the weight is zero. In the @bernardkwok today anyone not using codegen wouldn't have access to the optimization in this form. We could pre-process nodegraphs during build with this logic if we wanted. Personally I'm not a fan of optimizing the nodegraphs, when we've only validated it a performance improvement in subset of the backend languages. I actually wonder if we should put this optimization behind a code gen option switch to make it easier for downstream consumers to profile either way and make their own decision if they want it. If we grow the number of these sorts of optimizations, which I hope we do, there are a number of other really valuable ones we used at Imageworks, then I can imagine a world where perhaps downstream consumers could run "code gen" to generate an optimized version of the graph - but not go all the way to shader code. I think this might actually be an important part of any future overhaul of the code gen system, to centralize the graph based construction and optimization, and allow an "exit-point" here. But this is all me just shooting from the hip. |
Ah I see now -- the issue is the mix happens after the BSDFs are already evaluated, so there's no chance to short-circuit them. In the new layout they can be. This makes sense. |
Just for some more context - Slack conversations with Kai Rohmer here, suggest that at least in MDL this optimization might not be ideal. So we should refactor things here to be constrained to the HW shading languages for now. |
Taking inspiration from #2459, which is a significant win in terms of HW shader performance. Instead of optimizing the node graph directly, here we apply the same idea, but programmatically at shader generation time.
If we meet the following condition.
"A
mix
node that hasBSDF
type inputs, and if those two nodes haveweight
inputs themselves."Then we can replace the
mix
node with anadd
and modify theweight
inputs, by multiplying by themix
input, and the inverse of themix
input.Old nodegraph
New nodegraph
This allows the BSDF nodes to early out if their contribution is not necessary in the mix.
Taking this approach has a couple of advantages:
mix
node better conveys the idea behind the nodegraph.