Download

Texture map compression

I wanted to get some advice seeing how other people do it. i usually have a lot of textures so i compress them in the RGBA channels of a texture.
For me it is like this. i have these maps

Base Color BC
Metallic MT
Roughens R
Normal N
Height H
Ambient Occlusion AO
Opacity O

If some one has any advice on Wich maps i sould add to make my textures look even better would be nice.
i compress them like this

Map one RGB - BC A - O
Map Two RGB - N A - Free
Map Tree R - MT G - R B - AO A - H

But if someone has someting better then that would be nice this is just advice not help.

I avoid using RGBA because it uses much more memory than RGB.

Metallic can often be black or white, so you don’t always need a separate texture for it.

I use

Base Color RGB
Normal RGB
G Roughess B Metallic/other R Ambient Occlusion

If metallic isn’t being used, for foliage as example, you can easily use it as an opacity mask instead.
Also if I need opacity and metallic, I can consider skipping out an the AO.
For situations I need height maps, mostly for vertex painting and blending, I don’t normally need metallic, so it can go there.

For best quality vs memory tradeoffs you really need to understand how these texture compressions work. So start by reading this.
http://www.reedbeta.com/blog/understanding-bcn-texture-compression-formats/

Another thing that affects textures is how you use them. Good example is height map. If you are using for POM you really want it to be in separate texture to save bandwith. POM takes multiple sample from texture so you don’t want to pollute texture caches and waste bandwith for channels that POM isn’t using. So height should be packed to single channel compressed non srgb texture.(Alpha/BC4)

Nice simple trick to know is that if your texture don’t have alpha channel but you read it it’s always 1. So this can be used to save memory without any additional cost for materials runtime or setup cost.

It’s also very important to know that default DXT1(default for rgb) compression can’t be used for data that is not dependant. Also r,g and b does not use same amounts of bits.(5,6,5). AO, roughness and metallic does not depend on each other so you should’t put them to same texture color channels. RGB and A is separately compressed on PC but not on mobile so this also can affect how you choose things. Texture size is also big deal. Metallic and AO can be usually use lot smaller texture size than color or roughness. So those should’t be on same texture because this make them size to be locked to each other.

What we use is this:
For albedo + roughness: Default rgba.(1byte per texel). For fully rough objects check compress without alpha to save 50%.(½byte per texel)
Normal map: Normalmap compression.(1byte per texel)
Optionals:
Metallic: alpha/BC4.(½byte per texel). Size is quarter or even smaller. So actual extra is about 1/8 byte per albedo map texel.
Emissive: Default rgb.(½byte per texel). Size is quarter or even smaller. So actual extra is about 1/8 byte per albedo map texel.
Opacity alpha/BC4.(½byte per texel). Size is quarter. So actual extra is about 1/8 byte per albedo map texel.
Height: alpha/BC4.(½byte per texel). Size is quarter or even smaller. So actual extra is about 1/8 byte per albedo map texel.

This way you get best control for quality vs memory and minimum amount of compression artefacts.

Okay that is help full info. so when you then just change the channels RGB that will increase the memory?