Every time I think I've mastered the art of material work, something like this comes along and gives me a reality check. I was using a world-aligned texture as my wind mask, but it won't give the same amount of variations you've put into the procedural one.
Well, in all fairness, if I had to optimize this shader, probably the first thing I would do would be to use world aligned textures instead of completely procedural noises :D
@@VisualTechArt lol, yeah noise is pretty expensive. I'm curious however to see it in action with nanite now that we've got support for foliage, I feel the single blade approach is much more viable.
@@VisualTechArt Found out the hard way this method doesn't play nice with UE5's foliage paint system. It's okay though, as I believe I've learned a few new things.
@@VisualTechArt A few things, with the initial node structure, (before adding in any color or pbr properties) the values make the foliage mesh collapse into a single world axis and defom into a cylinder. After adding in the wind direction and variety they instead all collapse to a single straight line on what I believe is the world space X axis averaged to the center of all the foliage instances. This is in UE5.1 so not sure if the engine is handling anything differently. I narrowed down the problem to the implementation of the bend direction and the radius in the X and y vectors. The z vector on its own leaves the mesh in their current positions but just makes cork screw curls along the z axis.
I loved your explaination of the mathematic theory, it really helped me understand, creating procedural shaders is something I've been struggling to wrap my head around recently. This video is a great learning tool. Thanks ^^
This looks amazing. You are an artist and make it seem so easy. It was hard to follow, but a very entertaining experience. I will surely try to make something similar myself in my project
Hey! Just want to say thank you first, then also I'd like to provide you a solution to use this method with multiple strands in the same static mesh instead of individualy spawning the blades. I made my mesh of multiple strands between the -1 to 1 world space in Maya, then wrote a super small script in python that would encode the pivot per strand in R,G component between 0 and 1. In the blue, I'd encode the max bounding box of the strand and in vertex alpha channel a random float. Having the blue encoding the height, I don't need to manually type it in the shader, just sample the blue channel. In engine, I set up uniform import scale at 50 (since maya export is pretty tiny between -1 and 1). On the shader side, I just replaced the Object Position nodes you found in your tutorial by the following (writing it in pseudo code, but shouldnt be hard to read): xy_coords = ((vertex_color.rg - 0.5) * 2.0) xyz_coords = transformPosInstanceToAbsoluteWorldSpace((xy_coords.x, xy_coords.y, 0.0) * import_scale) The import scale needs to manually be set depending on how much you scaled the static mesh from the maya export. The small math in xy_coords is needed to bias scale the 0 to 1 coords to -1 to 1. After the, the mult from the import scale will make match the pivot positions in real world setting. The append of 0 is for having the strand roots at 0 initially (depending if it was in maya). Hopefully it makes sense, and again thank you so much for providing this great basis that helped me work my way through this!
Great job with that! It's definitely a working solution :D Really happy to see someone giving a go to bouild on top! May I suggest to use UVs instead of VertexColor? You might be able to get rid of needing manual scaling and range remapping altogether ;) Be sure to join my Discord if you haven't yet!
@@VisualTechArt hey! Thanks for returning back. You just had a great idea and it worked like a charm. Save few instructions and just did a top planar projection, scale to center point the top projection uvs then used it as pivot instead. GG!
How did you become so good with maths and shaders? If I want to learn anywhere close to you what would be the best way that I can achieve it. You are true genius!
i really love all your videos and the mathematical approach! :-) But to be honest, i allways miss the "shader complexity graph". Anyways, grazie mille!
Your video was interesting and I appreciate the time you've put into it. I zoned out a couple of times but I think I can understand the why more than the how. I've been trying to make a universal foliage (trees, bushes, flowers, weeds, grass, flotsam) bundle for all of my own game ideas going from blender into Godot or Source 2 (Sandbox). It's only been 5 months since I started and I don't think I'm any closer to getting it completed, just a whole bunch of false starts.
Level one: be able to connect nodes to create basic shaders in UE Level two: be able to follow simple shader tutorials Level three: be able to create your own simple shaders Level four: be able to follow your tutorials blindly as the math and logic is beyond comprehension Level five: be able to follow your IDEAS while blindly connecting the nodes Level six: be able to follow all your math and ideas, understanding exactly what are you doing. Connecting the nodes becomes irrelevant Level seven: be able to come up with similar ideas, prep the math and implement everything without following (your level) I'm at 4. Some day I hope to be at 7 lol
Perfect! This video was definitely worth the wait^^ Now the only thing missing is the wind flowing around or being occluded by objects. Distance field gradients should do the trick...
@@VisualTechArt That would be even better ;) The GDC God of War wind talk should be a nice inspiration^^ As a side product, we could use the render targets to create player interaction. We should consider implementing simulation for flow and occlusion, but also local wind effects (e.g. helicopters and fast moving objects).
@@QuakeProBro Ah yes! I kinda remember that talk, thanks for the tip :D I also already experimented with interaction by using Niagara + Render Targets, it was a lot of fun, I'll see what I can do ;)
@@VisualTechArt Oh yeah I love how versatile Niagara is! I‘ve also checked the new update of Fluid Ninja Live that came out I think yesterday, it includes a use case example scene with foliage and a local wind sim.
Yes, they did a change in the output of those nodes, at the time of recording this the ActorPosition node wasn't even introduced yet, if I remember correctly :)
Really curious about performance here. Also wondering if you had any solutions for how single blade grass gets handled by TAA. I know it's a notorious thing in Unreal with no perfect solution.
I've just taken another look for you now :D I'm on a 980ti (which is also half broken) and the scene runs at 30/40fps@1440p, but consider that at the moment I have the Directional Light set with 10 cascades (much better than what I showed in the video sadly). The grass has just the shader on and the only "optimization" active are LODs (4 levels). When I was recording I used some other optimizations to reach 60fps minimum to be able to use VSync :) I was thinking about a future video about optimizing this scene, there are a decent number of things that can be done. Regarding TAA... there's both some flickering and ghosting in the distance, of course :) But that's because I'm keeping single blades for way too far in the distance.
@@VisualTechArt Quick question: I just got to 36:26 when the normals should be done, however I'm getting some bad black flickering on patches of the blades. Any idea what I could have messed up there?
Argh, I got them too few times while I was building the shader, but it was popping in and out on single blades... If you go in the Normal Buffer and you see it there too, should mean you're setting a value of 0 there somehow. To be honest I don't remember exactly what I did to fix it (it was like 2 months ago) and at some point I didn't get it anymore xD Oh, if it's on patches maybe you forgot some VertexInterpolator node somewhere?
@@prestonschulz9359 Argh, I had that problem at some point too when I was developing the shader (like 2 months ago) and I don't remember exactly what I did to make it disappear. If you see it on cluster you may be forgetting some VertexInterpolato somewhere, I had it on single blades. Also, if you can see them go black in the World Normal Buffer may be because you're trying to normalize a 0 length vector or dividing somewhere a value by another value that somethimes equals to zero.
Awesome! But, i'm having this issue: when i work with the bend parameter, it bends only in the center of the leaf, and not a rounded movement like yours. And it stretches the mesh, making it larger. Could you help me please?
It's a bit hard from here... Is the pivot point at the base of the blade? Is Nanite disabled on the mesh? (You need to modify the shader a bit to make it work with it)
Thank you very much for your tutorial. 😘😘😘I completely reproduced it in version 5.3 according to your method, which is very good. The effect is exactly the same, and you really saved me. But there is a doubt: why does the 3D model finally become a 2D patch? I don't understand. It's good to use it to make grass. It's strange to apply it to trees😅
Since I wrote the shader for grass, I did some simplifications and assumed the 3D mesh is flat, probably :) So if you try it on trees it might flatten them
@user-cz1de3uy5l Have you made it work with 3D objects? I try to replicate the look of wind effect with a wheat field and at least for the models in front, I want them to be 3D. :)
Amazing stuff!! A lot high tech math stuff going here!! Thanks for sharing!! Could you give me some pointers on how to have it looking good on a top-down shooter game?
Well if you have top-down camera I'd say change the type of grass for something like clover ahahah Much better coverage than blade grass in that case. Other than that, it's up to you and your art direction :)
@@VisualTechArt man so easy hahah 🤣 guess I just needed a brake and breath after taking in all the info of your video. Thanks for the quick response and I'll be making some wider foliage like clovers and varens for this method..
This sooo awesome, thank you soo much, will you maybe make a video in future about how to optimize this ? like in with Ghost of Thushima methods ? i also saw on RUclips, someone using Niagra for this technique which delivers better performence apparently. if this is properly optimized then this makes one of the most feature packed and good looking grass ever. 😃
OMG THANK YOU SO MUCH FOR THIS! I hate the UE4 wind node more than anything I've ever hated in my entire life! I'd say if you use a grass clump mesh, you wouldn't have to worry about each blade being individual as grass tends to grow in clumps anyway and having a few dozen blades moving in the same direction at the same time likely won't look bad at all. Especially with how wonderful your wind animation is.
You can always store the grass blade pivot in the vertex color or in a texture. In most cases you don't actually need the pivot z position (because the start bending all on the same height) so I would: R+G = Grass Blade XY pivot location B = Grass Blade height If the grass rest position is straight like in this example you can most likely get away with just using the vertex position XY. And can also add some height, rotation Variation in the shader for example.
You can also achieve clumping inside of the shader with some noise. (That the grass tips clump together for example) But I think the math might get pretty complicated. An easy solution would actually be to find some nice normal map and use it for clumping (You just point the grass blades along the normal) for example a normal map with some peppples should be nice. Just imaging you had some pebbles inside of sand and then take them out. They would leave holes behind. When you now take a bunch of sticks and stuck them inside the sand in the direction of the surface the tips would "clump" together over the Center of the holes. Taking the pebbles out was inverting the normal map. And putting the sticks over the surface was sampling this normal map to rotate the grass blades.
Hey man, first migration works fine for 5.2. Now my issue, i try add a material parameter for the force and direction, force works well but direction flicks when timeline is updating the amount. Any tip for solve it? Also, i saw u plan to add a local force/derection based on sphere or cube, when if u update this for next level, who buy will receive the update? Ty for this amazing project!!
Yes direction needs a bit more care if you want to drive it from a BP :) Usually if I update a project I sell I tend to give it for free unless there's a major feature added, which in case you pay only an extra, not the full price
I am 7 months late, but I also have a suggestion that corresponds to what you're making here. GDC is called Procedural Grass in Ghost of Tsushima; it was quite informative and gave quite a few tips on performance boosting regarding this exact technique.
@@VisualTechArt sadly, I can't quite remember that part, what stuck out to me more was how LODs were handled on the blades of grass (and I watched it more for the wow factor than anything else 😅)
on the bright side, video was super easy to find again, so imma just put the link here of you are interested (even if it's for a later date) ruclips.net/video/Ibe1JBF5i5Y/видео.html
Amazing freaking content. I have learned so many things that I had to write them down. I have a question, the Z-scale finding trick does not work for me. I am placing my grass using the Grass node in the landscape material. The landscape grass type is set to scale the grass 3 to 4 times. However when I transform the 0,0,1 vector, it returns 0,0,1 (i visualized it with the debug nodes).
@@VisualTechArt Ah yes, that was it! I have one more questions if that's okay :D We're using the ObjectPosition node instead of the ObjectPivotPoint node. Isn't ObjectPosition supposed to return the center location of the object, which should ruin the gradients from bottom to top? Is that somehow different for instanced meshes?
No worries, for instanced meshes the Object Position node returns the pivot location, when used in the vertex shader, otherwise the cluster centre (if I remember correctly)
insane tutorial, only issue I am having is with lighting, when messing with the normals sometime the grass will appear too white when bending, Im experimenting with it right now but I dont really know how to fix this,. or even know if this is normal behavior.
Amazing ! but I have problem with grass density, its so small. do you know any procedural solution without using foliage tool where I need to hand-paint grass on my big landscape?
One thing that I've been planning to experiment with for a while now is to use Niagara to handle the grass, that way would be so much easier to also make it interactive :D You can try go that route!
Thank you for making this video. Such a great project! Beautiful and mathematical impressive. I had an issue which I notice other people talk about in the comments; "the cylinder effect" where the grass circulates around an axis into a barrel like cylinder. If I turn of Nanite, this disappears. I'm using 5.2. I don't know if you have found an solution to this?
I didn't look into this yet, but other people fixed it, I think they have changed which is the node that returns the pivot location of the instance, but I'm not sure, you can try ask in my Discord server and see if anyone replies... Or maybe someone wrote the solution here in other comments :D
I found it! Replace "Object Position" node with "ObjectPivotPoint" and plug into "Mesh Particle Pivot Location". But two things happen. The lower stem of the grass all align to y-axis causing them to disappear when looking down a grassy path along the y-axis. And fps dropped by 10 when using nanite haha, so I turned nanite of again.
I choose to turn nanite off since the fps was lower. And therfore I didn't solve the alignment issue either. I did it in 5.2. There is a discord where you can join.
How did you create the tesselated particle rectangle mesh and how did you connect it to the material ? I gues it is ued as a foliage and you did draw it on the landscape ?
I found out that it is just a simple mesh with this texture assigned and then foliaged on the landscape. Thank you a lot for this! I had an Issue with the shader and thought the mesh I am using is not correct or it is some kind of particles. Best D
How complicated would it be to allow this to work for a grass mesh with multiple blades? Your example scene has everything scaled up massive to get around the problem that LandscapeGrassType does not allow more than 1000 instances per 10 square metres, which means when using it at a normal world size, you have hardly any grass covering the land. My solution was to just create a mesh which covers the necessary space, but your wind setup of course forces the whole mesh, instead of each blade in the mesh.
That's the challenge I left for the viewer at the end of the video! I already solved that problem on my own, but happy to discuss about it :) Why don't you join my Discord server and brainstorm there?
The realism of this wind animation is truly impressive. However, I’m curious if it’s limited to individual grass meshes. I’m wondering if it’s possible to apply this to a grass clump from Megascans, especially when dealing with multiple clumps combined into a single mesh.
@@VisualTechArt I am not talking about the billboard. I am talking about the actual 3d mesh. With nanite we don't need billboards anymore.the link that mentioned above is for high quality 3d scanned grass. Image is just a thumbnail. Will this method work on compound mesh?
Is there a way to apply this for trees? Maybe, it's too complicated by there complexity? PivotPainter2 remain the best option? But hard to apply if you don't have 3DSmax to generate the PP2 Texture :(
I think it's possible to do something entirely procedural with few restrictions :D I may give it a go in the future actually. If you want to tackle the problem by yourself I'd say that you can start by applying this exact bend (not as strong) to the entire tree and then make a second layer of bend added on top for the branches ;)
@@VisualTechArt How would you approach a second layer of bend? Unless it's a species with a straight trunk, I'd say you might have to separate the branches into unique objects to access their pivot points. I'd also think you might have to manually align the z axis of the object to the branch length. I don't think this should be too difficult for a second layer, but more detailed trees might have 3-5 layers of unique branching so idk how to do something like that.
@@dylankuzmick3122 Well it depends heavily on the structure of the asset I would be working on. Let's say you have a pine with a very straight trunk and horizontal branches, you can easily break down the movement into 2 layers and apply them on top of each other (kind of in the same way I did in the video to make the grass blades point straight up before bending them) :)
I have a problem with the custom node: even if i write it in the same way return float2(-cos(a); sin(a)); i can't compile the shader, i get these errors [SM5] /Engine/Generated/Material.ush(2620,22): error X3000: syntax error: unexpected token ';' [SM5] /Engine/Generated/Material.ush(2620,30): error X3000: syntax error: unexpected token ')' [SM5] /Engine/Generated/Material.ush(2626,22): error X3000: syntax error: unexpected token ';' [SM5] /Engine/Generated/Material.ush(2626,30): error X3000: syntax error: unexpected token ')' Any idea? Thank you kindly.
Nice tutorial! my grass stretches vertically when you change the height parameter, and it doesn't look like yours, but I did everything the same as you, what could be the reason? And how can this be fixed? I need the grass not to stretch in length.
@@VisualTechArt yes, exactly like yours. Stretches during bending. Could this be because my terrain is up on the Z axis? I had to do this to avoid problems with water.
I believe the reason it doesn't work is because the grass might be Nanite Enabled. I got really weird effects similar to what you describe. Once I turned it back to normal Static Mesh it turned out like in the video. If there's a version of this tutorial but working with Nanite foliage it would be great. But as it stands it doesn't support it. Great tutorial though!
Wow! Now we just need a way to apply local wind forces! Would love to see a tutorial for that if you can figure out a way (or a point in the right direction to figure it out myself haha)
Hi! I am also interested in this. I want all my wind to point towards an actor. Imagine a small black hole that pulls things towards it. I’m trying to figure out how to accomplish this, studying videos like yours. I would be super grateful for a video on the subject.
I have an issue, I do exactly the same as you and it's not working, my grass appear under the ground, lmao. When I slide the value in the bend intensity, it moves as it should, but under the ground. I feel like there's something off about the height and the bend intensity but I can't find the problem, I tried to put a minus in front of some values but it doesn't work, please.
Oh well xD flip the world upside down and you're fine :) Maybe there is the default orientation of the mesh itself? Can't do much from here to help you :( But if you got the movement right there must be some stupid sign or something like that around
@@ansh9677 Oh, sorry for the late answer, I'm not sure but I think that I took a grass model that I already had, which had two planes stick with each one having two opposed directions. Obviously it is twice more demanding in terms of ressources but this is the only solution that I found.
True. I wander how big of a visual difference it would be to use the slerp with some dampening based on the distance from the root of the blade. And the difference in cost of your system and a slerp based one, even tho I would guess they are very close.
@@Lorenzo_3D I guess so... My bending function itself is not that expensive actually, has only simple operations and two trigonometric functions, while the slerp I believe is more trig and less operations in total. If you ever test it let me know how it goes and if it's visually good :D
May be because your pivot point is at the centre of the mesh, or because you're not looking at an instanced mesh and the Object Position node in that case returns the centre of the object :)
@@VisualTechArt i cant figure out how to adjust the pivot point. also, when i paint the grass using the foliage tool. the grass curves around a single cylinder. and grass further from whatever point is picked for the cylinder is streched and curved even more. i cant get it to effect each blade individually
I actually fixed the pivot point. but i am still having the problem with the foliage tool and every instance of the grass blade sharing one cylinder they all wrap around from both directions
same problem i pretty sure my pivot point is at the base, but for some reason when i add the material my grass start to become fat and big, why you just dont share the material, why we need to copy everything ... if someone have a solution my grass is making a C shape i try differents height but nothing to do
To be honest I don't see why it shouldn't work, but apparently some people tried to reimplement it by following the tutorial had few issues. So in the near future I'm gonna check it personally and eventually add the UE5 version directly on Gumroad :)
I did end up buying it and opening it in unreal 5.1, but it doesn't seem to be working correctly. All I see is the brown landscape mesh. I am pretty novice in Unreal also.
Because here the objective was to obtain an accurate bend of the mesh (aka consistent length, thickness, shape throughout the animation) and not something eyeballed to not look immediately wrong :D
I figured out that if you divide the radians by 4, then follow the rest of the logic of the expression by inputing the result of the division into a negative cosine into a Make Float 2 X input, and the result of the division into a sine then into the Make Float 2 Y, you get the same result as the custom expression. I guess this is because the CMOT Float 2 has a specific range defined so we need to remap the the angle a bit.
This is very cool, but I'd really love to see your take on a realistic grass wind animation that *also* cares about performance. especially when having grass with a lot of vertices, doing 700 instructions per vertex for wind like this is just too much.
While I agree with your comment, I think you would be surprised by how well this would be handled by modern GPUs :) Definitely going to add some optimisations to this in the future though
Foremost, THANK YOU for all the information, technique, and knowledge you have provided us. I was able to implement your solution successfully. As well, I was able to swap out the height-calculations for the ObjectRadius node since it can be responsive to instance/object scale. I DO have a question / request. I understand this is all free as in beer, so feel free to ignore, but...the normals. Is it possible to generate basic-detail on the blade of grass? I'm just-dangerous enough with just-a-little knowledge to know it can be done, but clueless enough to not-really be able to it directly - lol. Specifically, I was looking to marry techniques between your excellent work as well as this fellow: ruclips.net/video/YxE9yN9uOXU/видео.html He's running a breakdown on the techniques used for grasses in Ghost of Tsushima. It uses a bezier-curve which can flex fine, but doesn't preserve length like your implementation does. I love you both but in your camp here, the blade is so-long, it shouldn't get any longer or shorter. However, he does have a nifty way of generating normals that it makes a nice vein down the middle of the blade, with some slight/tunable curvature at the edges as well to really sell a 'curved' blade of grass. Both your solutions are excellent in their own ways, both VERY performant for the visuals. However, sans using a texture-map, is it possible to demonstrate how one might create a vein/normal-detail from your solution? Again, feel free to ignore me, but otherwise, much-appreciated on the teachings; keep 'em coming. :D
Hey :) cheers For the normals in the video I show how to compute the correct ones, once you have them (or whatever kind of normals you choose to go with) you can just add on top more details. For example through the Material Function BlendAngleCorrectedNormals and so on :)
Overall, I believe there is room for improvement in the tutorial. While the math solution provided works well within the specific setup you shared, it does not function correctly when applied to foliage or procedural materials. It seems to only work as intended for single mesh objects. I spent the last 8 hours meticulously reviewing and ensuring that my nodes match exactly, but despite that, the material breaks completely. This suggests that important information might have been omitted from the tutorial, making it challenging to achieve the desired results in these specific scenarios. The meshes should not spiral into circles and not be placed on the grounds or on the ground in single file... additionally the mesh is not suppose to scale disproportionately like it does for anyone following along. This is an advanced grass tutorial, but its not the best way to do things and charging 20 dollars for the answers on Gumroad is outrageous When the average person is only interested to see your approach more so than use in production as is. You blitz through the node setup on fast forward forcing uses to play at 0.25 speed which is not enjoyable... I found the math part interesting I was hoping to see it it all come together but alas something critical was clearly omitted from the tutorial....meaning its a giant waste of time
Thanks for the feedback, I'll try to be clearer next time. Wasn't expecting this since many people before you were able to make it work without problems :(
@@VisualTechArt loved the math part just want to say the way you explained things was great, I dont want to poop on your hard work... I appreciate you. I know how hard it is at times explaining complex topics. Out of the 10 wind and grass tutorials yours was the most exciting to learn it was unfortunate but thanks for everything either way
I believe someone already explained it in the comments, the main issue is the ObjecPosition node, which returns a different data with Nanite meshes, you have to change it with Instance Position or something like that, don't remember exactly now :)
I am so stupid that I don't understand what the matter is here how does this win the megaskan + their wind system? I do not understand the truth (it is from the stupidity of my own, and not from the fact that it is useless, no it is probably cool)
i need 2,000 leaves for the bush each leaf a separate object and with simulated physics and maximum natural wind I see in your work the kinship of my thought, but I do not understand at all how to implement my task
For shapes like bushes I think my system would need more work to adapt to their shape and different behaviour. This is not meant to be against some other systems (like megascan) is just a different thing :)
Just added it to my project. I really needed to fix the grass performance issue. Thank you for this.
wow!!! the mathematics behind video games, incredible simulation!! incredible and beautiful work and the result is exciting
Every time I think I've mastered the art of material work, something like this comes along and gives me a reality check. I was using a world-aligned texture as my wind mask, but it won't give the same amount of variations you've put into the procedural one.
Well, in all fairness, if I had to optimize this shader, probably the first thing I would do would be to use world aligned textures instead of completely procedural noises :D
@@VisualTechArt lol, yeah noise is pretty expensive. I'm curious however to see it in action with nanite now that we've got support for foliage, I feel the single blade approach is much more viable.
@@VisualTechArt Found out the hard way this method doesn't play nice with UE5's foliage paint system. It's okay though, as I believe I've learned a few new things.
What are the issues you encountered? :O
@@VisualTechArt A few things, with the initial node structure, (before adding in any color or pbr properties) the values make the foliage mesh collapse into a single world axis and defom into a cylinder.
After adding in the wind direction and variety they instead all collapse to a single straight line on what I believe is the world space X axis averaged to the center of all the foliage instances.
This is in UE5.1 so not sure if the engine is handling anything differently.
I narrowed down the problem to the implementation of the bend direction and the radius in the X and y vectors. The z vector on its own leaves the mesh in their current positions but just makes cork screw curls along the z axis.
Only recently discovered your channel. What a gold mine of useful information! Watched 100% of this video, understood about 50%, loved 150% 😂
Ahahah cheers :D
📣📣For those who experiencing an issue 📣📣 when your grass is lining up along an axis into one flat row - TURN OFF THE NINITE . ( UE 5.3 )
You just saved my life! Any idea about how to make it work with Nanite?
I loved your explaination of the mathematic theory, it really helped me understand, creating procedural shaders is something I've been struggling to wrap my head around recently. This video is a great learning tool.
Thanks ^^
This is fabulous! Although not sure i got my head around all the math, the premise looks great!
This looks amazing. You are an artist and make it seem so easy. It was hard to follow, but a very entertaining experience. I will surely try to make something similar myself in my project
looks super nice
Hey! Just want to say thank you first, then also I'd like to provide you a solution to use this method with multiple strands in the same static mesh instead of individualy spawning the blades. I made my mesh of multiple strands between the -1 to 1 world space in Maya, then wrote a super small script in python that would encode the pivot per strand in R,G component between 0 and 1. In the blue, I'd encode the max bounding box of the strand and in vertex alpha channel a random float. Having the blue encoding the height, I don't need to manually type it in the shader, just sample the blue channel. In engine, I set up uniform import scale at 50 (since maya export is pretty tiny between -1 and 1). On the shader side, I just replaced the Object Position nodes you found in your tutorial by the following (writing it in pseudo code, but shouldnt be hard to read):
xy_coords = ((vertex_color.rg - 0.5) * 2.0)
xyz_coords = transformPosInstanceToAbsoluteWorldSpace((xy_coords.x, xy_coords.y, 0.0) * import_scale)
The import scale needs to manually be set depending on how much you scaled the static mesh from the maya export. The small math in xy_coords is needed to bias scale the 0 to 1 coords to -1 to 1. After the, the mult from the import scale will make match the pivot positions in real world setting. The append of 0 is for having the strand roots at 0 initially (depending if it was in maya).
Hopefully it makes sense, and again thank you so much for providing this great basis that helped me work my way through this!
Great job with that! It's definitely a working solution :D
Really happy to see someone giving a go to bouild on top! May I suggest to use UVs instead of VertexColor? You might be able to get rid of needing manual scaling and range remapping altogether ;)
Be sure to join my Discord if you haven't yet!
@@VisualTechArt hey! Thanks for returning back. You just had a great idea and it worked like a charm. Save few instructions and just did a top planar projection, scale to center point the top projection uvs then used it as pivot instead. GG!
How did you become so good with maths and shaders? If I want to learn anywhere close to you what would be the best way that I can achieve it. You are true genius!
This is the best looking Unreal grass I've seen! Thanks a bunch!
Thanks mate!
I'm a simple man. I see technical art, I press like.
Amazing video.
Ahahahah cheers!
mesmerizing
i really love all your videos and the mathematical approach! :-) But to be honest, i allways miss the "shader complexity graph". Anyways, grazie mille!
Your video was interesting and I appreciate the time you've put into it.
I zoned out a couple of times but I think I can understand the why more than the how. I've been trying to make a universal foliage (trees, bushes, flowers, weeds, grass, flotsam) bundle for all of my own game ideas going from blender into Godot or Source 2 (Sandbox). It's only been 5 months since I started and I don't think I'm any closer to getting it completed, just a whole bunch of false starts.
Cool stuff 👏
Wow, this was a long video plenty of information. Also thank you for putting this on gumroad, very useful!
its such a great tutorial! It reminded me of grasses from Ghost of Tsushima.
Level one: be able to connect nodes to create basic shaders in UE
Level two: be able to follow simple shader tutorials
Level three: be able to create your own simple shaders
Level four: be able to follow your tutorials blindly as the math and logic is beyond comprehension
Level five: be able to follow your IDEAS while blindly connecting the nodes
Level six: be able to follow all your math and ideas, understanding exactly what are you doing. Connecting the nodes becomes irrelevant
Level seven: be able to come up with similar ideas, prep the math and implement everything without following (your level)
I'm at 4. Some day I hope to be at 7 lol
You will, I'm nothing special xD
Thank you! Will this work for the super realistic nanite grass we usually get off quixel?
To be used with nanite apparently you need to change few things, other people have made it work already though :)
Perfect! This video was definitely worth the wait^^ Now the only thing missing is the wind flowing around or being occluded by objects. Distance field gradients should do the trick...
Ahahahahah maybe... What about a real time fluid simulation?
@@VisualTechArt That would be even better ;) The GDC God of War wind talk should be a nice inspiration^^ As a side product, we could use the render targets to create player interaction. We should consider implementing simulation for flow and occlusion, but also local wind effects (e.g. helicopters and fast moving objects).
@@QuakeProBro Ah yes! I kinda remember that talk, thanks for the tip :D I also already experimented with interaction by using Niagara + Render Targets, it was a lot of fun, I'll see what I can do ;)
@@VisualTechArt Oh yeah I love how versatile Niagara is! I‘ve also checked the new update of Fluid Ninja Live that came out I think yesterday, it includes a use case example scene with foliage and a local wind sim.
Incredible thanks for sharing
So Cool. Thanks!
Very nice tutorial! I am not sure what the problem is, when i tried this using UE5.3, it actually worked with actor postion instead of object position
Yes, they did a change in the output of those nodes, at the time of recording this the ActorPosition node wasn't even introduced yet, if I remember correctly :)
Really curious about performance here. Also wondering if you had any solutions for how single blade grass gets handled by TAA. I know it's a notorious thing in Unreal with no perfect solution.
I've just taken another look for you now :D
I'm on a 980ti (which is also half broken) and the scene runs at 30/40fps@1440p, but consider that at the moment I have the Directional Light set with 10 cascades (much better than what I showed in the video sadly).
The grass has just the shader on and the only "optimization" active are LODs (4 levels).
When I was recording I used some other optimizations to reach 60fps minimum to be able to use VSync :) I was thinking about a future video about optimizing this scene, there are a decent number of things that can be done.
Regarding TAA... there's both some flickering and ghosting in the distance, of course :) But that's because I'm keeping single blades for way too far in the distance.
@@VisualTechArt That would be terrific!
@@VisualTechArt Quick question: I just got to 36:26 when the normals should be done, however I'm getting some bad black flickering on patches of the blades. Any idea what I could have messed up there?
Argh, I got them too few times while I was building the shader, but it was popping in and out on single blades... If you go in the Normal Buffer and you see it there too, should mean you're setting a value of 0 there somehow. To be honest I don't remember exactly what I did to fix it (it was like 2 months ago) and at some point I didn't get it anymore xD
Oh, if it's on patches maybe you forgot some VertexInterpolator node somewhere?
@@prestonschulz9359 Argh, I had that problem at some point too when I was developing the shader (like 2 months ago) and I don't remember exactly what I did to make it disappear.
If you see it on cluster you may be forgetting some VertexInterpolato somewhere, I had it on single blades. Also, if you can see them go black in the World Normal Buffer may be because you're trying to normalize a 0 length vector or dividing somewhere a value by another value that somethimes equals to zero.
Awesome! But, i'm having this issue: when i work with the bend parameter, it bends only in the center of the leaf, and not a rounded movement like yours. And it stretches the mesh, making it larger. Could you help me please?
It's a bit hard from here... Is the pivot point at the base of the blade?
Is Nanite disabled on the mesh? (You need to modify the shader a bit to make it work with it)
awesome stuff. will grab to my game, literally helped me not doing all by myself :)
Glad it did :D
Awesome! loving the look of this. Any idea if this works with WPO on Nanite in 5.1?
There are few adjustments to be made, some people actually did it and wrote about it on Discord :)
Thank you very much for your tutorial. 😘😘😘I completely reproduced it in version 5.3 according to your method, which is very good. The effect is exactly the same, and you really saved me. But there is a doubt: why does the 3D model finally become a 2D patch? I don't understand. It's good to use it to make grass. It's strange to apply it to trees😅
Since I wrote the shader for grass, I did some simplifications and assumed the 3D mesh is flat, probably :)
So if you try it on trees it might flatten them
@user-cz1de3uy5l
Have you made it work with 3D objects? I try to replicate the look of wind effect with a wheat field and at least for the models in front, I want them to be 3D. :)
Amazing stuff!! A lot high tech math stuff going here!! Thanks for sharing!! Could you give me some pointers on how to have it looking good on a top-down shooter game?
Well if you have top-down camera I'd say change the type of grass for something like clover ahahah
Much better coverage than blade grass in that case.
Other than that, it's up to you and your art direction :)
@@VisualTechArt man so easy hahah 🤣 guess I just needed a brake and breath after taking in all the info of your video. Thanks for the quick response and I'll be making some wider foliage like clovers and varens for this method..
This sooo awesome, thank you soo much, will you maybe make a video in future about how to optimize this ? like in with Ghost of Thushima methods ? i also saw on RUclips, someone using Niagra for this technique which delivers better performence apparently. if this is properly optimized then this makes one of the most feature packed and good looking grass ever. 😃
Yeah I want to expand on this sooner or later :D
@@VisualTechArt Looking really forward to that. 😁
OMG THANK YOU SO MUCH FOR THIS! I hate the UE4 wind node more than anything I've ever hated in my entire life! I'd say if you use a grass clump mesh, you wouldn't have to worry about each blade being individual as grass tends to grow in clumps anyway and having a few dozen blades moving in the same direction at the same time likely won't look bad at all. Especially with how wonderful your wind animation is.
Few months ago at work I did a fancier implementation of this where I could use grass clumps but still animate the individual blades separately ;)
You can always store the grass blade pivot in the vertex color or in a texture.
In most cases you don't actually need the pivot z position (because the start bending all on the same height) so I would:
R+G = Grass Blade XY pivot location
B = Grass Blade height
If the grass rest position is straight like in this example you can most likely get away with just using the vertex position XY. And can also add some height, rotation Variation in the shader for example.
You can also achieve clumping inside of the shader with some noise. (That the grass tips clump together for example) But I think the math might get pretty complicated. An easy solution would actually be to find some nice normal map and use it for clumping (You just point the grass blades along the normal) for example a normal map with some peppples should be nice.
Just imaging you had some pebbles inside of sand and then take them out. They would leave holes behind. When you now take a bunch of sticks and stuck them inside the sand in the direction of the surface the tips would "clump" together over the Center of the holes.
Taking the pebbles out was inverting the normal map. And putting the sticks over the surface was sampling this normal map to rotate the grass blades.
Hey man, first migration works fine for 5.2. Now my issue, i try add a material parameter for the force and direction, force works well but direction flicks when timeline is updating the amount. Any tip for solve it? Also, i saw u plan to add a local force/derection based on sphere or cube, when if u update this for next level, who buy will receive the update? Ty for this amazing project!!
Yes direction needs a bit more care if you want to drive it from a BP :)
Usually if I update a project I sell I tend to give it for free unless there's a major feature added, which in case you pay only an extra, not the full price
I am 7 months late, but I also have a suggestion that corresponds to what you're making here.
GDC is called Procedural Grass in Ghost of Tsushima; it was quite informative and gave quite a few tips on performance boosting regarding this exact technique.
I remember watching it, they sait that they made it with particles instead of meshes, right?
@@VisualTechArt
sadly, I can't quite remember that part, what stuck out to me more was how LODs were handled on the blades of grass (and I watched it more for the wow factor than anything else 😅)
@@TheNSJaws Fair enough, maybe I'm the one confusing it with another talk :D
But yeah, I remember the LOD thing now that you mentioned it!
on the bright side, video was super easy to find again, so imma just put the link here of you are interested (even if it's for a later date)
ruclips.net/video/Ibe1JBF5i5Y/видео.html
Amazing freaking content. I have learned so many things that I had to write them down. I have a question, the Z-scale finding trick does not work for me. I am placing my grass using the Grass node in the landscape material. The landscape grass type is set to scale the grass 3 to 4 times. However when I transform the 0,0,1 vector, it returns 0,0,1 (i visualized it with the debug nodes).
Did you pass the scale thing through the vertex interpolator node, before the display debug one? Otherwise it will return the cluster data
@@VisualTechArt Ah yes, that was it! I have one more questions if that's okay :D We're using the ObjectPosition node instead of the ObjectPivotPoint node. Isn't ObjectPosition supposed to return the center location of the object, which should ruin the gradients from bottom to top? Is that somehow different for instanced meshes?
No worries, for instanced meshes the Object Position node returns the pivot location, when used in the vertex shader, otherwise the cluster centre (if I remember correctly)
insane tutorial, only issue I am having is with lighting, when messing with the normals sometime the grass will appear too white when bending, Im experimenting with it right now but I dont really know how to fix this,. or even know if this is normal behavior.
Might be that it's catching a lot of specular, just to test, try to set the Specular to 0 and see if that's the case
This is awesome, thank you!
Amazing ! but I have problem with grass density, its so small. do you know any procedural solution without using foliage tool where I need to hand-paint grass on my big landscape?
One thing that I've been planning to experiment with for a while now is to use Niagara to handle the grass, that way would be so much easier to also make it interactive :D
You can try go that route!
@@VisualTechArt I would love to see that!
Thank you for making this video. Such a great project! Beautiful and mathematical impressive.
I had an issue which I notice other people talk about in the comments; "the cylinder effect" where the grass circulates around an axis into a barrel like cylinder. If I turn of Nanite, this disappears. I'm using 5.2. I don't know if you have found an solution to this?
I didn't look into this yet, but other people fixed it, I think they have changed which is the node that returns the pivot location of the instance, but I'm not sure, you can try ask in my Discord server and see if anyone replies... Or maybe someone wrote the solution here in other comments :D
I found it! Replace "Object Position" node with "ObjectPivotPoint" and plug into "Mesh Particle Pivot Location".
But two things happen. The lower stem of the grass all align to y-axis causing them to disappear when looking down a grassy path along the y-axis. And fps dropped by 10 when using nanite haha, so I turned nanite of again.
@@robinj6997 hey I'm getting the same issue. Did you manage to find a fix for it in the end?
I choose to turn nanite off since the fps was lower. And therfore I didn't solve the alignment issue either. I did it in 5.2. There is a discord where you can join.
@@robinj6997 hey I’m in the discord. I couldn’t find your message but I’ll take another look
How did you create the tesselated particle rectangle mesh and how did you connect it to the material ? I gues it is ued as a foliage and you did draw it on the landscape ?
I found out that it is just a simple mesh with this texture assigned and then foliaged on the landscape. Thank you a lot for this! I had an Issue with the shader and thought the mesh I am using is not correct or it is some kind of particles. Best D
How complicated would it be to allow this to work for a grass mesh with multiple blades? Your example scene has everything scaled up massive to get around the problem that LandscapeGrassType does not allow more than 1000 instances per 10 square metres, which means when using it at a normal world size, you have hardly any grass covering the land.
My solution was to just create a mesh which covers the necessary space, but your wind setup of course forces the whole mesh, instead of each blade in the mesh.
That's the challenge I left for the viewer at the end of the video! I already solved that problem on my own, but happy to discuss about it :)
Why don't you join my Discord server and brainstorm there?
Hi I bought the grass, but can't find how to change the scale in my scene? Is there some way how to simply do it? thank you
You can change the scale of the static mesh itself? Or use your own mesh :)
I made the nodes but where is the static grass mesh you used? What do I add this material to?
I didn't provide the mesh, it's just a long plane after all, nothing fancy :)
@@VisualTechArt cool beans i thought as much :)
nice
The realism of this wind animation is truly impressive. However, I’m curious if it’s limited to individual grass meshes. I’m wondering if it’s possible to apply this to a grass clump from Megascans, especially when dealing with multiple clumps combined into a single mesh.
It's easy to adapt it for clumps of single strands, for the "billboards" it's a bit more dangerous and not necessarily possible for how I see it :)
@@VisualTechArt I am not talking about the billboard. I am talking about the actual 3d mesh. With nanite we don't need billboards anymore.the link that mentioned above is for high quality 3d scanned grass. Image is just a thumbnail. Will this method work on compound mesh?
Is there a way to apply this for trees? Maybe, it's too complicated by there complexity? PivotPainter2 remain the best option? But hard to apply if you don't have 3DSmax to generate the PP2 Texture :(
I think it's possible to do something entirely procedural with few restrictions :D I may give it a go in the future actually.
If you want to tackle the problem by yourself I'd say that you can start by applying this exact bend (not as strong) to the entire tree and then make a second layer of bend added on top for the branches ;)
@@VisualTechArt How would you approach a second layer of bend? Unless it's a species with a straight trunk, I'd say you might have to separate the branches into unique objects to access their pivot points. I'd also think you might have to manually align the z axis of the object to the branch length. I don't think this should be too difficult for a second layer, but more detailed trees might have 3-5 layers of unique branching so idk how to do something like that.
@@dylankuzmick3122 Well it depends heavily on the structure of the asset I would be working on. Let's say you have a pine with a very straight trunk and horizontal branches, you can easily break down the movement into 2 layers and apply them on top of each other (kind of in the same way I did in the video to make the grass blades point straight up before bending them) :)
Does this work with nanite?? Cause ive tried it and it creates really weird things. Amazing tut btw
There are some people that made it work, one thing is that you have to swap the object position node for the particle one I think
Thank you for the tutorial. Is there any way to use it with custom wheat mesh ?
It depends on how you make the mesh, as long it's compliant, yes :)
I have a problem with the custom node: even if i write it in the same way return float2(-cos(a); sin(a)); i can't compile the shader, i get these errors
[SM5] /Engine/Generated/Material.ush(2620,22): error X3000: syntax error: unexpected token ';'
[SM5] /Engine/Generated/Material.ush(2620,30): error X3000: syntax error: unexpected token ')'
[SM5] /Engine/Generated/Material.ush(2626,22): error X3000: syntax error: unexpected token ';'
[SM5] /Engine/Generated/Material.ush(2626,30): error X3000: syntax error: unexpected token ')'
Any idea?
Thank you kindly.
It's return float2(-cos(a), sin(a)); you have to use a simple comma ',' to separate the float2 terms, not a semicolon ';'
@@VisualTechArt Oh god, that single point! Thank you, now it works!
Nice tutorial! my grass stretches vertically when you change the height parameter, and it doesn't look like yours, but I did everything the same as you, what could be the reason? And how can this be fixed? I need the grass not to stretch in length.
You sure you implemented everything correctly? Is it just stretched or stretches during the bending animation?
@@VisualTechArt yes, exactly like yours. Stretches during bending. Could this be because my terrain is up on the Z axis? I had to do this to avoid problems with water.
I believe the reason it doesn't work is because the grass might be Nanite Enabled. I got really weird effects similar to what you describe. Once I turned it back to normal Static Mesh it turned out like in the video. If there's a version of this tutorial but working with Nanite foliage it would be great. But as it stands it doesn't support it. Great tutorial though!
Really nice appreciate your contribution to the community
Wow!
Now we just need a way to apply local wind forces!
Would love to see a tutorial for that if you can figure out a way (or a point in the right direction to figure it out myself haha)
I'm planning a video about that for the future, but in the meantime... Why not override locally the wind parameters with a rendertarget? ;)
Hi! I am also interested in this. I want all my wind to point towards an actor. Imagine a small black hole that pulls things towards it. I’m trying to figure out how to accomplish this, studying videos like yours. I would be super grateful for a video on the subject.
learned a lot! thanks for your tutorial!😀
If you thing you know something about shader some random dude from youtube spitting in face xD amazing job, maybe river water next tutorial?
Ahahahahah it's more a matter of how you apply the little knowledge you have, fancy things are just many simple concepts put together :D
I have an issue, I do exactly the same as you and it's not working, my grass appear under the ground, lmao. When I slide the value in the bend intensity, it moves as it should, but under the ground. I feel like there's something off about the height and the bend intensity but I can't find the problem, I tried to put a minus in front of some values but it doesn't work, please.
Oh well xD flip the world upside down and you're fine :)
Maybe there is the default orientation of the mesh itself? Can't do much from here to help you :(
But if you got the movement right there must be some stupid sign or something like that around
@@VisualTechArt I've figured out where the problem comes from, thanks !
@@Link-hx5qk Hello I am having the same problem, do you maybe remember how you solved the problem on your end
@@ansh9677 Oh, sorry for the late answer, I'm not sure but I think that I took a grass model that I already had, which had two planes stick with each one having two opposed directions. Obviously it is twice more demanding in terms of ressources but this is the only solution that I found.
Are you italian? Thanks for the video!
Yes :D
Any reason to not use the slerp (spherical linear interpolation)?
Yep, if you plot the path a vertex follows from start to end position, it isn't a circumference section! :)
True. I wander how big of a visual difference it would be to use the slerp with some dampening based on the distance from the root of the blade. And the difference in cost of your system and a slerp based one, even tho I would guess they are very close.
@@Lorenzo_3D I guess so... My bending function itself is not that expensive actually, has only simple operations and two trigonometric functions, while the slerp I believe is more trig and less operations in total. If you ever test it let me know how it goes and if it's visually good :D
I have everything set up the way you do, but my grass blade curves from the top and bottom. making a c shape. do you know how i could fix this?
May be because your pivot point is at the centre of the mesh, or because you're not looking at an instanced mesh and the Object Position node in that case returns the centre of the object :)
@@VisualTechArt i cant figure out how to adjust the pivot point. also, when i paint the grass using the foliage tool. the grass curves around a single cylinder. and grass further from whatever point is picked for the cylinder is streched and curved even more. i cant get it to effect each blade individually
I actually fixed the pivot point. but i am still having the problem with the foliage tool and every instance of the grass blade sharing one cylinder they all wrap around from both directions
I meant: is your mesh pivot point at the base of your grass? Otherwise it may be you have the wrong Height value set in the shader?
same problem i pretty sure my pivot point is at the base, but for some reason when i add the material my grass start to become fat and big, why you just dont share the material, why we need to copy everything ...
if someone have a solution my grass is making a C shape i try differents height but nothing to do
have you placed every blade individually?
folliage tool
Landscape Grass Type, the mesh is single bladed
I can be wrong, but putting an if statement in the shader is quite expensive. Maybe there is a way that the value never gets 0 in the first place.
These nodes basically never get compiled as an actual branch in the shader code :)
If I buy the sample scene can this be migrated to UE 5.1?
To be honest I don't see why it shouldn't work, but apparently some people tried to reimplement it by following the tutorial had few issues. So in the near future I'm gonna check it personally and eventually add the UE5 version directly on Gumroad :)
I just had a look in my project, which was recently migrated to 5.1 and everything looks fine :)
If you buy it and have any issue just let me know!
@@VisualTechArt Could I just buy your migrated 5.1 scene now? Since you have it working and I wouldn't have to troubleshoot
I did end up buying it and opening it in unreal 5.1, but it doesn't seem to be working correctly. All I see is the brown landscape mesh. I am pretty novice in Unreal also.
I followed the tutorial, set-by-step in UE 5.1 Everything works pretty good from the first try
Why not just use gradient texture form black bottom and white top and bend that way?
Because here the objective was to obtain an accurate bend of the mesh (aka consistent length, thickness, shape throughout the animation) and not something eyeballed to not look immediately wrong :D
anyone know how to convert his custom HLSL node to material nodes? @26:50
I figured out that if you divide the radians by 4, then follow the rest of the logic of the expression by inputing the result of the division into a negative cosine into a Make Float 2 X input, and the result of the division into a sine then into the Make Float 2 Y, you get the same result as the custom expression. I guess this is because the CMOT Float 2 has a specific range defined so we need to remap the the angle a bit.
Any way i can control the speed of wind?
You can change the panning speed of the noise for that :)
@@VisualTechArt Thank You
怎么添加卡信息 为什么我总是添加不上
can anyone share this project if anyone made pls
You can grab it by following the link in the description :)
How optimized is this?
It's not the cheapest grass at all, but it is always better to test locally and decide with numbers at hand :)
This is very cool, but I'd really love to see your take on a realistic grass wind animation that *also* cares about performance. especially when having grass with a lot of vertices, doing 700 instructions per vertex for wind like this is just too much.
While I agree with your comment, I think you would be surprised by how well this would be handled by modern GPUs :) Definitely going to add some optimisations to this in the future though
Foremost, THANK YOU for all the information, technique, and knowledge you have provided us.
I was able to implement your solution successfully. As well, I was able to swap out the height-calculations for the ObjectRadius node since it can be responsive to instance/object scale.
I DO have a question / request. I understand this is all free as in beer, so feel free to ignore, but...the normals. Is it possible to generate basic-detail on the blade of grass? I'm just-dangerous enough with just-a-little knowledge to know it can be done, but clueless enough to not-really be able to it directly - lol.
Specifically, I was looking to marry techniques between your excellent work as well as this fellow: ruclips.net/video/YxE9yN9uOXU/видео.html He's running a breakdown on the techniques used for grasses in Ghost of Tsushima. It uses a bezier-curve which can flex fine, but doesn't preserve length like your implementation does. I love you both but in your camp here, the blade is so-long, it shouldn't get any longer or shorter. However, he does have a nifty way of generating normals that it makes a nice vein down the middle of the blade, with some slight/tunable curvature at the edges as well to really sell a 'curved' blade of grass.
Both your solutions are excellent in their own ways, both VERY performant for the visuals. However, sans using a texture-map, is it possible to demonstrate how one might create a vein/normal-detail from your solution?
Again, feel free to ignore me, but otherwise, much-appreciated on the teachings; keep 'em coming. :D
Hey :) cheers
For the normals in the video I show how to compute the correct ones, once you have them (or whatever kind of normals you choose to go with) you can just add on top more details.
For example through the Material Function BlendAngleCorrectedNormals and so on :)
Overall, I believe there is room for improvement in the tutorial. While the math solution provided works well within the specific setup you shared, it does not function correctly when applied to foliage or procedural materials. It seems to only work as intended for single mesh objects. I spent the last 8 hours meticulously reviewing and ensuring that my nodes match exactly, but despite that, the material breaks completely. This suggests that important information might have been omitted from the tutorial, making it challenging to achieve the desired results in these specific scenarios. The meshes should not spiral into circles and not be placed on the grounds or on the ground in single file... additionally the mesh is not suppose to scale disproportionately like it does for anyone following along. This is an advanced grass tutorial, but its not the best way to do things and charging 20 dollars for the answers on Gumroad is outrageous When the average person is only interested to see your approach more so than use in production as is. You blitz through the node setup on fast forward forcing uses to play at 0.25 speed which is not enjoyable... I found the math part interesting I was hoping to see it it all come together but alas something critical was clearly omitted from the tutorial....meaning its a giant waste of time
Thanks for the feedback, I'll try to be clearer next time. Wasn't expecting this since many people before you were able to make it work without problems :(
@@VisualTechArt loved the math part just want to say the way you explained things was great, I dont want to poop on your hard work... I appreciate you. I know how hard it is at times explaining complex topics. Out of the 10 wind and grass tutorials yours was the most exciting to learn it was unfortunate
but thanks for everything either way
How to use on Nanite model, can pay
I believe someone already explained it in the comments, the main issue is the ObjecPosition node, which returns a different data with Nanite meshes, you have to change it with Instance Position or something like that, don't remember exactly now :)
I am so stupid that I don't understand what the matter is here
how does this win the megaskan + their wind system?
I do not understand the truth (it is from the stupidity of my own, and not from the fact that it is useless, no it is probably cool)
i need 2,000 leaves for the bush each leaf a separate object and with simulated physics and maximum natural wind
I see in your work the kinship of my thought,
but I do not understand at all how to implement my task
For shapes like bushes I think my system would need more work to adapt to their shape and different behaviour.
This is not meant to be against some other systems (like megascan) is just a different thing :)
@@VisualTechArt thank you, I follow you
有人在吗 我的卡信息添加不上买不了这个 谁能帮帮我
I don't know, maybe text me on Discord and we can sort it out :)
You find the invite in the description of the video