Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 9 commits into from
Apr 4, 2018
Merged
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