Skip to content

Instantly share code, notes, and snippets.

@hwei
Created April 27, 2015 09:26
Show Gist options
  • Save hwei/c1eae657b44f3436702a to your computer and use it in GitHub Desktop.
Save hwei/c1eae657b44f3436702a to your computer and use it in GitHub Desktop.
Convert matcap to cubemap (Unity 5.0)
using UnityEngine;
using UnityEditor;
public class MatcapToCubemap : ScriptableWizard {
public Texture matcap;
public float emissionScale = 1f;
public int size = 256;
void OnWizardUpdate () {
this.isValid = this.matcap != null;
}
void OnWizardCreate () {
var sphere = GameObject.CreatePrimitive (PrimitiveType.Sphere);
sphere.transform.position = new Vector3 (
Random.Range (1000, 2000),
Random.Range (1000, 2000),
Random.Range (1000, 2000));
var meshFilter = sphere.GetComponent<MeshFilter> ();
var mesh = Object.Instantiate (meshFilter.sharedMesh);
var normals = mesh.normals;
var uv = mesh.uv;
for (int i = 0; i < normals.Length; ++i) {
var n = normals[i];
normals[i] = -n;
uv[i] = new Vector2 (n.x + 1f, n.y + 1f) * 0.5f;
}
mesh.normals = normals;
mesh.uv = uv;
var triangles = mesh.triangles;
for (int i = 0; i < triangles.Length; i+=3) {
var a = triangles[i];
var b = triangles[i + 1];
triangles[i] = b;
triangles[i + 1] = a;
}
mesh.triangles = triangles;
meshFilter.mesh = mesh;
var shader = Shader.Find ("Standard");
var mat = new Material (shader);
mat.color = Color.black;
mat.SetTexture ("_EmissionMap", matcap);
mat.SetColor ("_EmissionColor", Color.white);
mat.SetFloat ("_EmissionScaleUI", this.emissionScale);
mat.shaderKeywords = new string[] {"_EMISSION"};
var meshRenderer = sphere.GetComponent<MeshRenderer> ();
meshRenderer.material = mat;
var cubemap = new Cubemap (this.size, TextureFormat.ARGB32, false);
var camera = sphere.AddComponent<Camera> ();
camera.nearClipPlane = 0.01f;
camera.farClipPlane = 10f;
camera.RenderToCubemap (cubemap);
DestroyImmediate (sphere);
var tex2d = new Texture2D (this.size, this.size * 6, TextureFormat.ARGB32, false);
var faceList = new CubemapFace[] {
CubemapFace.NegativeZ,
CubemapFace.PositiveZ,
CubemapFace.NegativeY,
CubemapFace.PositiveY,
CubemapFace.NegativeX,
CubemapFace.PositiveX,
};
for (int i = 0; i < 6; ++i) {
var pixels = cubemap.GetPixels (faceList[i]);
System.Array.Reverse (pixels);
for (int j = 0; j < this.size; ++j) {
System.Array.Reverse (pixels, j * this.size, this.size);
}
tex2d.SetPixels (0, i * this.size, this.size, this.size, pixels);
}
tex2d.Apply ();
var data = tex2d.EncodeToPNG ();
if (data != null) {
var path = EditorUtility.SaveFilePanelInProject (
"Save", "cubemap.png", "png", "Save the cubemap texture.");
System.IO.File.WriteAllBytes (path, data);
MatcapToCubemapAssetPostprocessor.cubmapPath = path;
AssetDatabase.ImportAsset (path);
}
}
[MenuItem ("Assets/Render cubemap from matcap")]
static void RenderCubemap () {
var wizard = ScriptableWizard.DisplayWizard <MatcapToCubemap> ("Render cubemap from matcap", "Render!");
var texture = Selection.activeObject as Texture;
if (texture != null) {
wizard.matcap = texture;
wizard.isValid = true;
}
}
}
public class MatcapToCubemapAssetPostprocessor : AssetPostprocessor {
static public string cubmapPath;
void OnPreprocessTexture () {
if (this.assetPath == cubmapPath) {
var textureImporter = this.assetImporter as TextureImporter;
textureImporter.textureType = TextureImporterType.Cubemap;
textureImporter.anisoLevel = 0;
textureImporter.generateCubemap = TextureImporterGenerateCubemap.AutoCubemap;
cubmapPath = null;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment