» SuperPhysical
This site relies heavily on Javascript. You should enable it if you want the full experience. Learn more.


Credits: vux, dottore, catweasel


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".

Some Features:

  • Physical Based Rendering
  • Metalness workflow compatible to Substance Designer etc.
  • Image Based Lighting
  • VSM Shadows
  • Image Based Refraction
  • Parrallax Occlusion Mapping

Update 2.0:

  • Completely overhauled material and light setup powered by custom VL datatypes
  • New shadow mapping techniques: Exponential Shadow Maps (ESM) and Postfiltered VSM with varying penumbra size
  • Integrated volumetrics
  • Lot's of fixes and performance improvements

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
Built can be found here:


14.01.21 [18:29 UTC] by io | 844 downloads
latest github branch, updated for beta40
Show 9 older revisions

Older Revisions

18.01.19 [19:21 UTC] by tonfilm | 1738 downloads
latest github branch, updated for beta38.1
SuperPhysical 2.01.zip
04.02.18 [17:29 UTC] by mburk | 1260 downloads
compatibility with alpha 35.18
SuperPhysical 2.0.zip
28.01.18 [23:04 UTC] by mburk | 488 downloads
SuperPhysical 1.01.zip
30.06.17 [18:11 UTC] by mburk | 953 downloads
bugfix release
22.06.17 [18:18 UTC] by mburk | 498 downloads
08.04.17 [12:00 UTC] by mburk | 671 downloads
Bugfixing / Refactoring Lights Module
28.03.17 [22:52 UTC] by mburk | 417 downloads
new model for light blending; noTile option
SuperPhong 1.1.zip
17.02.17 [17:59 UTC] by mburk | 629 downloads
added VSM Shadows, fixed some spreading issues, fixed alpha
06.11.16 [20:55 UTC] by mburk | 748 downloads

Noir 07/11/2016 - 00:21

Cool man

motzi 08/11/2016 - 00:44

this is beautiful! thanks a lot!

screamer 08/11/2016 - 17:13

wow, amazing shader, well done ;)

boplbopl 13/11/2016 - 00:05

very cool!

catweasel 22/11/2016 - 20:18


evvvvil 06/12/2016 - 03:50

that's fucking sick bruh!

seltzdesign 12/12/2016 - 12:32

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.

mburk 12/12/2016 - 15:58

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.

matka 09/02/2017 - 20:21

Does this work in 50beta35 64bit or did I miss something on the install?

mburk 09/02/2017 - 21:32

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.

matka 09/02/2017 - 22:57

Ok, cheers. Looking forward to new version!

vux 10/02/2017 - 00:52

As a side note this has been fixed in 1.0.1 (which is in contrib page already)

mburk 10/02/2017 - 00:58

Cool, thanks for the quick fix!

u7angel 17/02/2017 - 22:22


graphicuserinterface 18/02/2017 - 09:49


Noir 18/02/2017 - 10:50


matka 20/02/2017 - 20:38

massive! thanks

robotanton 17/03/2017 - 16:36

Thank you!

mburk 28/03/2017 - 22:58

Version 1.2
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


No Tiling
matka 08/04/2017 - 13:10

Thanks, great work!

eno 10/04/2017 - 17:43

This is a properly shaded teapot.

xxxlalala 27/05/2017 - 21:06

i am so happy i found this :)

mburk 29/05/2017 - 10:26

Stay tuned for proper PBR update (Unreal Engine implementaion) with cook-torrance, parallax occlusion mapping, you name it..

nodeforum 22/06/2017 - 19:19


Noir 22/06/2017 - 21:45


hrovac 23/06/2017 - 08:23

great thx!!

small Thing:
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.

mburk 23/06/2017 - 09:13

Hi hrovac,
simply replace the node with a Select(Node). This should be it!

idab 27/06/2017 - 11:30

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.


mburk 29/06/2017 - 14:41

Hi idab,
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.

letoast 01/07/2017 - 09:45

wooooo!!! this is exactly what i was looking for!!

letoast 03/07/2017 - 00:37

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:

low poly wire:

high poly:

high poly wire:

mburk 04/07/2017 - 18:22

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!

andresc4 08/07/2017 - 20:38

Wow men this looks amazing!
Can I use 360 HDR images for global ilumination ?

mburk 10/07/2017 - 11:46

Well, you can use them for the image based lighting, yes. I would recommend using this toolhttps://github.com/dariomanesku/cmftStudio for creating Radiance and Irradiance cube maps. See the IBL example for usage scenario.

letoast 18/07/2017 - 14:00

Is there something wrong with the metallic part of the lighting function, because setting the "metallic" to "1.0" and "Global Reflection Color" even to "0.01" of a Value in HSV picker, sets the reflection color to a constantly white lit.
Like this:

mburk 19/07/2017 - 11:07

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.

letoast 19/07/2017 - 17:29

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!

mburk 20/07/2017 - 11:52

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.

guest 10/08/2017 - 12:46

Hello guys,

A link to my question on the forum about using multiple assets in SuperPhysical


guest 05/09/2017 - 18:34

First attempt to make an Assets Manager for SuperPhysical here:

StiX 08/11/2017 - 13:35

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

mburk 08/11/2017 - 18:09

Good call, already implemented this in my dev version.

StiX 17/11/2017 - 16:57

thoughts and prayers with you!

seltzdesign 19/12/2017 - 16:25

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

veevee 29/01/2018 - 13:44

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..

mburk 29/01/2018 - 19:50

thanks and yes, that's definitely on my list. will be especially important for instancing to have a name or an ID.

matka 29/01/2018 - 20:34

Wow, mburk, the update looks amazing and comes right in time. Thanks for your massive work!

