Introduction to the LaGrande family of Blender Node Networks
The name “LaGrande” means “the great” in (BAD) Spanish, and it historically arose from the naive idea that a single, gargantuous node network might do it all… Do what? Well, the purpose of LaGrande is to help artists (texturers) produce CineMut shader-compatible texture sets for 3D models. As it turns out, Blender node networks (also known as “noodles”), tend to crash the application quite easily if they use a lot of textures or have too many nodes. Therefore, LaGrande is evolving as a very large set of many small noodles.
The LaGrande vision
In its fully evolved form, besides computing bump-modulated bent normals and packing material channels, LaGrande will have such features as adding dirt streaks, scratches, and other surface wear such as reentry heat “burn” marks, exposure-dependent color fading for paints, etceteras. Working prototypes for these noodles already exist and work, but will need some cleaning up and optimization before release.
Well, in its fully evolved form, LaGrande will probably become a single executable, or a set of executables called from a batch or script.
Requirements
Unlike programs such as Gimp and Photoshop, Blender3D nodes work with floating point precision per-channel; but splitting the work into a long chain of small noodles requires us to save a lot of intermediate results to textures. This is why, as you'll see, LaGrande typically outputs to texture files with a .exr extension. Those are OpenEXR format files, where colors are specified with 32-bit IEEE floating point precision per channel and no compression. A 2k x 2k texture takes 64 megabytes of disk space, in that format; so a machine with lots of disk space (as well as RAM) is recommended for working with LaGrande.
Where do I get it?
Right now the noodles are in too much flux to warrant uploading them to a server. As a teaser, here is the my most current version of the README file:
LaGrande Noodle System
This README was first written on July 25, 2009. Revisions: (non yet)
Copyright © 2009 by “chuck_starchaser” (Dan W.) Released under strict GPL (“CopyLeft”) public license. Cannot be used or distributed with, whether modified or not, except with strict GPL (“CopyLeft”) -licenced projects or derivatives, except by special, written permission.
Introduction
The LaGrande Noodle System is a collection of Blender 3D compositor node networks designed to ease production of textures for 3D models targeted to the CineMut family of GLSL shaders. We're talking artists' tools here.
As of this writing, there is no official download. I don't know how you came around this document, if you're reading this; but then again, chances are you aren't :) But IF you are, it's probably that you found a “copy” of LaGrande in a sub-folder of a 3D model's master texturing work, somehow.
And why would there be “copies” of LaGrande all over the place? Well, the truth is that LaGrande hasn't even been born yet; it is in a 'fetal growth' stage. CineMut shaders are also unborn, pre-alpha, and their texture packing requirments are changing often, making for a moving target for LaGrande. So there's not even a point in trying to have an official “master copy” of LaGrande, or official repository. The copy found under the last 3D model worked on IS the latest version. But you have no way to tell you if this is it. Your best bet is to check out what's happening in PU's modeling and texturing, and figure out, or just ask, what the latest 3D model –with the latest LaGrande– is. http://wcjunction.com/phpBB2/viewforum.php?f=7
Having said that, even when LaGrande matures enough to deserve a central repository to get “it” from, copying the whole thing into a subfolder of every project will be the recommended modus operandi. Why? Because the purpose of keeping modeling and texturing process masters is to be able to “maintain” the art –i.e.: be able to change, perhaps a “small thing”, and get updated outputs. The only way to guarantee you'd get the same outputs as before, except for the “small change”, is to keep a copy of the version of the tools used originally. Not only because LaGrande will continue to evolve, but because LaGrande noodles (node networks) are highly customizable, and you will likely make custom changes or adjustments to it for particular models. And the noodles aren't particularly large, as file sizes go; nowhere near as large as the textures you work with; so might as well keep copies. This modus operandi will result in one (serious) problem, however: When evolutions in LaGrande are tied to evolutions in CineMut texture packing specifications, this will invalidate previous copies of LaGrande. Not sure what the solution is. I think it is up to you to document any customizations you make, so that you can later update the noodles to the latest version and re-apply your customizations.
The following is NOT instructions, or a how-to. Those will be found in the wcpedia.com modeling and texturing wiki, when they are done. What's below is simply a list of LaGrande noodles in order of usage, each with an indented list of input and output filenames. This list is highly mutable, and may be obsolete even if you happen to be reading the latest version of this document.
START
RUN ONCE
AO_PRT_exports_for_touchup.blend (DO NOT RUN except the first time, unless you have new bakes and really want to over-write your touch-up's!!!!)
inputs: /bakes/UAO.exr /bakes/prtP.exr /bakes/prtN.exr /bakes/CAO.exr outputs: /touchup/UAO_tu0001.png /touchup/prtP_tu0001.png /touchup/prtN_tu0001.png /touchup/CAO_tu0001.png
END RUN ONCE
After running the above noodle, you'd typically spend some time touching up the bakes, such as selecting black blotches by color and blurring, to get rid of too dark texels showing next to interpenetrating geometries. All Gimp work. That's why we exported .png's. Note that the import noodles below will try to keep the full, 32-bit precision of the original OpenEXR files, except for the areas you touched up in the png's. How do the input noodles know? They just use a difference threshold to tell a texel's been deliberately modified.
UPON INPUT UPDATES, YOU CAN RE-RUN NODES STARTING AS EARLY AS HERE
UAO_import_from_touchup.blend
inputs: /bakes/UAO.exr /touchup/UAO_tu0001.png outputs: /bakes/UAO_fixed0001.exr
prtP_import_from_touchup.blend
inputs: /bakes/prtP.exr /touchup/prtP_tu0001.png output: /bakes/prtP_fixed0001.exr
prtN_import_from_touchup.blend
inputs: /bakes/prtN.exr /touchup/prtN_tu0001.png output: /bakes/prtN_fixed0001.exr
CAO_import_from_touchup.blend
inputs: /bakes/CAO.exr /touchup/CAO_tu0001.png output: /bakes/CAO_fixed0001.exr
Compute inverse matrix to convert tangent space vectors to model space
UVN_to_XYZ_vec.blend
inputs: /bakes/U_vec.exr /bakes/V_vec.exr /bakes/N_vec.exr outputs: /temp/X_vec.exr /temp/Y_vec.exr /temp/Z_vec.exr
Generate a first bent normal in tangent space to help later with bump modulation
prt_normalizer_1.blend
inputs: /bakes/UAO_fixed0001.exr /bakes/prtP_fixed0001.exr /bakes/prtN_fixed0001.exr outputs: /temp/renormalized_prtP0001.exr /temp/renormalized_prtN0001.exr
PRT_to_bent_normal_1.blend
inputs: /temp/renormalized_prtP0001.exr /temp/renormalized_prtN0001.exr output: /temp/bent_normal_model_space0001.exr
bent_normal_to_tan_sp_1R.blend
inputs: /bakes/U_vec.exr /temp/bent_normal_model_space0001.exr output: /temp/bent_normal_tangent_spaceR0001.exr
bent_normal_to_tan_sp_1G.blend
inputs: /bakes/V_vec.exr /temp/bent_normal_model_space0001.exr output: /temp/bent_normal_tangent_spaceG0001.exr
bent_normal_to_tan_sp_1B.blend
inputs: /bakes/N_vec.exr /temp/bent_normal_model_space0001.exr output: /temp/bent_normal_tangent_spaceB0001.exr
bent_normal_to_tan_sp_1.blend
inputs: /temp/bent_normal_tangent_spaceR0001.exr /temp/bent_normal_tangent_spaceG0001.exr /temp/bent_normal_tangent_spaceB0001.exr output: /temp/bent_normal_tangent_space0001.exr
Generate "PRT-light directions" in tangent spece, lerped with bent normal, also to help with bump modulation
bent_prtPNX.blend
inputs: /temp/X_vec.exr /temp/bent_normal_tangent_space0001.exr output: /temp/bent_prtPX0001.exr /temp/bent_prtNX0001.exr
bent_prtPNY.blend
inputs: /temp/Y_vec.exr /temp/bent_normal_tangent_space0001.exr output: /temp/bent_prtPY0001.exr /temp/bent_prtNY0001.exr
bent_prtPNZ.blend
inputs: /temp/Z_vec.exr /temp/bent_normal_tangent_space0001.exr /bump/normalGimp.png
output: /temp/bent_prtPZ0001.exr /temp/bent_prtNZ0001.exr
bumpmap work and normalmap generation (use Gimp for now)
bump_expander_thinner.blend (not implemented yet; do it with Gimp)
Modulate the ambient occlusions to add tilt-based bump lighting and bump shadows
UAO_bump_splitter.blend
input: /bump/bump.png output: /temp/bump_top_level0001.png /temp/bump_bot_level0001.png
UAO_top_shadows.blend
input: /temp/bump_top_level0001.png output: /temp/UAO_top_shadows0001.exr
UAO_bot_shadows.blend
input: /temp/bump_bot_level0001.png output: /temp/UAO_bot_shadows0001.exr
UAO_bump_shadows.blend
input: /temp/UAO_top_shadows0001.exr /temp/UAO_bot_shadows0001.exr output: /bump/UAO_bump_shadows0001.exr
CAO_bump_shadows.blend
input: /bump/bump.png output: /bump/CAO_bump_shadows0001.exr
CAO_bump_tilt_mod.blend
input: /temp/bent_normal_tangent_space0001.exr /bump/normalGimp.png output: /bump/CAO_bump_tilt0001.exr
CAO_final_bumper.blend
input: /bakes/CAO_fixed0001.exr /bump/CAO_bump_tilt0001.exr /bump/CAO_bump_shadows0001.exr output: /bump/CAO_bumped0001.exr
UAO_final_bumper.blend
input: /bakes/UAO_fixed0001.exr /bump/CAO_bump_tilt0001.exr (that's right; it just square roots the CAO's bump tilt) /bump/UAO_bump_shadows0001.exr output: /bump/UAO_bumped0001.exr
Modulate all 6 PRT channels to add tilt-based bump illumination modulation
modulate_prtPX.blend
inputs: /temp/bent_prtPX0001.exr /bump/normalGimp.png output: /temp/bumped_prtPX0001.exr
modulate_prtPY.blend
inputs: /temp/bent_prtPY0001.exr /bump/normalGimp.png output: /temp/bumped_prtPY0001.exr
modulate_prtPZ.blend
inputs: /temp/bent_prtPZ0001.exr /bump/normalGimp.png output: /temp/bumped_prtPZ0001.exrback
modulate_prtNX.blend
inputs: /temp/bent_prtNX0001.exr /bump/normalGimp.png output: /temp/bumped_prtNX0001.exr
modulate_prtNY.blend
inputs: /temp/bent_prtNY0001.exr /bump/normalGimp.png output: /temp/bumped_prtNY0001.exr
modulate_prtNZ.blend
inputs: /temp/bent_prtNZ0001.exr /bump/normalGimp.png output: /temp/bumped_prtNZ0001.exr
modulate_prtP.blend
inputs: /temp/bumped_prtPX0001.exr /temp/bumped_prtPY0001.exr /temp/bumped_prtPZ0001.exr /bump/prtP_fixed0001.exr output: /temp/bumped_prtP0001.exr
modulate_prtN.blend
inputs: /temp/bumped_prtNX0001.exr /temp/bumped_prtNY0001.exr /temp/bumped_prtNZ0001.exr /bump/prtN_fixed0001.exr output: /temp/bumped_prtN0001.exr
Modulate all 6 PRT channels to add bump shadows modulation
shadow_prtPX.blend
inputs: /temp/bent_prtPX0001.exr /bump/UAO_bump_shadows0001.exr ouput: /temp/shadowed_prtPX0001.exr
shadow_prtPY.blend
inputs: /temp/bent_prtPY0001.exr /bump/UAO_bump_shadows0001.exr ouput: /temp/shadowed_prtPY0001.exr
shadow_prtPZ.blend
inputs: /temp/bent_prtPZ0001.exr /bump/UAO_bump_shadows0001.exr ouput: /temp/shadowed_prtPZ0001.exr
shadow_prtNX.blend
inputs: /temp/bent_prtNX0001.exr /bump/UAO_bump_shadows0001.exr ouput: /temp/shadowed_prtNX0001.exr
shadow_prtNY.blend
inputs: /temp/bent_prtNY0001.exr /bump/UAO_bump_shadows0001.exr ouput: /temp/shadowed_prtNY0001.exr
shadow_prtNZ.blend
inputs: /temp/bent_prtNZ0001.exr /bump/UAO_bump_shadows0001.exr ouput: /temp/shadowed_prtNZ0001.exr
shadow_prtP.blend
inputs: /temp/shadowed_prtPX0001.exr /temp/shadowed_prtPY0001.exr /temp/shadowed_prtPZ0001.exr /temp/bumped_prtP0001.exr output: /temp/bumpshadowed_prtP0001.exr
shadow_prtN.blend
inputs: /temp/shadowed_prtNX0001.exr /temp/shadowed_prtNY0001.exr /temp/shadowed_prtNZ0001.exr /temp/bumped_prtN0001.exr output: /temp/bumpshadowed_prtN0001.exr
prt_normalizer_2.blend
inputs: /bump/UAO_bumped0001.exr /temp/bumpshadowed_prtP0001.exr /temp/bumpshadowed_prtN0001.exr outputs: /bump/final_bumped_prtP0001.exr /bump/final_bumped_prtN0001.exr
Combine the bump modulated prt's into a new bent normal, then make it tangent-space
prt_to_bent_normal_2
inputs: /bump/final_bumped_prtP0001.exr /bump/final_bumped_prtN0001.exr output: /temp/bumped_bent_normal_model_space0001.exr
bent_normal_to_tan_sp_2R.blend
inputs: /bakes/U_vec.exr /temp/bumped_bent_normal_model_space0001.exr output: /temp/bumped_bent_normal_tangent_spaceR0001.exr
bent_normal_to_tan_sp_2G.blend
inputs: /bakes/V_vec.exr /temp/bumped_bent_normal_model_space0001.exr output: /temp/bumped_bent_normal_tangent_spaceG0001.exr
bent_normal_to_tan_sp_2B.blend
inputs: /bakes/N_vec.exr /temp/bumped_bent_normal_model_space0001.exr output: /temp/bumped_bent_normal_tangent_spaceB0001.exr
bent_normal_to_tan_sp_2.blend
inputs: /temp/bumped_bent_normal_tangent_spaceR0001.exr /temp/bumped_bent_normal_tangent_spaceG0001.exr /temp/bumped_bent_normal_tangent_spaceB0001.exr output: /bump/final_bent_normal_tangent_space0001.exr
Q&A
JsnMtth asked,
How did LaGrande get started?
I don't remember anymore. I think the idea of using blender noodles just opened up so many
possibilities it caused CineMut to evolve. The original CM began from just using a standard
texture packing, with un-processed bakes thrown in some channels. The idea of doing
complex processing on image data was out of the question because of precision losses
in trying to do so in Gimp. Once Blender nodes came out, working at 32-bit per color channel
precision, that limitation was removed: We could now do anything we wanted, and as much
as we wanted, without precision losses, so the paradigm shifted: Anything that's too costly
for the shader to compute and warrants a texture channel, we can provide for its off-line
computation in LaGrande.
But that came later, actually; the first LaGrande noodles I did were for mixing and compositing
textures, and add effects like scratches and burns and dirt-streaks; –things I was already
doing with Gimp, albeit with precision-related artifacts.




