SuperPhysical is a forward rendering setup and the successor of SuperPhong.
It features cook-torrance shading, physically based rendering and image based lighting.
The implementation is mainly based onhttps://learnopengl.com/#!PBR/Theory
"focusing on the PBR approach as originally explored by Disney and adopted for real-time display by Epic Games".
Put the contribution into packs. Check out SuperPhysical help patch for usage scenario.
Compatible from Beta 36!
All feedback welcome! Have fun!
Deferred version needs DX11 pack version 184.108.40.206.
Built can be found here:
this is beautiful! thanks a lot!
wow, amazing shader, well done ;)
that's fucking sick bruh!
Really like it! Is there a way to spread the texture transform? Right now it is always using the first slice of transforms for all instances of an object.
the texture transform is currently not spreadable as it should be. will fix this in next update. for now you could use a TransformTexture effect to scale the textures per instance.
Does this work in 50beta35 64bit or did I miss something on the install?
Should be working in 50beta35. The problem is DX11 1.0, because all Dynamic Buffers are set to "Dynamic" now. If you set them back to "Default" in the Inspector it shoud be working. There is a whole bunch in the light module.
Also, new version of Superphong will be out soon.
Ok, cheers. Looking forward to new version!
As a side note this has been fixed in 1.0.1 (which is in contrib page already)
Cool, thanks for the quick fix!
The new version has a couple of changes. The light blending has been overhauled a bit. Now all the lights - image based lighting and phong lights - are treated the same way and reflections are blended with the fresnel term. This means, there is no RimLight anymore, but Global Reflection Color, Global Diffuse Color and Material Color. Also there is only one set of fresnel values for everything reflective. See girlpower for how it works. This should feel a lot more natural.
Also fixed some bugs and spreading problems.
Also new: No tiling mode. This avoids strong repitition of textures by using this code by Inigo Quilez: http://www.iquilezles.org/www/articles/texturerepetition/texturerepetition.htm
Thanks, great work!
This is a properly shaded teapot.
i am so happy i found this :)
Stay tuned for proper PBR update (Unreal Engine implementaion) with cook-torrance, parallax occlusion mapping, you name it..
i have to use an old Version (34.2) - and maybe that is why in the directionalLight-module is a red node(select transform is missing..) what needs to be connected to have it working? - it is connected to the ViewProjection Shadow.
simply replace the node with a Select(Node). This should be it!
Great contribution guys!
One question from a shader primer: is there a way to handle the alpha of the shader? I want to hide/make visible some geometries.
the alpha channel got a bit neglected.
I will bring all features back as soon as possible.
It should all work same as the standard shaders then.
wooooo!!! this is exactly what i was looking for!!
Noticed a problem with the lighting function - it behaves very badly on low poly flat geometry, you can notice the warping as the highlight goes from polygon to polygon.
low poly wire:
high poly wire:
Hi letoast, that's a known limitation. I think it's due to calculating some stuff per vertex. As this improves performance I might not change this, but thanks for reporting!
Wow men this looks amazing!
Can I use 360 HDR images for global ilumination ?
Yep, there is something wrong - I explained this in the workshop also:
The "Global Reflection Color" is not really a correct part of the lighting equation, but somethin additional. i didn't combine this correctly yet, so that's were this bug comes from. If you do your lighting only with IBL and dynamic lights everything should be correct.
If you are brave enough go to superphysical.tfx and replace Line 271 with this Line:
IBL += (saturate(GlobalReflectionColor.rgb * (kS * envBRDF.x + envBRDF.y)) * iridescenceColor);
This will also be fixed in next release.
Oh lord, I never thought it would be that simple. I wanted to fix it so at first I started replacing variables one by one with constants to see what each one does. Then I was thinking that something might be wrong in the CookTorrance implementation, so I cross referenced an opengl implementation of it with yours, but I saw yours was ok and after that I kind of gave up... Didn't know it was the kD causing the problems, but going through all of the code out of nothing, just to remember what all of the variables stand for was also not something I was prepared to do :D
As far as I understood it you just wanted to colorize the cubemap with the global reflection color?
Thanks for the quick reply, though!
Yeah, sorry for sending you on a bughunt there.
Actually this fix works for now, but is not totally correct, as any reflections of a metal surface should be colored as the material is. So e.g. only blue is reflected. I will integrate this in the next version.
A link to my question on the forum about using multiple assets in SuperPhysical
First attempt to make an Assets Manager for SuperPhysical here:
i really miss emission in here, i am making it by blending another pass into the pipeline but it would be great to have it as a base feature
Good call, already implemented this in my dev version.
thoughts and prayers with you!
Trying to understand the IAtt values in Superphysical and why white lights increase saturation and not brightness: https://discourse.vvvv.org/t/superphysical-lights-increase-saturation-not-brightness/15940
Hi Mr. Burk, awesome stuff, really! Wouldn't it make sense to also save a name for each material in the new VL (yay!) object? In case you have a lot of materials that you want to use in different places..
thanks and yes, that's definitely on my list. will be especially important for instancing to have a name or an ID.
Wow, mburk, the update looks amazing and comes right in time. Thanks for your massive work!
hello @tgd and @mburk
the nodes seem to reference the old CraftLie ones, they have moved into the CoreLib and are now called ToBufferDescription. Please update accordingly, thx!
uploaded the fix for alpha 35.18
great, thanks a lot!
i cant run it, its crashing every time i try to open help file 35.8, clean install not helping
hey @StiX. it's only working with latest alpha because of new VL features atm.
ah i overlooked that, runs maxed 120 even with volumetrics and multiple lights, really good
I think you have to set distance to 0. Can't check atm.
@mburk you were right thanks
Did you saw the GGX shader that flux posted here https://discourse.vvvv.org/t/community-coding-the-new-vvvv-standard-shader/15188/34 ?
That way of dealing with Ligths buffers looks awesome.
Will you add DOF on the next release?
Thanks for this great Shader!
Unfortunatly I have a Problem with it. Every Light Source casts a black dot on the my objects.
It always occures in the center of the light spot. How can I fix this?
Are you using a custom model? Looks like the normals are inverted.
No, this is the Default Sphere out of vvvv, but with custom models i have the same Problem too, no matter what i Change with the normals.
strange..can't reproduce this here. make sure to use the latest version of the contribution from github. if the problem persists, please open a forum thread and share your patch.
Hallo, would it be possible to use a Dynamic Buffers to feed the transformations of the objects instead of CPU transforms?
@io absolutely, combine this great contr with another great contr known as "instance noodles" ;)
@io the easiest way would probably be to use instance noodles, do all the geometry magic and then use "Merge Geometry" to create a single mesh out of it. Deferred version of superphysical that also has a module for instancing is coming up, but using instance noodles like that will probably also do the job.
Yes, ok I was taking the wrong approach (trying to work with the transformation input to the shader), of course it is way easier to multiply the geometry and then feed it, thanks.
Hi, seems like the volumetrics isn't quite working for you. That's probably why the preview looks tinted..the blend node is just adding white. You could just not use the volumetrics and everything shoudld be fine. You can also try the newest version on github and see if that fixes it for you. Proper update to upload here is still in the making..
Ok now that I have merged the geometries, how do can I set a single color per instance? Got lost there..
hey. that's not really possible in that workflow. once you have merged it, you can only assign a single material. you could check out the WIP deferred version with instancing on github. but it's not quite ready for release yet. will upload it here, as soon as it is usable. that version will allow you to assign different materials to single instances.
My problems already start by opening fbx and collada files in the SuperPhysical help patch. The geometry always seems to be invisible. The only change happens in the background from file to file it gets brighter oder darker. (The geometry was created in blender and works fine with the dx9 geometry setup)
hey @Radion, please open a forum thread and share your patch and fbx file if possible. Generally there is no show-stopper here. I'm using imported geometry all the time.
I have tried https://github.com/michael-burk/SuperPhysical/tree/Deferred , spreading either ALbedo Color or Textures (thus creating multiple materials) does not allow to index the color of each instance. Is that the right approach?
hey. have a look in the subpatch "GBUFFER - from instanced geometry". there you will find a material ID buffer, which specifies what material to use per instance. sorry - not really documented at all - yet. The material IDs buffer VL module is just an experimental feature at the moment. it allows you to select a material in the material visualizer when pressing "m" and then applying that material to any object in the active renderer by again pressing "m". but as I said, that's just some playful experimentation..just use the buffer directly.
Also make sure to use this branch: https://github.com/michael-burk/SuperPhysical/tree/Deferred+Forward
Which version of DX11 are you using?
latest one. please open forum thread, that would make discussion easier.
@mburk regarding the deferred branch, is the getslice(texturearray to array) somewhere to be found ? thanks
hey. it should be in the latest dx11 version.
since everyone seems to have problems, i've updated the zip file to contain the latest github branch and tested it with beta38.1
Thanks for that tonfilm. I also merged the fix and also merged everything to the master branch on github.
This version also includes an implementation of ForwardPlus (by kopffarben). Have a look at the example. Speaking of which: At the moment there are only quite overloaded help patches. So if anyone feels like contributing some easy examples - please do so on github.
I am probably missing something, but do you have any advice regarding managing transforms on imported meshes with multiple subsets. It gets confusing really fast with massive spreads for the transforms.
Also material management. I started working on something like a material manager that writes xml files but it is going to be a long way till (if) it ever gets done. Mostly due to my limited skills in vvvv.
hey. there is no real solution to conveniently handle those situations. the best way would be to finish VL.GLTF implementation. I was working on an adapter, but have no time to pursue this atm. I usually don't work with complex hierarchies of importet assets, but would recommend to merge as much geometry as possible, for example with the instance noodles merge node.
right now material handling is done the oldschool way and works by usual spreading.
the deferred version already has the concept of material IDs, which are assigend to different meshes. check out the help patch and press "m" in the material preview to select a material. then press "m" and click a mesh on the renderer to assign it. this is only a proof of concept implementation atm.
to manage materials you can have multiple material nodes and cons them together, to not have total spreading chaos.
mburk Thank you for the input.
To be completely hones it never occurred to me that i can merge material nodes ...
As for the geometry i suspected that there is a node to merge geometries, but i never found it as it turned out my noodles pack was trowing an error due to missing stuff. Reinstalled and all works now.
Thank you again for the awesome work!
on last version, should aspect ratio be added here ?
the problem seems to be how the render state node in the planar reflections module overrides the render state upstream. just add your blend in the module like that:
hi thanks, just tried it but this does not solve the culling issue for me. does this work for you?
i want to be able to set alpha for the geometry and need a blend node on the superphysiscal module.
the alpha blending works just fine, it is just the wrong culling in the reflection
hi. yes, tested and works for me. make sure to only use the blend at that point and not additionally on the SuperPhysical node upstream. If problem persists, please move to forum.
Issues using latest alpha - (VL 0624)
VL nodes are red - 'AsyncHelpers.Run method threw an exception.'
I am playing around with a few patches i made based on Superphysical and i do have a question:
What would be the best way to give my object dynamic textures for lets say Albedo, roughness and so on?
In the help patches there is a ToPointer node that gets a bang on the start but how can i do it for every frame?
Hi @mburk , is planar reflection only working for the non Instanced version ?
BTW, whats the difference between instanced IID and deferred? I mean, whats the better performance approach ?
Hi manuel. Should work fine even with the instanced version. You might need a SuperPhysical node for the reflective plane and another one which supports instancing. I just tried this and it works great: Open instancing example. Alsp open SuperPhysical (SuperPhysical) helppatch with planar reflection. Send layer from instancing example to help patch and connect layer before all other layers -> reflection of instanced elements.
If it is still not working please open forum thread.
Also IID is for compatibillity with instance noodles. Differences in performance should be neglectable.
I cannot reproduce the refraction issue.
Please move these questions to the forum, I think it's more convenient to discuss there.
Also please attach an example patch - this would help figure out the problem. My guess is, that refraction is not configured correctly in the material, but let's see.
anonymous user login