[TUTORIAL] Custom Blend Materials

Discussion in 'Tutorials & Resources' started by Cynick, Feb 19, 2010.

  1. Cynick

    Cynick L4: Comfortable Member

    Messages:
    153
    Positive Ratings:
    143
    Ok lemme type this all out again and hopefully I don't accidentally close my browser this time. :cursing:

    You know those cool materials that you can use on displacements to blend between two different textures? Well, I looked around for a tutorial on how to make them, but found nothing. So I looked at Valve's examples and made a tutorial. This tutorial assumes only basic mapping and VMT knowledge. Enough chatter! Tutorial time.

    Custom Blend Materials

    First, you will need two textures to blend. If you extracted them with GCFScape*, they should already be in VTF format, if not, I will show you how to convert them. I will be using the team colored dev textures.

    *Thanks to Ravidge for pointing this out: You don't need to extract the VTFs from the GCF if you're not going to edit them at all. Simply point the $basetexture and $basetexture2 paths to the path of the texture in the GCF (relative to "root\tf\materials")

    [​IMG]

    Step 1. Converting to VTF (skip to #2 if you already have)

    If you haven't already, download VTFEdit. Start by using File->Import to import your texture into VTFEdit. A dialog will open with a lot of settings, leave them at default and hit ok. Then go to File->Save and save your file as a VTF. Repeat this process for the other file.
    (I saved mine as blendexample_red.vtf and blendexample_blu.vtf)
    [​IMG]

    Step 2. Creating the VMT
    Open up the folder where you saved your VTF files. Create a new text file WITH THE EXTENSION VMT. (Mine is blendexample.vmt)

    [​IMG]

    Open this file with a text editor (I used Notepad++, Notepad works too). Now you'll need to specify the properties of the material. Start by entering:
    Code:
    "WorldVertexTransition"
    {
    The "WorldVertexTransition" specifies the shader the engine will need to use to correctly blend the materials together. The { tells the engine that you are specifying properties for this material. Now, expand your file with:
    Code:
    "$basetexture"    "<texture 1 relative path>"
    "$basetexture2"    "<texture 2 relative path>"
    These parameters specify where the game can find your VTF files, so replace the text in between the < and > with the path (relative to "tf\materials") that you will copy the VTF files and the VMT to. (this can be anything, but make it descriptive, and remember it) For this example, I used "customblend/blendexample_red" and "customblend/blendexample_blu

    DO NOT INCLUDE THE .VTF EXTENSION!

    Now, some optional (but recommended) parameters
    Code:
    "$surfaceprop"    "dirt"
    "%keywords"      "tf"
    "$surfaceprop" specifies what sounds the material should make when walked on/shot. It also tells what type of bullet holes the material should show. Other common values are "concrete" "metal" and "wood".

    "%keywords" simply specifies tags that one can use in the texture browser, most tf2 textures will use the tag "tf"

    Here's my example VMT with all the parameters:
    [​IMG]

    Step 3. Putting the files in the "tf\materials" folder

    Almost there! Now you will need to copy your two VTF textures and your VMT file into the correct folder (the one you specified for "$basetexture") in your "tf\materials" folder (if any of the folders don't exist, create it). Diagram incoming:

    [​IMG]

    Step 4. Try it out!

    Boot up hammer and search for your material in the texture browser. It will only show one material, but IT STILL WORKS.

    [​IMG]

    Now try it out on a displacement. Here's my example texture:
    [​IMG]

    Here's the final result:
    [​IMG]

    Cool, huh?

    Step 5. Blend Modulate Textures

    You may have noticed that the game renders the transition to texture 2 as a solid gradient. This works fine for our simple example with dev textures, but what about more natural transitions like grass to concrete? Grass doesn't evenly "fade" over concrete, so a solid transition will not achieve a realistic result. The answer? A gun. And if that don't work, use more gun. Blend Texture Modulates!


    Example (Nature/blendconcretetograss001)
    [​IMG]
    [​IMG]

    The difference is massive. Here's the BlendTextureModulate texture for the above material:
    [​IMG]

    Now adding your own BlendModulateTexture is quite simple. The texture consists of only two color channels, green and red. The green channel controls the transition between the two materials. 255 in the green channel means that texture 2 will be fully visible, 0 means texture 1, and 128 is an even blend. The idea is to paint patterns into this channel to "mask" the edges of the blend. Valve has painted patchy star-like patterns into the green channel in the example. The red channel controls the sharpness of the falloff. The Valve Wiki has a good explanation of the red channel, so I'll use that one.
    Valve has painted the same star pattern into the red channel, however it's a much subtler difference between the individual "star" colors. The red value averages about 100, for a fairly sharp falloff.

    Another example over at the Valve Wiki

    Creating Blend Modulate Textures is pretty easy. I created an *example* blend modulate texture for our dev texture example here.
    [​IMG]

    Commence laughing at it's horrible-ness.


    Done? Good. I made it in 20 seconds in Paint.NET, IT'S AN EXAMPLE OK? Now that we've cleared that up, save your newly created better than mine texture, and use VTFEdit to convert it to a VTF. Move the VTF to your folder in tf\materials. Almost there! Now we just need to edit the VMT to tell it which texture to use, so add this to your VMT file:
    Code:
    "$blendmodulatetexture"    "relative_path_to_blendmod_texture"
    That's all you need to do! This is what your tf\materials\whatever folder should look like now

    [​IMG]

    Boot up hammer again to your example map (NOTE: Blend modulate textures DO NOT DISPLAY or have any effect on the displacement in hammer, but the result will show up in-game.). I loaded up TF2 to my example texture and:
    [​IMG]
    A working blend texture. Apologies for forgetting to turn of the HUD.

    More about Blend Modulate Textures

    Extra Info

    Remember how the texture browser only shows one texture in your transition? If you want it to display both, create a third image (in Photoshop or Paint.NET or GIMP, etc.) that shows both textures, convert to VTF, copy to the folder with your other files in "tf\materials" and add this line to your VMT:
    Code:
    "%tooltexture"  "path_to_preview_texture"
    
    WorldVertexTransition supports many other parameters. You can specify a different surfaceprop for the second texture in the same way as you did the first by adding:
    Code:
    "$surfaceprop2"    "rock"
    Here's an example Valve one (this utilizes bump mapping as well, which is outside the scope of this tutorial.)
    Code:
    "WorldVertexTransition"
    {
    	"$basetexture" "Nature/dirtground007"
    	"$basetexture2" "Nature/rockground007"
    	"%tooltexture" "Nature/grass_02"
    	"%detailtype" "tf_granary_grass"
    	"%keywords" "tf"
    	"$bumpmap" "Nature/dirtground005_height-ssbump"
    	"$ssbump" "1"
    	"$surfaceprop" "dirt"
    }
    
    Have fun! If this was helpful, if you have a question, or if you have a critique, post a reply below. Happy mapping. :thumbup1:
     
    • Thanks Thanks x 21
    • Like Like x 1
    Last edited: Feb 20, 2010
  2. Ravidge

    aa Ravidge Grand Vizier

    Messages:
    1,544
    Positive Ratings:
    2,518
    Nice! Making custom blends is something everyone should know and utilize.

    You don't need to extract the textures though if you're not going to edit them. Just reference their path as they are in the gcf! No need to add custom textures that aren't really custom.
     
    • Thanks Thanks x 2
  3. Cynick

    Cynick L4: Comfortable Member

    Messages:
    153
    Positive Ratings:
    143
    Never even thought of that. Thanks! :thumbup:
    Edited the OP.
     
    • Thanks Thanks x 1
    Last edited: Feb 19, 2010
  4. Exist

    Exist L6: Sharp Member

    Messages:
    306
    Positive Ratings:
    136
    Iv'e known this

    You can also do this with valves textures, without removing them from the GCF

    Just use the file path from in side the gcf, most of them are found in Nature/

    Also, you can edit the texture in the browser by editing the VMT with $toolstiptexture (I think thats it atlest)
     
    • Thanks Thanks x 1
    Last edited: Feb 19, 2010
  5. Dustoxx

    Dustoxx L6: Sharp Member

    Messages:
    304
    Positive Ratings:
    43
    This is so helpfull! I never knew how this worked, thank you so much! :D
     
  6. Cynick

    Cynick L4: Comfortable Member

    Messages:
    153
    Positive Ratings:
    143
    I mentioned that in the bottom of the post. (under Extra Info) ;)
    It's "%tooltexture"
     
  7. YM

    aa YM LVL100 YM

    Messages:
    7,099
    Positive Ratings:
    5,920
    Blend textures without blend modulates might as well be a solid texture. Evidence:

    Without vs With.
    [​IMG]

    Please add this to your tutorial, finish the job please!!
     
    • Thanks Thanks x 1
    Last edited: Feb 19, 2010
  8. Cynick

    Cynick L4: Comfortable Member

    Messages:
    153
    Positive Ratings:
    143
    I saw that and I was going to add it but it wasn't in any of the tf2 materials I looked at. I realized (later) that it would be more useful in a terrain->flat (e.g. concrete) blend. I checked out a grass->concrete blend and lo and behold, there it was. Will edit the OP momentarily.

    EDIT: Am getting "500 internal server error" trying to edit the post. Will try again in a few minutes.
    EDIT 2: I have concluded that the forum doesn't like copy/paste. I have to retype all the stuff from the edit. :(
    EDIT 9001: I'll have to get this up tomorrow, every time I copy/paste my post out of the backup file I have, it gives me a 500 server error when I save.
     
    Last edited: Feb 19, 2010
  9. YM

    aa YM LVL100 YM

    Messages:
    7,099
    Positive Ratings:
    5,920
    uhhhh There are blend modulates for every blended tf2 texture I know of.. all the snow, all the dirt grounds, all the grass to dirt, all the dirt to concrete.

    I can't think of any that don't have a blend modulate.
     
  10. Cynick

    Cynick L4: Comfortable Member

    Messages:
    153
    Positive Ratings:
    143
    I didn't see one in the nature/blendgrassground001.vmt file, which is the one I looked at to make this tutorial in the first place. Either way, Step #5 (now up) is blend modulate textures!

    I found the error BTW, whenever I typed "from" in my edit, it would throw an error. :confused:
     
  11. grazr

    aa grazr Old Man Mutant Ninja Turtle

    Messages:
    5,436
    Positive Ratings:
    3,768
    edit again: Er, so what's this modulate? a texture showing the 2 alpha versions? Or some vmt parameter?
     
    Last edited: Feb 20, 2010
  12. Cynick

    Cynick L4: Comfortable Member

    Messages:
    153
    Positive Ratings:
    143
    Basically, it "stamps" a pattern on the transition between texture 1 and texture 2. This keeps the transition from looking flat. The green channel shows the pattern that is stamped on the edge, and the red channel controls the sharpness of the transition.
     
  13. aweaklingchild

    aweaklingchild L1: Registered

    Messages:
    19
    Positive Ratings:
    2
    Thanks for this!
     
  14. honeymustard

    honeymustard L9: Fashionable Member

    Messages:
    698
    Positive Ratings:
    285
    Blend ground to concrete (the one used on freight) doesn't have one. That's all I can think of though :p
     
  15. YM

    aa YM LVL100 YM

    Messages:
    7,099
    Positive Ratings:
    5,920
    Whilst I'm not 100% sure cause I don't play freight, I'd say that isn't a valve blend since valve have a dirt to concrete used in hydro that does have a modulate
     
  16. honeymustard

    honeymustard L9: Fashionable Member

    Messages:
    698
    Positive Ratings:
    285
    [​IMG]

    It's these two I was talking about. I just found out that only the one on the left doesn't use one (the line is commented out). So that's kind of weird.

    edit: just had a better look at both textures and the modulate texture one uses. Both textures use the same ground texture but different concrete textures, and the one with the modulate texture is specific to the concrete (so the ground fills the cracks of the concrete). Which is why I guess there isn't one for the other texture, as Valve probably didn't use it (they used the other in Hydro, I guess!)

    edit: turns out there is a modulate texture for the other concrete, it's just not listed in the vmt for whatever reason.
     
    Last edited: Feb 21, 2010
  17. Jetti

    Jetti L5: Dapper Member

    Messages:
    226
    Positive Ratings:
    111
    I'm having some problems. The blend texture works fine. Its just that I have one texture really large, and the other I would want very small. Picture gravel on a large concrete block. The gravel in the texture I am currently using is very big, where I want it to be almost 8 times smaller. The texture scale on the face is set to 0.75, but to get the gravel to look good, it has to be 0.1...

    My VMT is currently:
    "WorldVertexTransition"
    {
    "$basetexture" "custom\gravelground001"
    "$basetexture2" "custom\wall030"
    "$surfaceprop" "concrete"
    "%keywords" "tf"
    }

    What would I do to make the gravel smaller, but keep the Wall030 the same size?
     
  18. 3Dnj

    aa 3Dnj Ducks

    Messages:
    289
    Positive Ratings:
    589
    I think the two textures have to be on the same resolution but you can try $basetexturetransform to change the scale of your texture, it probably doesn't work with this shader.
     
  19. Cynick

    Cynick L4: Comfortable Member

    Messages:
    153
    Positive Ratings:
    143
    Code:
    $basetexturetransform "center .5 .5 [B]scale 0.1 0.1[/B] rotate 0 translate 0 0" //Decreases the scale of texture 1 to 0.1
    Copy that line into your VMT and it should work ($basetexturetransform2 does the same thing to the other texture)


    Also, 3dnj, i'm not sure either if the textures need to be the same size, but it's possible.
     
  20. Jetti

    Jetti L5: Dapper Member

    Messages:
    226
    Positive Ratings:
    111
    Cynick, I think you misunderstand the basetexturetransfrom scale.

    scale 0.1 0.1 makes it 10 times bigger. scale 2 2 makes it half as big.

    I have set it to scale 7 7, but this makes both 7 times smaller. It isn't working! D:

    EDIT:

    Currently at:
    "WorldVertexTransition"
    {
    "$basetexture" "custom\gravelground001"
    "$basetexture2" "custom\wall030"
    "$surfaceprop" "concrete"
    "%keywords" "tf"
    $basetexturetransform "center .5 .5 scale 7 7 rotate 0 translate 0 0"
    $basetexturetransform2 "center .5 .5 scale 1 1 rotate 0 translate 0 0"
    }
    Still not working.
     
    Last edited: Dec 12, 2010