- Home /
Editing lightmaps through code
Hello!
I'm currently working on a game with a cel-shaded look. However baking out lights for our environments results in a standard lightmodel being baked, which clashes with the visual style. I came up with the idea to hook a little editor script into the lightmapper that takes the baked lightmaps and re-clamps their grayscale values to mimick the new lightmodel.
However I seem to run into trouble when accessing the texture's pixels. Normally I'd use Texture2D.GetPixels and SetPixels, but since Unity-generated lightmaps are compressed into a DXT5 format I cannot use this. I've managed to eventually get the data by creating a copy in-memory and editing that, but I can't figure out how to assign it again. Here's the relevant code:
Texture2D lightmap = AssetDatabase.LoadAssetAtPath<Texture2D>(p);
Texture2D texcopy = new Texture2D(lightmap.width, lightmap.height, TextureFormat.RGB24, false);
texcopy.LoadImage(lightmap.GetRawTextureData());
Color[] pixels = texcopy.GetPixels();
for (int i = 0; i < pixels.Length; ++i)
{
//Change all the pixels here
}
texcopy.SetPixels(pixels);
texcopy.Apply();
//Here it seems to break?
lightmap.LoadImage(texcopy.GetRawTextureData());
EditorUtility.CompressTexture(lightmap, TextureFormat.DXT1, TextureCompressionQuality.Best);
lightmap.Apply();
DestroyImmediate(texcopy); //This might not be needed, but cleanup to be sure
Anyone knows how to properly assign this, or perhaps knows a way to edit the texture's pixels without needing to make a copy?
Your answer
Follow this Question
Related Questions
How do I resize the Lightmap Array via Editor Script? 1 Answer
Assigning UV Map to model at runtime 0 Answers
How to import lightmapped objects from Blender. 0 Answers
How can I efficiently determine that certain parts of a texture have a specific color? 1 Answer
How to compress NPOT texture 1 Answer