- Home /
Dynamic Multi-pass texture splatting with shadows?
Hi, guys, I have a problem that I don't know how to address with Unity, but I already prototyped in Ogre3D / C++.
I am making a voxel based game with Marching Cubes based terrain. World is divided into chunks, and each chunk can have unrestricted amount of different materials. Users can manipulate the world runtime, so limiting textures count is not an option.
In Ogre3D, we can generate multipass materials on the fly. Each material have different number of passes and each pass have vertex and fragment shader. Implementing my splatting was then straightforward.
First pass is: Render the geometry and first 4 texture splats while writing to the Z buffer. Then I have N amount of additive passes that each pass renders next 4 texture splats (No Z-buffer writes and Z=equal check). If I have 13 materials in a chunk, I end up with 4 passes (3*4 = 12 + 1 pass for 13th material = 4 passes). After this pass chain completes, additional pass renders light contribution.
The problem is that unity's Material architecture differs a lot than Ogre's raw material->passes->shaders.
How can I implement such manual render passing in Unity? I don't want to have different ShaderLab scripts for each possible splatting pass count is just unacceptable.
How can I do multi-pass rendering pass-by-pass, with only using a shader per pass, and by shader, i mean a real shader, Vertex and fragment, not an ShaderLab script (Unity documentation misuses term "shaders" A LOT). I see, I cannot generate shaders runtime, it looks like I cannot generate multipass materials at runtime by only using pre-made vertex and fragment shaders, or I overlooked?
And as final step, I want to render lighting contribution only, using a surface shader :)
Also, let me add: I've already stumbled upon builtin_shaders->Terrain->Splats. The question is not about shader passes, but how to properly render passes manually, and how to control the render order plus how to add the lighting on top of that.