Created
April 27, 2015 09:26
-
-
Save hwei/c1eae657b44f3436702a to your computer and use it in GitHub Desktop.
Convert matcap to cubemap (Unity 5.0)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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