Note that I was able to find a free substance designer node for the texture dilation step, in case that's helpful for anyone. Thanks for the tutorial, Ghislain - fantastic work as always!
Interesting, gonna give a shot for my foliage with this AOV technique, I usually just bake maps from HP to plane. looks like this way can save some time :) good stuff friend!
If anyone wants to skip the mip flooding and just do some simple flooding the easiest way I found was to use the inpaint node in the compositor in blender which will apply directly to the render so you don't have to adjust anything manually in another software. Also you can do your channel packing there.
@@ghislaingirardot I believe this could be because you first have to unpremultiply the alpha and then apply it again after the inpaint. At least that's the setup that worked for me.
Damn dude. You HAVE to get into Houdini. Watching you do this manually is quite painful, you could build quite the procedural setup to do all of this automatically. With your advanced knowledge of visual scripting and geometry you’d pick it up in no time. Thanks for the amazing video still, picked up quite a few cool tips. Keep it up!!
Everything looks more tedious in a step by step tutorial :D It's not that bad. Do the steps once, save it in a template file and voilà. I can just get straight to business whenever I need to, and things can be improved/sped up with scripts. Blender's Geometry nodes can also offer a great procedural workflow, I just tend to stick to manual workflow for greater artistic controls. Houdini is great tho, for sure :)
@@ghislaingirardot Totally! And I've definitely been a victim of over-engineering procedural setups too many times. Crafting everything by hand feels really good too and some manual tweaks following your intuition just can't be replicated by noises and randomness :)
Thanks a lot for this, all of your grass videos are amazing and it's clearly taken a lot of work/practice to learn all this. I tried using Houdini to make grass blades faster using curves and randomizing the bending and tapering of the blades. I'm sure you could do the same with geometry nodes in blender using curves or even using some of the hair grooming tools. Worth a look if you want to make some of the earlier steps less tedious.
Yup, definitely a solution. Depends on the artistic direction. For stylized rendering, many of my colleagues are not willing to give up the artistic control that a 100% manual approach gives you. For semi realistic/realistic, precise controls, emphasis on details & exageration isn't as important and a procedural approach can be great. Both methods have their pros & cons. Use the one you're most comfortable with.
can you explain morr kn the uv for LOD? It looks so abstract because there are just line. Also, how would Unreal link their material to LOD? Because the lod 3 is just a card so how would it read the opacity map?
im just getting started with ue5 and in particular c++ in ue5 and when i look at ur stuff im like maaan fuk it no way i will one day be good enough to do that on my own hahaha
I was using "Real/Realistic" Grass & yeah you change the colour slightly & it turns into stylized, there is little difference. But Opinions: Do we need LOD's for grass, not saying use nanite, I'm saying if we WPO lower grass towards the ground at distance in theory & with distance culling on top it should stop rendering in Unreal Engine at a unnoticeable height? Meaning we could just use LOD0 & LOD1 for grass (Keep in mind I'm asking for opinions not stating a fact in anyway) & still get decent performance as they are instanced meshes? Asking as I'm noting a lot of issues with LOD-2/3 billboard meshes people use for grass & this seems like a easier solution because we can literally remove the bad/poor LODS Rather than re-making high triangle HQ grass in nanite?
It really depends on a lot of factors... Grass culling distance/view distance/vertex count/targeted plateform/amount of instructions in the vertex shader etc etc. There's no right answer, grass is a fricking pain in the butt and every project has unique requirements and there are millions different tricks you can use to meet your targeted performance budget. Keep in mind instancing 'only' helps with drawcalls. It's great but doesn't help with the GPU potentially having to render literally millions if not dozens of millions vertices just to draw grass and that can become a huge bottleneck quite quickly. It is my understanding that even today's GPUs can be easily bottlenecked by vertex processing, possibly because the emphasis is put on pixel/compute shaders & tensor cores, not so much on vertex processing units. In all my testing, reducing vertex count and being super agressive with LODs (meaning lots of LODs & simple billboard at a distance) was the key to performant grass, plus limiting masked opacity overdraw & quad overdraw (see my stylized grass course for some example). Nanite is obviously a solution to not care as much about geometry, but you need a whole different mind set when it comes to foliage to account for the technical limitations Nanite comes with, geometry overdraw being the °1 concern. It's plenty doable but it's just a totally different way to do grass, and foliage for that matter. Fortnite is a good example. Working with a new technology often requires working with new constraints. Nanite is no different :)
@@ghislaingirardot Thanks for reply, I guess the straightforward way of more LOD's & adjust range for them is how I'm going to move forward with my issue.
Reasons I don't use nanite are explained in the video but you may go for it. You're mistaken if you think this is an easy-solution for grass. For the mid poly mesh, it's a solution I explored in previous videos. Here, I chose to explain the basics. Up to you to add a bit more vertices and get rid of the opacity map :) (which is often worth doing, yep)
@@ghislaingirardot ok good! thats what i tried for an open world like scene, detailed grass mesh (nanite) without opacity, spawned on the grass layer of the landscape, everywhere, and wind disabled in a distance (15000 for me) , but im curious to know what is the best method and if it can be optimized Id love to see you do videos on open world settings for grass + plants and trees if possible! inside ue5, and you explain why or why not nanite
In what shader? If you're talking about UE, you're mistaken. The height information I baked into a texture is gone once exported in the engine and can't be re-created. It's not the card 'Z height', it's the hi-poly depth data. Kinda useless in this video but as I said, it's an example of what can be done.
@@ghislaingirardot No in blender for the first steps! when you are doign the texturing of the grass blades You used a cube with a weird technique, but you can just do a gradient on an axis, where close to the camera is white and the limit of the grass blade (far from the camera) is black Thats how i render a height map from like a tiling material inside blender
@@Dhieen How so? With a Texture Gradient node? Afaik, you still need to use a Texture Coordinate node to get the position data to generate the gradient from, no? And using a second object is great for visualization and ensuring all objects share the same [0:1] range (or have a different one), imho. But I could be missing something here, lemme know.
@@ghislaingirardot Ok i see, did you try texture coordinate Generated > mapping (rotate 90 on Y axis) then you scale on the Z axis, plug that to a gradient texture?
@@Dhieen The Generated pin creates a bounding box per object so that obviously has issues when you want to create a unified [0:1] height gradient for multiple objects that all have different bounding boxes. Hence why I'm using a separate Object.
Note that I was able to find a free substance designer node for the texture dilation step, in case that's helpful for anyone. Thanks for the tutorial, Ghislain - fantastic work as always!
Neat! Is it Hauke Thießen's artstation post? Thanks for watching!
Thanks for explaining everything step by step, really nice to see how things are made from nothing to a stunning field :).
"first delete everything, then add a camera" i wanted to hear "and add a cube, and a light" hahaha
😅 I'm doing my best
Interesting, gonna give a shot for my foliage with this AOV technique, I usually just bake maps from HP to plane. looks like this way can save some time :) good stuff friend!
Ty!
Watching this video made me very happy with that I have chosen to use a much simpler system to make much simpler grass.
You do you :D Happy for you
If anyone wants to skip the mip flooding and just do some simple flooding the easiest way I found was to use the inpaint node in the compositor in blender which will apply directly to the render so you don't have to adjust anything manually in another software. Also you can do your channel packing there.
I originally tried this but it's not working for me :( It does flood the image but creates an horrible black outline around the edges.
@@ghislaingirardot I believe this could be because you first have to unpremultiply the alpha and then apply it again after the inpaint. At least that's the setup that worked for me.
@@bentzge Roger that, I'll try. Ty for the suggestion :)
You could output the nodes directly in the Material Output -> Surface for easy previewing. Node wrangler has this automated with a hotkey
Oh, indeed! A little bit easier :) ty
Damn dude. You HAVE to get into Houdini. Watching you do this manually is quite painful, you could build quite the procedural setup to do all of this automatically. With your advanced knowledge of visual scripting and geometry you’d pick it up in no time. Thanks for the amazing video still, picked up quite a few cool tips. Keep it up!!
Everything looks more tedious in a step by step tutorial :D It's not that bad. Do the steps once, save it in a template file and voilà. I can just get straight to business whenever I need to, and things can be improved/sped up with scripts. Blender's Geometry nodes can also offer a great procedural workflow, I just tend to stick to manual workflow for greater artistic controls. Houdini is great tho, for sure :)
@@ghislaingirardot Totally! And I've definitely been a victim of over-engineering procedural setups too many times. Crafting everything by hand feels really good too and some manual tweaks following your intuition just can't be replicated by noises and randomness :)
@@1famekouby yup geonodes is simply awesome.
Thanks a lot for this, all of your grass videos are amazing and it's clearly taken a lot of work/practice to learn all this. I tried using Houdini to make grass blades faster using curves and randomizing the bending and tapering of the blades. I'm sure you could do the same with geometry nodes in blender using curves or even using some of the hair grooming tools. Worth a look if you want to make some of the earlier steps less tedious.
Yup, definitely a solution. Depends on the artistic direction. For stylized rendering, many of my colleagues are not willing to give up the artistic control that a 100% manual approach gives you. For semi realistic/realistic, precise controls, emphasis on details & exageration isn't as important and a procedural approach can be great. Both methods have their pros & cons. Use the one you're most comfortable with.
can you explain morr kn the uv for LOD? It looks so abstract because there are just line.
Also, how would Unreal link their material to LOD? Because the lod 3 is just a card so how would it read the opacity map?
Good video, I would love it to be in Spanish ❤
I buy the addon on sight
im just getting started with ue5 and in particular c++ in ue5 and when i look at ur stuff im like maaan fuk it no way i will one day be good enough to do that on my own hahaha
It really is within everyone's reach imho.
I was using "Real/Realistic" Grass & yeah you change the colour slightly & it turns into stylized, there is little difference. But Opinions: Do we need LOD's for grass, not saying use nanite, I'm saying if we WPO lower grass towards the ground at distance in theory & with distance culling on top it should stop rendering in Unreal Engine at a unnoticeable height? Meaning we could just use LOD0 & LOD1 for grass (Keep in mind I'm asking for opinions not stating a fact in anyway) & still get decent performance as they are instanced meshes? Asking as I'm noting a lot of issues with LOD-2/3 billboard meshes people use for grass & this seems like a easier solution because we can literally remove the bad/poor LODS Rather than re-making high triangle HQ grass in nanite?
It really depends on a lot of factors... Grass culling distance/view distance/vertex count/targeted plateform/amount of instructions in the vertex shader etc etc. There's no right answer, grass is a fricking pain in the butt and every project has unique requirements and there are millions different tricks you can use to meet your targeted performance budget.
Keep in mind instancing 'only' helps with drawcalls. It's great but doesn't help with the GPU potentially having to render literally millions if not dozens of millions vertices just to draw grass and that can become a huge bottleneck quite quickly. It is my understanding that even today's GPUs can be easily bottlenecked by vertex processing, possibly because the emphasis is put on pixel/compute shaders & tensor cores, not so much on vertex processing units.
In all my testing, reducing vertex count and being super agressive with LODs (meaning lots of LODs & simple billboard at a distance) was the key to performant grass, plus limiting masked opacity overdraw & quad overdraw (see my stylized grass course for some example). Nanite is obviously a solution to not care as much about geometry, but you need a whole different mind set when it comes to foliage to account for the technical limitations Nanite comes with, geometry overdraw being the °1 concern. It's plenty doable but it's just a totally different way to do grass, and foliage for that matter. Fortnite is a good example. Working with a new technology often requires working with new constraints. Nanite is no different :)
@@ghislaingirardot Thanks for reply, I guess the straightforward way of more LOD's & adjust range for them is how I'm going to move forward with my issue.
why dont you use nanite? and no transparency with a mid poly grass mesh?
Reasons I don't use nanite are explained in the video but you may go for it. You're mistaken if you think this is an easy-solution for grass. For the mid poly mesh, it's a solution I explored in previous videos. Here, I chose to explain the basics. Up to you to add a bit more vertices and get rid of the opacity map :) (which is often worth doing, yep)
@@ghislaingirardot ok good! thats what i tried for an open world like scene, detailed grass mesh (nanite) without opacity, spawned on the grass layer of the landscape, everywhere, and wind disabled in a distance (15000 for me) , but im curious to know what is the best method and if it can be optimized
Id love to see you do videos on open world settings for grass + plants and trees if possible! inside ue5, and you explain why or why not nanite
For the height you can just create a gradient in the shader lol
In what shader? If you're talking about UE, you're mistaken. The height information I baked into a texture is gone once exported in the engine and can't be re-created. It's not the card 'Z height', it's the hi-poly depth data. Kinda useless in this video but as I said, it's an example of what can be done.
@@ghislaingirardot No in blender for the first steps! when you are doign the texturing of the grass blades
You used a cube with a weird technique, but you can just do a gradient on an axis, where close to the camera is white and the limit of the grass blade (far from the camera) is black
Thats how i render a height map from like a tiling material inside blender
@@Dhieen How so? With a Texture Gradient node? Afaik, you still need to use a Texture Coordinate node to get the position data to generate the gradient from, no? And using a second object is great for visualization and ensuring all objects share the same [0:1] range (or have a different one), imho. But I could be missing something here, lemme know.
@@ghislaingirardot Ok i see, did you try texture coordinate Generated > mapping (rotate 90 on Y axis) then you scale on the Z axis, plug that to a gradient texture?
@@Dhieen The Generated pin creates a bounding box per object so that obviously has issues when you want to create a unified [0:1] height gradient for multiple objects that all have different bounding boxes. Hence why I'm using a separate Object.