Hi Ben, Thank you for the great tutorial video! A little bit of feedback from me, who is using Unreal 4.62 from 2021, the time precision problem that you mentioned in this video at around 22:00 no longer exists in my version of Unreal engine.
A solution to the time node problem: Ensure that everything time related is a power of 2. Make your time period 4 or 8 seconds. 32 instead of 30. Importantly, your vector2 values need to also be power2 divisible. So instead of 0.2 and 0.7, try 2 and 4. You may need to multiply time to slow this down as a result, but this should stop the skipping. The multiplied values need to be able to complete full cycles within a given time loop.
your tutorials are easily some of my absolute favorites, I dropped out of art school years ago (game dev student) and i've already learned more from your videos than i ever learned in school, thank you so much for taking the time to make them and explain everything so in depth, you are an amazing teacher, thank you!!
Hi Mr. Cloward, reason for noise on drips is not in Unreal Engine but in Photoshop. In Photoshop if you use bucket tool in certain settings to fill time lanes of your mask those artifacts happen, using bucket tool with, 0 tolerance, no anti-alias settings fixes the problem considerably and using square brush in pencil mode to cover/paint mask lanes fixes the problem completely in all possible speeds and calculations. I'm learning everything shader related from you by the way so thank you very much for these lessons.
Yes - thank you very much for pointing this out. I also discovered that I had dither noise in some of my source textures and applied a fix for the version that is available for download.
Thanks so much ben youre really doing an amazing service demystifying and helping us make optimized shaders. Im loving learning from your channel every day
Thanks for your tutorials they are really helping me. at 21 min you talk about that sandpaper effect with time. well i am running version 4.26.1 and well I do not have that problem any more, could it be a bug. i had the same problem a couple of totorials back with the flip book tutorial where i turend off Period or the animation would constantly reset. like you have here but it worked just fine without the period in each instance.
I think the noise you talk about around 21:00 is "fixed"/minimised in UE5 (Using commit 6e4ead0 from branch 5.0). In fact, I was so worried at first when I saw it was different that I went through the vid node by node several times. I'm not sure what the difference is, however. I haven't done anything to the .tga's. Default compression on both works. Had originally used the mask compression on the rain_drip_mask.tga, also worked fine. Period on timer didn't change anything either.
This is my favorite video yet - starting to click for me how manipulating projections and masks can combine to create different effects. I haven't quite figured out why we need to minus 2 and add 1 when creating a normal map... I'm sure that will make sense at some point.. 🌧
Funny... this is explained in the next video. It's because we're swapping this info from color data into vector normal data and expanding the vector/normal range from 0->1, to, -1->1. Thanks!
@Ben Cloward It seems that the first lerp that we should be taking the RB component from is actually never used my friend. Also I looked into the alpha channel noise issue which is causing the dithering problem you solved with period 5 time node. it seems that it is caused by directly copy a png format tempo map into a .tif alpha channel in photoshop. The only solution is to magic wand tool(has to be 0 tolerance else filling it will introduce more noises around the edge of each region, which will cause the clearly visible seamlines between region seen on the cube at 22:12) each temporal offset region in the alpha channel and refill them with solid color manually. Either way it is confirmed to be a photoshop format inporting issue. One question is that I am really confused about what's the point of the UV wrapping we are doing at the start with the packed texture. Is it possible for you to make a tutorial in the future explaning simliar UV wrapping techniques in detail my friend? (Edit: to keep the desired noise effect you were talking about at 21:22 use a noise node, clamp it between 0 and 1, and then lerp the noise free tempo offset with the noise using a really small number say 0.00002. increasing it too much will freeze the animation however)
You're right - I can see that I never connected the Mask Component (RB) node to the lerp as I should have. It appears that I did correct the issue later when I converted the graph to a Material Function. Thank you for the tip about the dithering! I have fixed that problem in the version of the texture that's available in the video description. With that version, you should be able to use a time node with no period. Instead of using UV coordinates, we're projecting the texture on to the model in world space. The reason we do this is because we want the drips to always flow from top to bottom regardless of how the model is rotated. If I were to use standard UV coordinates, the drips would be "stuck" to the surface and would flow sideways if I rotated the model 90 degrees. So all of the setup that I do between 4:00 and 12:30 is to project the texture in world space from the front and the side.
@@BenCloward Ah so basically we are trying to map the 4 side faces of the cube's actual world position into its UV cordinate! The only thing I don't quite understand is the second part, after we scale the absolute world position, why are we doing a lerp between the two sets of cordinate based on the positive direction of X and Y axis? I tried playing around with removing this lerp and didn't really observe anything noticeable when moving the cube around in the scene T_T Are we blending them so that the front and back of the texture isn't exactly the same? And the purpose of why we are doing that is to create as much of a visual variance as possible with only 1 texture sample? Thanks master Ben!
3:37 How do I project the Drips in Local Space (the SK Mesh's location) instead of Absolute World Space? Problem: when the final Drip Mat is applied to my SK character, and he jumps around in the level, the Drips move to the side (scroll off Left-Right) = not realistic. Drips should be anchored to the SK mesh (Local Space or whatever it's called), wherever they spawned, and only Drip down, until the life expires. If SK character moves in the World, then Drip should stay with the character and remain in the same Local space. (Only a 5% world shift would look realistic, e.g. if "wind" was blowing the Drip line as the player moved Left-Right.) In the Drip function, I tried many nodes, anything that said Local. But it does not work. Please help. Ty Edit. I see I asked this question 4 months ago, in someone else's comment who asked. They didnt answer me. Guy said: it's hard to use UVs because different character meshes. (I have the same issue. I have complex Full body UVs. Then half body UVs, each different for different armor pieces. Then I have non-skin body Texture UVs, like gloves. I would need the Function to make all the Drips move down in Character space.) Ben said: It's not as hard as you make it sound. If you've built your shaders using material functions, you can just duplicate each function and make a character version of it that uses UVs instead of world position. This is how we handled it on my last project and it worked great. You don't need to change the UVs on the character. Just use the existing UVs to apply the drops. Guy said: The issue I had was that by using TexCoord, we had to have the UV's in the same direction. So for one of our armor, we had the belt facing up in the UV's and the drips were going left to right in the viewport. But looks like if I use Pre-Skined Local Position it work perfectly !! Maybe it's just me that were not understanding correctly, but yeah Pre-skined Position does what I want in my case ! I said: Can you explain the nodes better (like Pre-Skined Local Position) and post an image? No answer. Please help.
Hi Ben, I just discovered your tutorials a couple days ago and I really love them. You teach some very valuable things. Thankyou so much. PS: When using absolute world position, if you use divide instead of multiply, you can put directly the scale you wish in centimeters.
I already know how to create a bunch of complicated shaders in UE4, so what I'm doing here? Oh I know! I should reconfirm all the basics of shaders that I learned hardly with this soft and easy essential course from a veteran ^^
Hello @Ben Cloward, your material 101 series are mind blowing, each episode makes my brain melt, i got to this video, and i realized i don't understand how you come up with your workflow, i got the role of each node, but i wanna know how do you figure out the process to write all these materials and shaders ? i'd appreciate if you could suggest resources (books / course) to learn ? i hope you can help me, thank again for the tutorials.
Hi, I think this is an experience and an understanding of approaches. Truth be told , I also think so: how he combines those simple nodes into such algorithms. He uses textures virtuously!
Hi @Ben Cloward ! Thank you so much for the tutorial. I've got inspired by it to make something similiar in Unity and I faced the same artifact issues with higher values of time. I fixed that (or at least made that much better) when I changed my texture from 8 to 16 bits/channel, since it's a precision issue. Give it a try. I hope it can help. Keep up the great job.
I'm having a little problem with this setup. I'm doing it in Unity and using object space instead of the world, and everything works fine, but on some models I have to rotate the effect 90 degrees because of the object orientation. Rotating the texture with the normals and mask in it works fine (I'm also rotating the normals back after rotating the texture UVs), but I can't seem to find a way to rotate this tiny 'scrolling' texture. After rotating it flow goes not only in the wrong direction, but also the scrolling effect goes backwards. So, I spent the whole day on this with no luck so far, so I would be grateful if somebody could point me to the right direction.
Regarding the use of Perios for time. Im doint this in UE5 and I don´t have this issue. So it might just have been a bug that´s been corrected now.....
Yes, definitely! In episode 18 where we combine the drip effect with the drops, this masking happens automatically because we're putting the drops on the top and the drips on the sides - but if you're just using this effect by itself, you should mask it.
Hi Ben, I found that you forgot to wire an output of a lerp node at about 8:20. I dont know if you forgot it or do it on purpose. Is it has anything to do with the bug about the time node?
Yes, you're right. Nice job noticing that! The issue that I ran into later in the video was due to some very subtle dithered noise that was in my texture. I discovered it after I made the video, corrected the problem, and uploaded a fixed version - which is the one linked in the description. So you shouldn't run into that issue.
I wonder if the normal of the strips still show up on the top and bottom in the end result? I see the roughness is controlled by the vertex normal part, but not the normal.
I'm not seeing the time node issue in UE 5.5 on my end, but I've enabled a bunch of project settings that may help? Just to be thorough, here's everything I've changed from default settings. -Enable Virtual Textures Support -Use Hardware Ray Tracing when -Ray Lighting Mode - Hit Lighting for Reflections -Support Hardware Ray Tracing -Clear Coat Enable Second Normal
Wow, this is amazing. In this episode my brain just gave an error but I need really experiment it, to understand why is it working LOL? )) Thank you very much.
@@BenCloward I would like to learn more about custom shading models in ue4, vertex shaders tricks like analytical effects and procedural animation are also welcome, thanks!
@@BenCloward Thank you. Right now I dont exactly now what part I didnt understand. It happens me all the time when I learn new thing. After experimenting I will know if there is any part that need more explanation or not. I will check it after 2 days when I will go home. Thank you again.
Hi Ben ! Great tutorial as always! Is it possible to also add the Z mask using this method? Creating a tri-planar projection using only 1 sample instead of 3. I'm trying myself but I dont get a good result.
A textura original que usei para este tutorial tinha um ruído muito sutil - por isso, os resultados ficaram errados. Eu consertei isso na nova versão da textura que você tem - então não há mais esse problema. Portanto, os resultados que você está obtendo estão corretos.
I have gone over several times to spot any differences or incorrect values..but even though the drip effect matches yours and comes down the sides..I am getting a texture streaking effect of the drips on the top as well..I am not sure what is effecting this. I think it was explained this is the purpose of the VertexNormalWS (mask B)...in any event I can't get the streaking to stop. I am using unreal version 4.23.1 for this
Hi Ben, thanks again for the tutorial. Going through your tutorials in more detail, the mask problem looks like a precision issue. I was able to get much better results without looping just by setting the texture compression to 'Masks', and even better results again when I disable mip maps. If you take an imprecise number and multiply by a large number (time), the results become less accurate. This leaves an open question. Use two textures, compressed as normal map/BC7 and Masks, or just one texture packed compressed as Masks? Cheers.
All of this is true. However, my specific issue in this video was caused by dithered noise in my source texture. Once I made the masks more uniform values, the results improved a lot. And yes, I store the textures as uncompressed.
@@BenCloward Thanks for your reply, and for your tutorials. I was using BC7 and was seeing significant distortion with the time node, until I adjusted the compression settings to masks. My guess is that the compression is adding value artifacts to the mask values. Cheers.
@@BenCloward Do you have a vid on when to set compression to Masks? I have Unity textures or channel packed textures, and people said it needs to be set to Masks. But I am unclear why/what it does. Mask Compression (sRGB off) enhances the crispness of certain channels? (Grayscale G,B, or colorized G,B)? Also I hate changing Compression because I drop 20 texture sets in at a time. Id rather all my code/texture samplers use not Mask compression. So if you have a vid that explains that - and when we absolutely need to set a Texture to Mask compression, and change its node (in Graph) to make it display correctly. Ty
@@kenalpha3 The default DXT1 compression is weighted for best results when using color. When you set it to masks, it weights each of the three channels the same instead of treating them as a color. This means the compression artifacts won't be as bad in the blue channel as they would with Default. You don't have to change it, but if you do, you'll get better results. It's really up to you if it's worth your time - but I would do it.
21:09 I get perfect clean result without any noise, no need to set a period in the Time node. Don't know why. Epic might have improved that behavior. I'm using 4.26.2.
@@BenCloward Thanks for the answer, Ben. I'm going to use this method for a condensation effect. It's and important item in my scene, so I'm getting it a bit further, with variable width and vertically tileable channels for the waterdrops. Also adding some static round drops formation and experimenting with a massive 4K flipbook animation rendered with Blackmagig Fusion. The ultimate condensation shader! LOL I can send you the Material when I finish, if you want. Thanks for these awesome videos. Man, this is priceless. Thank you!
I'm using UE 4.25 and seems like I'm not having the noise problem. Otherwise, I would try a panner node I guess. Thanks for your great tutorials! Been following and plz keep going! They're amzaing!
Hi Ben, great tutorial! Would you like to share your import settings on the packed texture? I have a lot of troubles on compression and mip map settings. If I pack normal and masks together, it produces many artifects on both normal and mask data. Thank you very much.
Hi @Ben Cloward...Thanks for this awesome tutorial. One Question though: While animating the drip I have noticed that you can just multiply the time node and the temporal offset and still achieve the same effect.....Am new to shaders and not sure if this is correct...Thanks
I began to watch the tutorials from the very start, and I am absolutely addicted to them! The best on TH-cam! Thank you so much! I am totally new to shaders, so please could you explain better why you need to multiply by 2 and extract 1 to get the map from the texture? And also, do you always need to pack masks like this or you can use them as separate texture though it would be more expensive for performance?
Normal vectors are in the -1 to 1 range. But when we store them in textures, we compress that range to 0-1 (because textures can’t store negative values). Usually, if you tell the engine that a texture is a normal map, it uncompresses the range for you under the hood. But since our texture has normal data as well as other data together, we can’t tell the engine that it’s a normal map. That means we have to do the range adjustment manually. Starting with a range of 0-1, if we multiply it by 2, then we have a range of 0-2. Then we subtract 1 and we get a range of -1 to 1 which is what we need. I hope that makes sense. And no, you don’t always need to pack things up this way. It’s just a method for making the shader run faster.
@@BenCloward oh, that’s super clear now! Thank you again so much for your tutorials, they are all top quality and I am watching the entire series. Could you please tell me if you could do 1to1 sessions as tutor when I start developing my indie game? To watch the progress and advise on optimization, lighting, textures etc? It will be story driven action adventure game, I want to make the first prototype level as good as possible to be able then to show it and find a team or crowdfunding. And it will need very realistic looking and beautiful scenes, so your tutoring would be so valuable! If you can do 1to1 sessions, please send me email to singularity3100@gmail.com
My drips are still appearing on the top of the cube surface, and are looking closer to artifacts. I'm using UE 5.4, and I followed the video to a T. Not sure what is going wrong. Edit: After spending two days trying to fix it I almost immediately find the solution after posting this comment. In the video you multiply the drip texture by the R component from SplitComponents and use that product to multiply it by the normal mask. This doesn't account for the work done with the VertexNormalWS to exclude the top from being "dripped" on. Instead I multiplied the normal mask by the product of the previously mentioned product and the saturated VertexNormalWS mask.
@BenCloward You do in the complete rain shader vid, but that is where I was seeing the drip artifacts very clearly. I came back here to see if I could find a solution
@@BenCloward Speaking of using the Textures from the links, it says it can't display the website because of errors. I tried searching your site and all I could find was a link to these videos. Any help would be much appreciated. Thanks in advance for that and also for the vids! I'm following along and so far it looks great.
@@BenCloward Yup, I found that out *after* I left the comment. Lol! I saw someone else's comment and did a palm-to-face. Got it going now. Just got done with the Rain Ripples Shader video, gonna take a break before the Rain Puddles one though. All this pausing the video and copying the functions you made is really tiring. ;) Anyway, thanks again for the videos! Keep on being awesome, Ben. d :) b
Hi Ben, thx for this tutorial! I would like to ask you if instead of using z-component of the normal vector, is a better way do the dot product with the "UP Vector" and the normal itself in order to get rid of the top drip?
The UP vector is 0,0,1 - so if you do a dot product with that and the normal, the zeros in the X and Y positions of the up vector kill the contribution from the X and Y in the normal and what are you left with? Just the Z of the normal. So using just the Z component of the normal is a cheaper shortcut to getting the same result as if you had done the dot product with the up vecctor and the normal.
@@BenCloward Maybe i don't get it. The dot product return a float between -1 and 1, so i could use that to lerp where i want the drips and where not. Is it correct?
@@agtechart That is correct - yes. And taking the Z component of the normal will also give you that same float between -1 to 1, but you get it for free without needing to do the dot product operation.
Hey Ben, thank you for this great tutorial. i have a question is that possible to make the drips slow over time? start quick and slow over time? thank you 😊
The drips are set up to be applied to any size object - so the effect is tiling and each drip just continues on forever in its track. If they slowed over time then individual drips would come to a stop. Then you'd have to get them started again somehow - and there would be a pop. I'm not very clear on how that could work. So the short answer is yes, but I think you'd end up with side effects that wouldn't look good.
Sorry don't wanna bother you, i didn't see in the video when you open your drips texture on Unreal, so i have no clue of your compression settings. Did i miss it?
I tried this on a character sadly I have some drops going up and down. I hijacked a bit to have drops always going down no matter my the uvs on my character this comes close but is not the solution for me. Still great tutorial!
Your tutorials are really good, structured, and educational. And that even though my mother tongue is German. Unfortunately, the links to the textures do not work.
I'm not sure the error you're seeing is from the precision of the Time node is it? otherwise you'd also see that sort of error when you're just using the Time node and not trying to multiply to get different speeds. I tried replicating this setup and wasnt able to reproduce the error. I think the error might be because you're adding to both the U and V (or in your case world R and world B) components - i think you should only be affecting the vertical component, although the texture is uniform across so it shouldnt really make a difference. Maybe because you're using such a small texture? It does look like a precision error and it's strange the the period time makes the error better but i dont think it's the time's fault - maybe try just adding to B or a wider texture?
Thanks! My current theory is that the time value is just a really high number. If I take the UV coordinates and just add a really high constant value (99999) to them and use that to sample a texture, I get the same type of issues. Adding a period to the time forces it to not go above the given length, so the number never gets too high. But it also has the side effect of causing the pop/reset.
If that were true would you not always see precision errors with Time, when it's just added to the UVs is still goes to very high numbers? If it is causing issues can you not just frac between the animation maths and the texture uv input? that should keep the input between 0-1 without changing any of the visuals
@@BenCloward yeah its an odd bug - i tried to repro the exact same setup with the thin texture and everything the same and it works fine... Might be a specific hardware issue maybe?
This is perfect! Just one thing: the music in the video makes it harder for me to focus and becomes very repetitive fast. Maybe try to pick something ambient that has less distincitve repeating patterns in it? Choose a different texture, this one tiles too much :D
Sorry to bug ya Ben but the texture link is coming up with an error saying "Cannot display image icon cause it contains errors". I went to your site and browsed around very nice site btw, but I couldn't find them in your resources yet or a way to get these newly added textures without a link.
It's working for me - so I know that the file is in the right place and that the link is correct. Maybe try right clicking on the link and selecting "save as..." instead of left-clicking on it?
@@BenCloward ya its wierd the link is dead for ep 15 / 17 for me the rest seemed fine. Saving the link as does work though so it dont matter. Funny thing is I already tried that but in my file explorer the .tga showed as all white so I dismissed it as not the right texture, but after you suggested it I dragged it into the engine and it is indeed the right thing thank you very much Ill get back to work :)
Hi Ben! I was wondering, how would you make it work with an animated character? Using Absolute World Space makes it that when the character move with animation, the drip will shift on the skin. I'm using the local space coord, but since the local space of the character is not changing with animation, it still shifts when the character rotates his head for example.
@@BenCloward Thank you for his quick response ! That make sence, but re doing all the UV's for all characters + texture just for drips will take too much time. :/ I guess using drips on character is not the best idea. :P
@@TraftyOG It's not as hard as you make it sound. If you've built your shaders using material functions, you can just duplicate each function and make a character version of it that uses UVs instead of world position. This is how we handled it on my last project and it worked great. You don't need to change the UVs on the character. Just use the existing UVs to apply the drops.
@@BenCloward @Ben Cloward The issue I had was that by using TexCoord, we had to have the UV's in the same direction. So for one of our armor, we had the belt facing up in the UV's and the drips were going left to right in the viewport. But looks like if I use Pre-Skined Local Position it work perfectly !! Maybe it's just me that were not understanding correctly, but yeah Pre-skined Position does what I want in my case !
@@TraftyOG Can you explain the nodes better that worked, and/or post a link to a pic/Imgur, or BlueprintUE? Thanks. I have a modular character which means a nightmare with 100 different Materials (skin, hair, cloth, metal). So I need to know how to make any Material that gets applied to SK character body or SK character armor, belt, shoes - syncs the direction of the drips.
Thanks for the tutorial. I was messing around with this and found a cool effect by combining this with your rain drop tutorial. I wanted to keep the static drops on the side instead of just the top and found a way to make the static drops disappear when the steaks run over them, it looks really good on the sides but the issue I'm having is that the drips run across the top as well instead of just the sides. If anyone is interested in how I did it just reply and maybe someone can help me get it fixed to where the streaks only appear on the sides
The files are in TGA format, so you have to right click on the link and choose "Save Target As..." and then choose a location to save it. If that's not working, try using the Chrome browser.
Hi Ben, new to your channel. Love the content. With the normal map creation, why multiply by 2 and subtract 1? Is that to increase the intensity? Also, you could derive the Z, but I assume the cost of the computation isn't worth it for this small effect? When would you use derive Z, if at all? Thanks for sharing your knowledge! :)
Tzur Hoch Normal vectors are data where each component of the vector is in the range of -1 to 1. But texture maps store data in the range of 0 to 1, so multiplying by 2 and subtracting 1 takes a range of 0-1 and expands it to -1 to 1. Normally with a normal map, the engine does this for you, but since I’m storing other things in the map in addition to the normal data I did not set it to be a normal map texture. So that means I have to do the range expansion myself. You’re correct about the Z. Using a value of 1 is a cheaper approximation. You would want to derive it in cases where you wanted more accuracy/quality. But in this case on these small drips, it doesn’t matter. Thanks for your questions!
Hey guys, I tried downloaded the texture by saving link, just like I did for the last videos. But when I save these links, they're saved as ".ico" instead of ".tga" what can I do to save them as tga?
@@BenCloward I had this issue using firefox, but as you suggested I opened chrome and I was able to download. Firefox was fine on the previous tutorial video downloads so I'm not sure why it's happening. Also, thank you a million times over for these tutorials! I have never done any sort of vfx work before so this whole world is brand new to me as of about 3 weeks ago. Your videos have been a godsend for adding that extra level of realism.
Great tutorial. It works well though my only issue is that I'm still seeing a few drips at the tops of objects. I did reverse engineer the textures so I'm wondering if it has anything to do with the 4x512 drip. Also some my drops stop halfway at the drip line and then keep going.
@@echunouchi I used to make "how to fix" tutorials based on situations like this one but the peak interest is pretty low. If I find a solution I'll link it here.
had the same problem . the fix is to make the texture tileable vertically i know this was a year ago XD . so leaving this for anyone else still trying this
@@cleoali9271 Thanks for the reply. I'll try that out. Honestly I didn't know that was a thing. Do I need to change a setting in unreal or my image editor?
@@indieartsmidwest4042 in image editor . you remade the texture right ? didnt use the one he provided . there should be some tuts in here on how to make a texture tileable . but in this case you only want it to tile vertically .
If you look at the description for episode 18, I've linked a screen shot there that show what the material function looks like: th-cam.com/video/tUemJLSaFxw/w-d-xo.html
There still some bars flashing on the top of the cube. I found it is the problem of my Normal node. I add a multiply from VertexNormal to my normal node and I finally solved it. (Sorry for my bad English)
I didn't show the solution for up-facing surfaces in this video because I go over it in a later video when I put the drips on the side together with the drops on the top.
I discovered later that the issue was happening because I had a small amount of dithered noise in my texture. Making the texture from solid shades instead of dithered fixed the issue and after that I was able to just use a time node instead of a time node with a period.
I like these tutorials. They give me a sense of how things work and are made. But, since I didn't study anything related, there are a lot of things I don't understand. For example, creating a normal map with just 2 channels by multiplying them by 2 and substracting 1, then adding the third channel. My guess would be that the normal map is not accurate but to be honest I have no idea. Where could I learn about stuff like this? I mean the theory and, how much math would I need to learn first?
That's a good question. Thanks for asking! These are the kinds of things that nobody teaches. So you either do lots of experimentation and figure them out yourself, or you find someone who's willing to share. I'm willing to help - so ask all the specific questions you'd like and I'll do my best. I'll share a secret with you. I took no math in college at all. Don't tell anyone! I've learned this by doing it and studying what other people are doing. With regards to the accuracy of the normal map on the drips, in this case fast performance is more important than perfect accuracy - so what we're doing is an approximation. It's not as accurate, but it runs faster and uses fewer texture samples and less texture memory. And since it's just for some drips on the wall, the accuracy isn't a big deal.
@BenCloward that's what I thought it might be.. I had a few as pets as a kid. But thought maybe the rain brought out a salamander.. Awesome videos btw. Super helpful. I've been really good with the coding side of things, but the visual side was never my strong suite, these videos have been super helpful!
I just added a new note in the description that explains how to get them because a lot of people have been running into this. Let me know if those instructions work for you.
@@BenCloward thanx for u but the link dont work for me plz check it for me or can u sand me all the texture used in the full projects in my email!!!!!plz I need it
10:05 What is use of 1st lerp because you have not plugged the output node ?
Hi Ben, Thank you for the great tutorial video! A little bit of feedback from me, who is using Unreal 4.62 from 2021, the time precision problem that you mentioned in this video at around 22:00 no longer exists in my version of Unreal engine.
A solution to the time node problem:
Ensure that everything time related is a power of 2. Make your time period 4 or 8 seconds. 32 instead of 30.
Importantly, your vector2 values need to also be power2 divisible. So instead of 0.2 and 0.7, try 2 and 4. You may need to multiply time to slow this down as a result, but this should stop the skipping.
The multiplied values need to be able to complete full cycles within a given time loop.
your tutorials are easily some of my absolute favorites, I dropped out of art school years ago (game dev student) and i've already learned more from your videos than i ever learned in school, thank you so much for taking the time to make them and explain everything so in depth, you are an amazing teacher, thank you!!
You have no idea how helpful this was
Hi Mr. Cloward, reason for noise on drips is not in Unreal Engine but in Photoshop. In Photoshop if you use bucket tool in certain settings to fill time lanes of your mask those artifacts happen, using bucket tool with, 0 tolerance, no anti-alias settings fixes the problem considerably and using square brush in pencil mode to cover/paint mask lanes fixes the problem completely in all possible speeds and calculations.
I'm learning everything shader related from you by the way so thank you very much for these lessons.
Yes - thank you very much for pointing this out. I also discovered that I had dither noise in some of my source textures and applied a fix for the version that is available for download.
Thanks so much ben youre really doing an amazing service demystifying and helping us make optimized shaders. Im loving learning from your channel every day
Thanks for showing how you created the textures as well... I was wondering about it in the water drop effect! Thank you so much!
Thanks for your tutorials they are really helping me. at 21 min you talk about that sandpaper effect with time. well i am running version 4.26.1 and well I do not have that problem any more, could it be a bug. i had the same problem a couple of totorials back with the flip book tutorial where i turend off Period or the animation would constantly reset. like you have here but it worked just fine without the period in each instance.
I think the noise you talk about around 21:00 is "fixed"/minimised in UE5 (Using commit 6e4ead0 from branch 5.0). In fact, I was so worried at first when I saw it was different that I went through the vid node by node several times. I'm not sure what the difference is, however.
I haven't done anything to the .tga's. Default compression on both works. Had originally used the mask compression on the rain_drip_mask.tga, also worked fine. Period on timer didn't change anything either.
22:06 I'm guessing that the noise stuff was fixed by 4.27, because i don't have that.
This is my favorite video yet - starting to click for me how manipulating projections and masks can combine to create different effects. I haven't quite figured out why we need to minus 2 and add 1 when creating a normal map... I'm sure that will make sense at some point.. 🌧
Funny... this is explained in the next video. It's because we're swapping this info from color data into vector normal data and expanding the vector/normal range from 0->1, to, -1->1. Thanks!
🥰很好的教程,作者在评论区也认真回答了所有问题,真的很好,作者是上帝
@Ben Cloward
It seems that the first lerp that we should be taking the RB component from is actually never used my friend. Also I looked into the alpha channel noise issue which is causing the dithering problem you solved with period 5 time node. it seems that it is caused by directly copy a png format tempo map into a .tif alpha channel in photoshop. The only solution is to magic wand tool(has to be 0 tolerance else filling it will introduce more noises around the edge of each region, which will cause the clearly visible seamlines between region seen on the cube at 22:12) each temporal offset region in the alpha channel and refill them with solid color manually. Either way it is confirmed to be a photoshop format inporting issue.
One question is that I am really confused about what's the point of the UV wrapping we are doing at the start with the packed texture. Is it possible for you to make a tutorial in the future explaning simliar UV wrapping techniques in detail my friend?
(Edit: to keep the desired noise effect you were talking about at 21:22 use a noise node, clamp it between 0 and 1, and then lerp the noise free tempo offset with the noise using a really small number say 0.00002. increasing it too much will freeze the animation however)
You're right - I can see that I never connected the Mask Component (RB) node to the lerp as I should have. It appears that I did correct the issue later when I converted the graph to a Material Function.
Thank you for the tip about the dithering! I have fixed that problem in the version of the texture that's available in the video description. With that version, you should be able to use a time node with no period.
Instead of using UV coordinates, we're projecting the texture on to the model in world space. The reason we do this is because we want the drips to always flow from top to bottom regardless of how the model is rotated. If I were to use standard UV coordinates, the drips would be "stuck" to the surface and would flow sideways if I rotated the model 90 degrees. So all of the setup that I do between 4:00 and 12:30 is to project the texture in world space from the front and the side.
@@BenCloward Ah so basically we are trying to map the 4 side faces of the cube's actual world position into its UV cordinate! The only thing I don't quite understand is the second part, after we scale the absolute world position, why are we doing a lerp between the two sets of cordinate based on the positive direction of X and Y axis? I tried playing around with removing this lerp and didn't really observe anything noticeable when moving the cube around in the scene T_T Are we blending them so that the front and back of the texture isn't exactly the same? And the purpose of why we are doing that is to create as much of a visual variance as possible with only 1 texture sample? Thanks master Ben!
Can't wait to try this stuff out! Awesome video
3:37 How do I project the Drips in Local Space (the SK Mesh's location) instead of Absolute World Space?
Problem: when the final Drip Mat is applied to my SK character, and he jumps around in the level, the Drips move to the side (scroll off Left-Right) = not realistic. Drips should be anchored to the SK mesh (Local Space or whatever it's called), wherever they spawned, and only Drip down, until the life expires.
If SK character moves in the World, then Drip should stay with the character and remain in the same Local space. (Only a 5% world shift would look realistic, e.g. if "wind" was blowing the Drip line as the player moved Left-Right.)
In the Drip function, I tried many nodes, anything that said Local. But it does not work. Please help. Ty
Edit. I see I asked this question 4 months ago, in someone else's comment who asked. They didnt answer me.
Guy said: it's hard to use UVs because different character meshes.
(I have the same issue. I have complex Full body UVs. Then half body UVs, each different for different armor pieces. Then I have non-skin body Texture UVs, like gloves. I would need the Function to make all the Drips move down in Character space.)
Ben said: It's not as hard as you make it sound. If you've built your shaders using material functions, you can just duplicate each function and make a character version of it that uses UVs instead of world position. This is how we handled it on my last project and it worked great. You don't need to change the UVs on the character. Just use the existing UVs to apply the drops.
Guy said: The issue I had was that by using TexCoord, we had to have the UV's in the same direction. So for one of our armor, we had the belt facing up in the UV's and the drips were going left to right in the viewport. But looks like if I use Pre-Skined Local Position it work perfectly !! Maybe it's just me that were not understanding correctly, but yeah Pre-skined Position does what I want in my case !
I said: Can you explain the nodes better (like Pre-Skined Local Position) and post an image? No answer. Please help.
Hi ben. Great tutorial. I just wanna add that for the offset mask, you might want to use ddx and ddy to smooth out that tiny stripes caused by mip 🎉
Hi Ben, I just discovered your tutorials a couple days ago and I really love them. You teach some very valuable things. Thankyou so much.
PS: When using absolute world position, if you use divide instead of multiply, you can put directly the scale you wish in centimeters.
That's a great tip, Nicolas. Thanks a lot!
I already know how to create a bunch of complicated shaders in UE4, so what I'm doing here? Oh I know! I should reconfirm all the basics of shaders that I learned hardly with this soft and easy essential course from a veteran ^^
Hello @Ben Cloward, your material 101 series are mind blowing, each episode makes my brain melt, i got to this video, and i realized i don't understand how you come up with your workflow,
i got the role of each node, but i wanna know how do you figure out the process to write all these materials and shaders ?
i'd appreciate if you could suggest resources (books / course) to learn ? i hope you can help me, thank again for the tutorials.
Hi, I think this is an experience and an understanding of approaches. Truth be told , I also think so: how he combines those simple nodes into such algorithms. He uses textures virtuously!
Hi @Ben Cloward ! Thank you so much for the tutorial. I've got inspired by it to make something similiar in Unity and I faced the same artifact issues with higher values of time. I fixed that (or at least made that much better) when I changed my texture from 8 to 16 bits/channel, since it's a precision issue. Give it a try. I hope it can help. Keep up the great job.
Thank you for the suggestion!
I'm having a little problem with this setup. I'm doing it in Unity and using object space instead of the world, and everything works fine, but on some models I have to rotate the effect 90 degrees because of the object orientation. Rotating the texture with the normals and mask in it works fine (I'm also rotating the normals back after rotating the texture UVs), but I can't seem to find a way to rotate this tiny 'scrolling' texture. After rotating it flow goes not only in the wrong direction, but also the scrolling effect goes backwards. So, I spent the whole day on this with no luck so far, so I would be grateful if somebody could point me to the right direction.
Thanks Ben! Do more of this, cant wait next chapter))
why is your cube always black black, mine is greyish
In UE 5.2, I use Substrate. When I tested Face mask direction 9:14, it was only affect front material. So Sir Ben, how to fix it ?
the second, how I put rain drip on top (Vector Z), I'm not really understand the face direction
Regarding the use of Perios for time. Im doint this in UE5 and I don´t have this issue. So it might just have been a bug that´s been corrected now.....
22:00 I think it was a problem of the engine, since there is no such problem in the UE5.
Yes, I spoke with one of my friends at Epic awhile back and he said it was an Unreal 4 bug that has since been fixed.
@@BenCloward Thank you for your response and for your videos, very good content to explore.
29:51 it is recommended to add the mask ( to remove de top ) also in the normal to avoid artifacts
Yes, definitely! In episode 18 where we combine the drip effect with the drops, this masking happens automatically because we're putting the drops on the top and the drips on the sides - but if you're just using this effect by itself, you should mask it.
@@BenCloward Hey, I did exactly like your tutorial and the results get pretty clear, no artifacts. I'm using UE 4.25.3 BTW.
22:00 I don't if is beacuse I'm using a more recent version of the engine, but right now I don't get any noise.
Hi Ben, I found that you forgot to wire an output of a lerp node at about 8:20. I dont know if you forgot it or do it on purpose. Is it has anything to do with the bug about the time node?
Yes, you're right. Nice job noticing that! The issue that I ran into later in the video was due to some very subtle dithered noise that was in my texture. I discovered it after I made the video, corrected the problem, and uploaded a fixed version - which is the one linked in the description. So you shouldn't run into that issue.
How would you actually make this softer though. The edges of the drips are very hard based on the Speed Lane mask.
I wonder if the normal of the strips still show up on the top and bottom in the end result? I see the roughness is controlled by the vertex normal part, but not the normal.
Time node issue is still present in UE 5.5 which really sucks because of that loop :(
I'm not seeing the time node issue in UE 5.5 on my end, but I've enabled a bunch of project settings that may help? Just to be thorough, here's everything I've changed from default settings.
-Enable Virtual Textures Support
-Use Hardware Ray Tracing when
-Ray Lighting Mode - Hit Lighting for Reflections
-Support Hardware Ray Tracing
-Clear Coat Enable Second Normal
The popping and pixelation issues that you ran into with your Time node seem to have been fixed in UE5.
Wow, this is amazing. In this episode my brain just gave an error but I need really experiment it, to understand why is it working LOL? )) Thank you very much.
Let me know if there are specific parts you need more help with. I know there were a couple of things that I didn’t explain very well.
@@BenCloward I would like to learn more about custom shading models in ue4, vertex shaders tricks like analytical effects and procedural animation are also welcome, thanks!
@@BenCloward Thank you. Right now I dont exactly now what part I didnt understand. It happens me all the time when I learn new thing. After experimenting I will know if there is any part that need more explanation or not. I will check it after 2 days when I will go home. Thank you again.
@@shyboy8291 Ok, I'll add those to my list. Thanks for the ideas!
Hi Ben ! Great tutorial as always! Is it possible to also add the Z mask using this method? Creating a tri-planar projection using only 1 sample instead of 3. I'm trying myself but I dont get a good result.
Can I make a particle by this material?
Where I can get how to make weather drips function..?tq
Boa noite parabéns pelo otimo tutorial, mas eu não consegui fazer suar aos 20:25 do video, apenas isso o resto deu certo, não sei o que deu de errado?
A textura original que usei para este tutorial tinha um ruído muito sutil - por isso, os resultados ficaram errados. Eu consertei isso na nova versão da textura que você tem - então não há mais esse problema. Portanto, os resultados que você está obtendo estão corretos.
Doesn't the normal here make a crease/intent instead of a bump? Is that intentional? or am I just wrong?
I have gone over several times to spot any differences or incorrect values..but even though the drip effect matches yours and comes down the sides..I am getting a texture streaking effect of the drips on the top as well..I am not sure what is effecting this. I think it was explained this is the purpose of the VertexNormalWS (mask B)...in any event I can't get the streaking to stop. I am using unreal version 4.23.1 for this
Hi Ben, thanks again for the tutorial. Going through your tutorials in more detail, the mask problem looks like a precision issue. I was able to get much better results without looping just by setting the texture compression to 'Masks', and even better results again when I disable mip maps. If you take an imprecise number and multiply by a large number (time), the results become less accurate. This leaves an open question. Use two textures, compressed as normal map/BC7 and Masks, or just one texture packed compressed as Masks? Cheers.
All of this is true. However, my specific issue in this video was caused by dithered noise in my source texture. Once I made the masks more uniform values, the results improved a lot. And yes, I store the textures as uncompressed.
@@BenCloward Thanks for your reply, and for your tutorials. I was using BC7 and was seeing significant distortion with the time node, until I adjusted the compression settings to masks. My guess is that the compression is adding value artifacts to the mask values. Cheers.
@@BenCloward Do you have a vid on when to set compression to Masks? I have Unity textures or channel packed textures, and people said it needs to be set to Masks. But I am unclear why/what it does. Mask Compression (sRGB off) enhances the crispness of certain channels? (Grayscale G,B, or colorized G,B)?
Also I hate changing Compression because I drop 20 texture sets in at a time. Id rather all my code/texture samplers use not Mask compression.
So if you have a vid that explains that - and when we absolutely need to set a Texture to Mask compression, and change its node (in Graph) to make it display correctly. Ty
@@kenalpha3 The default DXT1 compression is weighted for best results when using color. When you set it to masks, it weights each of the three channels the same instead of treating them as a color. This means the compression artifacts won't be as bad in the blue channel as they would with Default. You don't have to change it, but if you do, you'll get better results. It's really up to you if it's worth your time - but I would do it.
21:09 I get perfect clean result without any noise, no need to set a period in the Time node. Don't know why. Epic might have improved that behavior. I'm using 4.26.2.
It was the texture. I had some dither noise in the texture, but I have since fixed in the one available for download.
@@BenCloward Thanks for the answer, Ben.
I'm going to use this method for a condensation effect. It's and important item in my scene, so I'm getting it a bit further, with variable width and vertically tileable channels for the waterdrops.
Also adding some static round drops formation and experimenting with a massive 4K flipbook animation rendered with Blackmagig Fusion.
The ultimate condensation shader! LOL I can send you the Material when I finish, if you want.
Thanks for these awesome videos. Man, this is priceless. Thank you!
Great tutorial, how would you go change world position to texcoord ?. I've tried a few ways but keep breaking the function.
I've managed to adapt this to my needs but one side moves from left to right instead of down. Anyone have an idea why ?
I'm using UE 4.25 and seems like I'm not having the noise problem. Otherwise, I would try a panner node I guess. Thanks for your great tutorials! Been following and plz keep going! They're amzaing!
The noise problem was caused by very subtle dithering in my texture. I fixed it in the version that I linked in the description, so you won't get it.
@@BenCloward No wonder! Thank you for that. Really appreciate your tutorials!
Hi Ben, great tutorial! Would you like to share your import settings on the packed texture? I have a lot of troubles on compression and mip map settings. If I pack normal and masks together, it produces many artifects on both normal and mask data. Thank you very much.
I found out you gotta import his textures with UserInterface2D compression mode
Excusme Sir This Tutorial is amasing but i have no time can i access to this shader files to implant to my car paint shader ?
Hi @Ben Cloward...Thanks for this awesome tutorial. One Question though: While animating the drip I have noticed that you can just multiply the time node and the temporal offset and still achieve the same effect.....Am new to shaders and not sure if this is correct...Thanks
I began to watch the tutorials from the very start, and I am absolutely addicted to them! The best on TH-cam! Thank you so much! I am totally new to shaders, so please could you explain better why you need to multiply by 2 and extract 1 to get the map from the texture? And also, do you always need to pack masks like this or you can use them as separate texture though it would be more expensive for performance?
Normal vectors are in the -1 to 1 range. But when we store them in textures, we compress that range to 0-1 (because textures can’t store negative values). Usually, if you tell the engine that a texture is a normal map, it uncompresses the range for you under the hood. But since our texture has normal data as well as other data together, we can’t tell the engine that it’s a normal map. That means we have to do the range adjustment manually. Starting with a range of 0-1, if we multiply it by 2, then we have a range of 0-2. Then we subtract 1 and we get a range of -1 to 1 which is what we need. I hope that makes sense. And no, you don’t always need to pack things up this way. It’s just a method for making the shader run faster.
@@BenCloward oh, that’s super clear now! Thank you again so much for your tutorials, they are all top quality and I am watching the entire series. Could you please tell me if you could do 1to1 sessions as tutor when I start developing my indie game? To watch the progress and advise on optimization, lighting, textures etc? It will be story driven action adventure game, I want to make the first prototype level as good as possible to be able then to show it and find a team or crowdfunding. And it will need very realistic looking and beautiful scenes, so your tutoring would be so valuable! If you can do 1to1 sessions, please send me email to singularity3100@gmail.com
My drips are still appearing on the top of the cube surface, and are looking closer to artifacts. I'm using UE 5.4, and I followed the video to a T. Not sure what is going wrong.
Edit: After spending two days trying to fix it I almost immediately find the solution after posting this comment.
In the video you multiply the drip texture by the R component from SplitComponents and use that product to multiply it by the normal mask. This doesn't account for the work done with the VertexNormalWS to exclude the top from being "dripped" on. Instead I multiplied the normal mask by the product of the previously mentioned product and the saturated VertexNormalWS mask.
Try going on to the next video. I think I might show how to blend between these drips and the drops in one of the videos after this one.
@BenCloward You do in the complete rain shader vid, but that is where I was seeing the drip artifacts very clearly. I came back here to see if I could find a solution
Awesome work, Nicholas. I was having the same issue with the normals not being included with the z-mask.
Amazing!
Thanks for sharing.
How to apply it on a glass material for example?
Hi Ben,
Your problem with the time period causing grainyness seems to be fixed in 4.25.
The issue was caused by dithering in the texture. I fixed it before uploading - so if you’re using the texture from the description, you won’t get it.
@@BenCloward ah gotcha, thanks.
@@BenCloward Speaking of using the Textures from the links, it says it can't display the website because of errors. I tried searching your site and all I could find was a link to these videos. Any help would be much appreciated. Thanks in advance for that and also for the vids! I'm following along and so far it looks great.
@@xantishayde-walker4593 Did you try right clicking on the link and selecting "save link as..."
@@BenCloward Yup, I found that out *after* I left the comment. Lol! I saw someone else's comment and did a palm-to-face. Got it going now. Just got done with the Rain Ripples Shader video, gonna take a break before the Rain Puddles one though. All this pausing the video and copying the functions you made is really tiring. ;)
Anyway, thanks again for the videos! Keep on being awesome, Ben. d :) b
Hi Ben, thx for this tutorial! I would like to ask you if instead of using z-component of the normal vector, is a better way do the dot product with the "UP Vector" and the normal itself in order to get rid of the top drip?
The UP vector is 0,0,1 - so if you do a dot product with that and the normal, the zeros in the X and Y positions of the up vector kill the contribution from the X and Y in the normal and what are you left with? Just the Z of the normal. So using just the Z component of the normal is a cheaper shortcut to getting the same result as if you had done the dot product with the up vecctor and the normal.
@@BenCloward Maybe i don't get it. The dot product return a float between -1 and 1, so i could use that to lerp where i want the drips and where not. Is it correct?
@@agtechart That is correct - yes. And taking the Z component of the normal will also give you that same float between -1 to 1, but you get it for free without needing to do the dot product operation.
Ben Cloward oh okok, now I get it! Many Thanks!
Hey Ben, thank you for this great tutorial. i have a question is that possible to make the drips slow over time? start quick and slow over time?
thank you 😊
The drips are set up to be applied to any size object - so the effect is tiling and each drip just continues on forever in its track. If they slowed over time then individual drips would come to a stop. Then you'd have to get them started again somehow - and there would be a pop. I'm not very clear on how that could work. So the short answer is yes, but I think you'd end up with side effects that wouldn't look good.
Awesome man! Thanks a lot!
Sorry don't wanna bother you, i didn't see in the video when you open your drips texture on Unreal, so i have no clue of your compression settings. Did i miss it?
It's set to UserInterface2D (RGBA) - which means it's uncompressed. But since it's only 256x256, it's small enough in memory anyway.
@@BenCloward thankyou
I tried this on a character sadly I have some drops going up and down. I hijacked a bit to have drops always going down no matter my the uvs on my character this comes close but is not the solution for me. Still great tutorial!
Your tutorials are really good, structured, and educational. And that even though my mother tongue is German. Unfortunately, the links to the textures do not work.
Great tutorial, but how can i add this to a character?
I'm not sure the error you're seeing is from the precision of the Time node is it? otherwise you'd also see that sort of error when you're just using the Time node and not trying to multiply to get different speeds. I tried replicating this setup and wasnt able to reproduce the error.
I think the error might be because you're adding to both the U and V (or in your case world R and world B) components - i think you should only be affecting the vertical component, although the texture is uniform across so it shouldnt really make a difference. Maybe because you're using such a small texture?
It does look like a precision error and it's strange the the period time makes the error better but i dont think it's the time's fault - maybe try just adding to B or a wider texture?
Thanks! My current theory is that the time value is just a really high number. If I take the UV coordinates and just add a really high constant value (99999) to them and use that to sample a texture, I get the same type of issues. Adding a period to the time forces it to not go above the given length, so the number never gets too high. But it also has the side effect of causing the pop/reset.
If that were true would you not always see precision errors with Time, when it's just added to the UVs is still goes to very high numbers?
If it is causing issues can you not just frac between the animation maths and the texture uv input? that should keep the input between 0-1 without changing any of the visuals
I tried adding a frac just before the texture sample. I thought that would work as well but it didn’t change the result. Strange.
@@BenCloward yeah its an odd bug - i tried to repro the exact same setup with the thin texture and everything the same and it works fine... Might be a specific hardware issue maybe?
Ah, we’ll it’s good to hear that you don’t have the issue. Hardware issue is likely, yeah. I have a GeForce 970. What are you running?
Could this be used to create a material for a planet? If not, would you please do a quick tutorial and show us how to do it?
This is perfect!
Just one thing: the music in the video makes it harder for me to focus and becomes very repetitive fast. Maybe try to pick something ambient that has less distincitve repeating patterns in it? Choose a different texture, this one tiles too much :D
I appreciate the feedback. Hopefully I've gotten a bit better in my more recent videos.
Sorry to bug ya Ben but the texture link is coming up with an error saying "Cannot display image icon cause it contains errors". I went to your site and browsed around very nice site btw, but I couldn't find them in your resources yet or a way to get these newly added textures without a link.
It's working for me - so I know that the file is in the right place and that the link is correct. Maybe try right clicking on the link and selecting "save as..." instead of left-clicking on it?
@@BenCloward ya its wierd the link is dead for ep 15 / 17 for me the rest seemed fine. Saving the link as does work though so it dont matter. Funny thing is I already tried that but in my file explorer the .tga showed as all white so I dismissed it as not the right texture, but after you suggested it I dragged it into the engine and it is indeed the right thing thank you very much Ill get back to work :)
Hi Ben! I was wondering, how would you make it work with an animated character? Using Absolute World Space makes it that when the character move with animation, the drip will shift on the skin. I'm using the local space coord, but since the local space of the character is not changing with animation, it still shifts when the character rotates his head for example.
For characters, you need to use UVs instead and scale them appropriately.
@@BenCloward Thank you for his quick response ! That make sence, but re doing all the UV's for all characters + texture just for drips will take too much time. :/ I guess using drips on character is not the best idea. :P
@@TraftyOG It's not as hard as you make it sound. If you've built your shaders using material functions, you can just duplicate each function and make a character version of it that uses UVs instead of world position. This is how we handled it on my last project and it worked great. You don't need to change the UVs on the character. Just use the existing UVs to apply the drops.
@@BenCloward @Ben Cloward The issue I had was that by using TexCoord, we had to have the UV's in the same direction. So for one of our armor, we had the belt facing up in the UV's and the drips were going left to right in the viewport. But looks like if I use Pre-Skined Local Position it work perfectly !! Maybe it's just me that were not understanding correctly, but yeah Pre-skined Position does what I want in my case !
@@TraftyOG Can you explain the nodes better that worked, and/or post a link to a pic/Imgur, or BlueprintUE? Thanks.
I have a modular character which means a nightmare with 100 different Materials (skin, hair, cloth, metal). So I need to know how to make any Material that gets applied to SK character body or SK character armor, belt, shoes - syncs the direction of the drips.
Thanks for the tutorial. I was messing around with this and found a cool effect by combining this with your rain drop tutorial. I wanted to keep the static drops on the side instead of just the top and found a way to make the static drops disappear when the steaks run over them, it looks really good on the sides but the issue I'm having is that the drips run across the top as well instead of just the sides. If anyone is interested in how I did it just reply and maybe someone can help me get it fixed to where the streaks only appear on the sides
do you have new links for the textures? they're not working for some reason
The files are in TGA format, so you have to right click on the link and choose "Save Target As..." and then choose a location to save it. If that's not working, try using the Chrome browser.
@@BenCloward thank you good sir you are the awesomeness
This is Magic!
Hey Ben, thank you for the great tutorials! would it be possible to update links to textures? would be a great help while following along :) Thanks
Just worked out I have to click save link as! :)
What if I wanted to use this on a skeletal mesh? Using world positions prevents the drips from moving "with" the character
In that case, you can either use object space or UV space instead.
@@BenCloward Thanks :) Guess I am still missing some of the basics. Which node would I have to use to feed in my meshs UVs?
He got a drip.
Hi Ben, new to your channel. Love the content.
With the normal map creation, why multiply by 2 and subtract 1? Is that to increase the intensity? Also, you could derive the Z, but I assume the cost of the computation isn't worth it for this small effect? When would you use derive Z, if at all?
Thanks for sharing your knowledge! :)
Tzur Hoch Normal vectors are data where each component of the vector is in the range of -1 to 1. But texture maps store data in the range of 0 to 1, so multiplying by 2 and subtracting 1 takes a range of 0-1 and expands it to -1 to 1. Normally with a normal map, the engine does this for you, but since I’m storing other things in the map in addition to the normal data I did not set it to be a normal map texture. So that means I have to do the range expansion myself. You’re correct about the Z. Using a value of 1 is a cheaper approximation. You would want to derive it in cases where you wanted more accuracy/quality. But in this case on these small drips, it doesn’t matter. Thanks for your questions!
Hey guys, I tried downloaded the texture by saving link, just like I did for the last videos. But when I save these links, they're saved as ".ico" instead of ".tga" what can I do to save them as tga?
If you're using Firefox, use Chrome instead. Right-click and select "Save link as..."
i can't download textures for this project :(
Hmm, I'm able to download them without issue. What happens when you try? What web browser are you using? Does it work if you trying another browser?
@@BenCloward I had this issue using firefox, but as you suggested I opened chrome and I was able to download. Firefox was fine on the previous tutorial video downloads so I'm not sure why it's happening.
Also, thank you a million times over for these tutorials! I have never done any sort of vfx work before so this whole world is brand new to me as of about 3 weeks ago. Your videos have been a godsend for adding that extra level of realism.
Great tutorial. It works well though my only issue is that I'm still seeing a few drips at the tops of objects. I did reverse engineer the textures so I'm wondering if it has anything to do with the 4x512 drip. Also some my drops stop halfway at the drip line and then keep going.
So do I, problem is I made a mask to prevent it on squared objects but then rounded only get drips from their lower half then
@@echunouchi I used to make "how to fix" tutorials based on situations like this one but the peak interest is pretty low. If I find a solution I'll link it here.
had the same problem . the fix is to make the texture tileable vertically
i know this was a year ago XD . so leaving this for anyone else still trying this
@@cleoali9271 Thanks for the reply. I'll try that out. Honestly I didn't know that was a thing. Do I need to change a setting in unreal or my image editor?
@@indieartsmidwest4042 in image editor . you remade the texture right ? didnt use the one he provided .
there should be some tuts in here on how to make a texture tileable . but in this case you only want it to tile vertically .
that was perfect
How to make material function of this material 😅😢
If you look at the description for episode 18, I've linked a screen shot there that show what the material function looks like: th-cam.com/video/tUemJLSaFxw/w-d-xo.html
@@BenCloward Thanks 🙏 found it much appreciated 😀
There still some bars flashing on the top of the cube. I found it is the problem of my Normal node. I add a multiply from VertexNormal to my normal node and I finally solved it. (Sorry for my bad English)
I didn't show the solution for up-facing surfaces in this video because I go over it in a later video when I put the drips on the side together with the drops on the top.
Hello,is that possible to fix issue with time node and periods ?
I discovered later that the issue was happening because I had a small amount of dithered noise in my texture. Making the texture from solid shades instead of dithered fixed the issue and after that I was able to just use a time node instead of a time node with a period.
very usefull ~ your hlsl also very usefull thanks alot!
BY THE WAY: After multiplying the two masks,we need to deliver the result to 'Normal' part, or there'll still be strange on top.
(THANK YOU BEN!!!!!!)
I'm pretty sure I show how to do that in a future video when I talk about blending between the drops on the top and the drips on the sides.
@@BenCloward ❤
I like these tutorials. They give me a sense of how things work and are made. But, since I didn't study anything related, there are a lot of things I don't understand. For example, creating a normal map with just 2 channels by multiplying them by 2 and substracting 1, then adding the third channel. My guess would be that the normal map is not accurate but to be honest I have no idea. Where could I learn about stuff like this? I mean the theory and, how much math would I need to learn first?
That's a good question. Thanks for asking! These are the kinds of things that nobody teaches. So you either do lots of experimentation and figure them out yourself, or you find someone who's willing to share. I'm willing to help - so ask all the specific questions you'd like and I'll do my best. I'll share a secret with you. I took no math in college at all. Don't tell anyone! I've learned this by doing it and studying what other people are doing.
With regards to the accuracy of the normal map on the drips, in this case fast performance is more important than perfect accuracy - so what we're doing is an approximation. It's not as accurate, but it runs faster and uses fewer texture samples and less texture memory. And since it's just for some drips on the wall, the accuracy isn't a big deal.
00:34 the lizard/salamander has me very distracted.
Hahah! It’s an Anole. We had a lot of those in Texas.
@BenCloward that's what I thought it might be.. I had a few as pets as a kid. But thought maybe the rain brought out a salamander..
Awesome videos btw. Super helpful. I've been really good with the coding side of things, but the visual side was never my strong suite, these videos have been super helpful!
plz Icant get the link of texture used in the project can I get a new link!!!!
I just added a new note in the description that explains how to get them because a lot of people have been running into this. Let me know if those instructions work for you.
@@BenCloward thanx for u but the link dont work for me plz check it for me or can u sand me all the texture used in the full projects in my email!!!!!plz I need it
What happens when you right click on the link and select save link as?
@@BenCloward the image bencloward.com/youtube/rain_drips.tga cannot be displayed because it contains errors this is the message
@@theJineffects What browser are you using?
Hey not sure if you knew but your links to assets contain errors.
Which assets and what are the errors?
Hmm seems to work on anything not firefox, but your other images from previous videos worked fine thanks again.
@@Psykhosis420 Same experience here, they dont work on firefox, but they do on chrome. Great Tutorials btw, thanks!!
THANK YOU THANK YOU THANK YOU
Name of the song please:)
It's at the bottom of the description.
You are my god!
Too bad the texture links no longer working.
It does work. Using Chrome, right click on it and select save target as…
3:31 use world coords instead of UV coords
Man this one was actually a bit difficult to follow. It didn't come out the same.
I'll have to re-watch it. Very cool though!
Yep - it's probably the most complex effect I've shown on my channel. Let me know if there's a part of it that I can explain in more detail.
@@BenCloward Will do man thank you so much!
about your noicy problem, Epic Game fix it in UE4.27.
The noise was caused by dithering in my texture. I fixed it in the version of the texture linked in the description.
Freek!! This looks like 10 years of trial and errors
12:38 animated mask
Worldspace porjection