Skip to content

Commit

Permalink
Fix export of metallic and normal texture map. Add support for any sh…
Browse files Browse the repository at this point in the history
…ader that can support metallic roughness workflow. (#133)

* Fix export of metallic and normal texture map. Add support for any shader that can support metallic roughness workflow.

* Addressed feedback
- Use Graphics.blit to speed up texture read/write
- Update texture image paths to use full paths to avoid name collision
- Don't do anything if user cancels the dialog

* Revert irrelevant files

* Fix indentation

* Update accessor for structs and enum

* Update formatting

* Address feedback

* Remove exporter dependency on UnityEditor.
  • Loading branch information
justinctlam authored and Blake Gross committed Apr 4, 2018
1 parent b63e529 commit 9d5a2df
Show file tree
Hide file tree
Showing 12 changed files with 380 additions and 89 deletions.
61 changes: 61 additions & 0 deletions UnityGLTF/Assets/Resources/MetalGlossChannelSwap.shader
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
Shader "Hidden/MetalGlossChannelSwap"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always

Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag

#include "UnityCG.cginc"

struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};

struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};

v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}

sampler2D _MainTex;

float4 frag (v2f i) : SV_Target
{
float4 col = tex2D(_MainTex, i.uv);
// From the GLTF 2.0 spec
// The metallic-roughness texture. The metalness values are sampled from the B channel.
// The roughness values are sampled from the G channel. These values are linear.
// If other channels are present (R or A), they are ignored for metallic-roughness calculations.
//
// Unity, by default, puts metallic in R channel and glossiness in A channel.
// Unity uses a metallic-gloss texture so we need to invert the value in the g channel.
//
// Conversion Summary
// Unity R channel goes into B channel
// Unity A channel goes into G channel, then inverted
return float4(1, 1 - col.a, col.r, 1);
}
ENDCG
}
}
}
10 changes: 10 additions & 0 deletions UnityGLTF/Assets/Resources/MetalGlossChannelSwap.shader.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

52 changes: 52 additions & 0 deletions UnityGLTF/Assets/Resources/NormalChannel.shader
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
Shader "Hidden/NormalChannel"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always

Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag

#include "UnityCG.cginc"

struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};

struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};

v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}

sampler2D _MainTex;

fixed4 frag (v2f i) : SV_Target
{
float4 col = tex2D(_MainTex, i.uv);
// If a texture is marked as a normal map
// the values are stored in the A and G channel.
return float4(col.a, col.g, 1, 1);
}
ENDCG
}
}
}
10 changes: 10 additions & 0 deletions UnityGLTF/Assets/Resources/NormalChannel.shader.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 6 additions & 1 deletion UnityGLTF/Assets/UnityGLTF/Examples/GLTFExporterTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,15 @@ namespace UnityGLTF.Examples
{
public class GLTFExporterTest : MonoBehaviour
{
public string RetrieveTexturePath(UnityEngine.Texture texture)
{
return texture.name;
}

// Use this for initialization
void Awake()
{
var exporter = new GLTFSceneExporter(new[] {transform});
var exporter = new GLTFSceneExporter(new[] {transform}, RetrieveTexturePath);
var appPath = Application.dataPath;
var wwwPath = appPath.Substring(0, appPath.LastIndexOf("Assets")) + "www";
exporter.SaveGLTFandBin(Path.Combine(wwwPath, "TestScene"), "TestScene");
Expand Down
Empty file.
Empty file.
18 changes: 14 additions & 4 deletions UnityGLTF/Assets/UnityGLTF/Scripts/Editor/GLTFExportMenu.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@

public class GLTFExportMenu
{
public static string RetrieveTexturePath(UnityEngine.Texture texture)
{
return AssetDatabase.GetAssetPath (texture);
}

[MenuItem("GLTF/Export Selected")]
static void ExportSelected()
{
Expand All @@ -16,9 +21,12 @@ static void ExportSelected()
else
throw new Exception("No objects selected, cannot export.");

var exporter = new GLTFSceneExporter(Selection.transforms);
var exporter = new GLTFSceneExporter(Selection.transforms, RetrieveTexturePath);

var path = EditorUtility.OpenFolderPanel("glTF Export Path", "", "");
exporter.SaveGLTFandBin(path, name);
if (!string.IsNullOrEmpty(path)) {
exporter.SaveGLTFandBin (path, name);
}
}

[MenuItem("GLTF/Export Scene")]
Expand All @@ -28,8 +36,10 @@ static void ExportScene()
var gameObjects = scene.GetRootGameObjects();
var transforms = Array.ConvertAll(gameObjects, gameObject => gameObject.transform);

var exporter = new GLTFSceneExporter(transforms);
var exporter = new GLTFSceneExporter(transforms, RetrieveTexturePath);
var path = EditorUtility.OpenFolderPanel("glTF Export Path", "", "");
exporter.SaveGLTFandBin(path, scene.name);
if (path != "") {
exporter.SaveGLTFandBin (path, scene.name);
}
}
}
2 changes: 0 additions & 2 deletions UnityGLTF/Assets/UnityGLTF/Scripts/Editor/PbrShaderGUI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,6 @@ private static class Styles
MaterialProperty bumpMap = null;
MaterialProperty occlusionStrength = null;
MaterialProperty occlusionMap = null;
MaterialProperty heigtMapScale = null;
MaterialProperty heightMap = null;
MaterialProperty emissionColor = null;
MaterialProperty emissionMap = null;

Expand Down
10 changes: 5 additions & 5 deletions UnityGLTF/Assets/UnityGLTF/Scripts/GLTFComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@ IEnumerator Start()
ILoader loader = null;

if (UseStream)
{
// Path.Combine treats paths that start with the separator character
// as absolute paths, ignoring the first path passed in. This removes
// that character to properly handle a filename written with it.
GLTFUri = GLTFUri.TrimStart(new[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar });
{
// Path.Combine treats paths that start with the separator character
// as absolute paths, ignoring the first path passed in. This removes
// that character to properly handle a filename written with it.
GLTFUri = GLTFUri.TrimStart(new[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar });
string fullPath = Path.Combine(Application.streamingAssetsPath, GLTFUri);
string directoryPath = URIHelper.GetDirectoryName(fullPath);
loader = new FileLoader(directoryPath);
Expand Down
Loading

0 comments on commit 9d5a2df

Please sign in to comment.