RenderToCubeMap keeps breaking from time to time, I don’t know why, so we ended up doing it manually.
Here’s what we’re sort of doing (this won’t work, I copy pasted various parts, so there’s stuff missing. And the whole “saving to a cubemap, and then saving to a png” is not really needed, but it’s done because we do something else in between, but anyway, it should give you an idea. PS: you may need to flip the final image upside down).
int layers = 0;
for (int i = 0; i < LayersToIgnore.Length; ++i) layers |= (1 << LayersToIgnore[i]);
goCamera.cullingMask = ~layers;
goCamera.targetTexture = rt;
Texture2D tex2 = new Texture2D(rt.width, rt.height, TextureFormat.RGBAFloat, false);
RenderTexture.active = rt;
go.transform.LookAt(go.transform.position + Vector3.up);
goCamera.Render();
tex2.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0);
sourceCubemap.SetPixels(tex2.GetPixels(), CubemapFace.PositiveY);
go.transform.LookAt(go.transform.position + Vector3.down);
goCamera.Render();
tex2.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0);
sourceCubemap.SetPixels(tex2.GetPixels(), CubemapFace.NegativeY);
go.transform.LookAt(go.transform.position + Vector3.right);
goCamera.Render();
tex2.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0);
sourceCubemap.SetPixels(tex2.GetPixels(), CubemapFace.PositiveX);
go.transform.LookAt(go.transform.position + Vector3.left);
goCamera.Render();
tex2.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0);
sourceCubemap.SetPixels(tex2.GetPixels(), CubemapFace.NegativeX);
go.transform.LookAt(go.transform.position + Vector3.forward);
goCamera.Render();
tex2.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0);
sourceCubemap.SetPixels(tex2.GetPixels(), CubemapFace.PositiveZ);
go.transform.LookAt(go.transform.position + Vector3.back);
goCamera.Render();
tex2.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0);
sourceCubemap.SetPixels(tex2.GetPixels(), CubemapFace.NegativeZ);
sourceCubemap.Apply();
for (int i = 0; i < 6; ++i)
{
tex.SetPixels(sourceCubemap.GetPixels((CubemapFace)i));
for (int x = 0; x < tex.width; x++)
{
for (int y = 0; y < tex.height; y++)
{
Color theColor = tex.GetPixel(x, y);
texFull.SetPixel(x + i * width, y, theColor);
}
}
}
string path = "Assets/Images/Cubemaps/" + filename + ".png";
File.WriteAllBytes(path, texFull.EncodeToPNG());