seltzdesign 31/01/2018 - 14:55

mburk the update looks great and from the new image I can tell that you solved the saturation issue already. Will give it a spin and integrate into our patch once I get the chance. Just instancing left now, but seems like that's on the horizon.

tgd 02/02/2018 - 21:47

for me this works with vvvv_50alpha35.15_x64 but i get a red error about craftlie when trying to start with the newest alpha vvvv_50alpha35.16_x64. looks great btw! cheers :)


tonfilm 03/02/2018 - 00:27

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!

andresc4 03/02/2018 - 04:09

@tgd try a clean install with beta36-release-candidate
I had the same problem, that solved

mburk 04/02/2018 - 18:30

uploaded the fix for alpha 35.18

tonfilm 04/02/2018 - 19:27

great, thanks a lot!

StiX 05/02/2018 - 13:48

i cant run it, its crashing every time i try to open help file 35.8, clean install not helping

mburk 05/02/2018 - 15:50

hey @StiX. it's only working with latest alpha because of new VL features atm.

StiX 05/02/2018 - 16:17

ah i overlooked that, runs maxed 120 even with volumetrics and multiple lights, really good

andresc4 07/02/2018 - 15:43

I have this problem that is not contribution related, but maybe you can help me out
Im would like to animate the light rotation as if they were a DMX moving head, but the rotation point of the light is not the light source
Its rotating from the X, what would be the best way to fix that ?

mburk 08/02/2018 - 16:50

I think you have to set distance to 0. Can't check atm.

andresc4 19/02/2018 - 05:54

@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?

nilsfrid 20/02/2018 - 14:56

Thanks! Awesome!

Johannes Merkt 25/04/2018 - 16:05

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?

mburk 27/04/2018 - 15:53

Are you using a custom model? Looks like the normals are inverted.

Johannes Merkt 03/05/2018 - 15:55

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.

mburk 04/05/2018 - 21:00

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.

io 06/05/2018 - 14:05

Hallo, would it be possible to use a Dynamic Buffers to feed the transformations of the objects instead of CPU transforms?

nissidis 06/05/2018 - 18:58

@io absolutely, combine this great contr with another great contr known as "instance noodles" ;)

mburk 06/05/2018 - 19:15

@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.

io 06/05/2018 - 19:50

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.

KT100_ 23/05/2018 - 12:34
Red nodes
Preview window

I got these red nodes. Is there a way for fixing them? Also my preview window is like tinted grey. I'm working on 50beta36_x64 version.

mburk 24/05/2018 - 11:34

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..


io 05/06/2018 - 17:48

Ok now that I have merged the geometries, how do can I set a single color per instance? Got lost there..

mburk 05/06/2018 - 20:46

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.

Radion 24/06/2018 - 20:56

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)

mburk 25/06/2018 - 10:14

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.

io 04/07/2018 - 18:57

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?

mburk 04/07/2018 - 23:00

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.

mburk 04/07/2018 - 23:03

Also make sure to use this branch: https://github.com/michael-burk/SuperPhysical/tree/Deferred+Forward

io 05/07/2018 - 16:52

Which version of DX11 are you using?

mburk 05/07/2018 - 16:53

latest one. please open forum thread, that would make discussion easier.

ggml 07/08/2018 - 13:53

@mburk regarding the deferred branch, is the getslice(texturearray to array) somewhere to be found ? thanks

mburk 07/08/2018 - 14:36

hey. it should be in the latest dx11 version.

tonfilm 18/01/2019 - 20:23

since everyone seems to have problems, i've updated the zip file to contain the latest github branch and tested it with beta38.1

mburk 18/01/2019 - 21:20

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.

synth 25/02/2019 - 18:14

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.


mburk 26/02/2019 - 12:10

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.

synth 05/03/2019 - 14:22

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!

manuel 29/04/2019 - 04:53


on last version, should aspect ratio be added here ?

tgd 09/08/2019 - 17:32

Hi i was playing with the new? planar reflection and have a little issue when used with render state nodes.
As soon as i connect a blend node, the reflection seems to have wrong culling. The blend node does not even need to be set to a mode, just disabled. Can i fix this myself somehow?

mburk 15/08/2019 - 12:31

hi tgd.
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:

tgd 15/08/2019 - 15:13

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

mburk 20/08/2019 - 09:06

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.

mrboni 29/08/2019 - 13:36

Issues using latest alpha - (VL 0624)

VL nodes are red - 'AsyncHelpers.Run method threw an exception.'

synth 01/09/2019 - 14:33

mrboni Heya
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?


manuel 08/10/2019 - 08:09

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 ?

manuel 19/10/2019 - 01:52

mrburk:? any hint or what im doing wrong ?

mburk 21/10/2019 - 18:53

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.

manuel 25/10/2019 - 21:50

mrburk? thanks a lot

another question, im not able to see refraction working. I ve been trying turnin on and off all other textures/parameters but it doesnt seem to work

mburk 26/10/2019 - 17:14

Hi manuel,
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


~28d ago

manuel: very cool to generate matcap / cubemap for reflections https://cables.gl/p/pDCOCw

~29d ago

joreg: Join us for the 19th #vvvv meetup on November 11th: https://thenodeinstitute.org/event/19-worldwide-vvvv-meetup/

~1mth ago

~2mth ago

joreg: @zaid please ask this in the forum: https://discourse.vvvv.org/

~2mth ago

zaid: how can i detect a changing spread in gamma? the old workflow with a change and select node isnt possible. cheers

~2mth ago

joreg: @dawoof such a question is probably better asked in the forum or chat

~2mth ago

dawoof: hey vvvvers, What are yall's fav depth-camera for body tracking? (dancing in this case) eyeing the ZED but the delivery time is long