public void ExportingColorTest() { { var smoothness = 1.0f; Assert.That( OcclusionMetallicRoughnessConverter.ExportPixel(new Color32(255, 255, 255, 255), smoothness, default), // r <- 0 : (Unused) // g <- 0 : ((1 - src.a(as float) * smoothness) ^ 2)(as uint8) // b <- 255 : Same metallic (src.r) // a <- 255 : (Unused) Is.EqualTo(new Color32(0, 0, 255, 255))); } { var smoothness = 0.5f; Assert.That( OcclusionMetallicRoughnessConverter.ExportPixel(new Color32(255, 255, 255, 255), smoothness, default), // r <- 0 : (Unused) // g <- 63 : ((1 - src.a(as float) * smoothness) ^ 2)(as uint8) // b <- 255 : Same metallic (src.r) // a <- 255 : (Unused) Is.EqualTo(new Color32(0, 127, 255, 255))); } { var smoothness = 0.0f; Assert.That( OcclusionMetallicRoughnessConverter.ExportPixel(new Color32(255, 255, 255, 255), smoothness, default), // r <- 0 : (Unused) // g <- 255 : ((1 - src.a(as float) * smoothness) ^ 2)(as uint8) // b <- 255 : Same metallic (src.r) // a <- 255 : (Unused) Is.EqualTo(new Color32(0, 255, 255, 255))); } }
/// <summary> /// Standard の Metallic, Smoothness, Occlusion をまとめ、index を確定させる /// </summary> /// <param name="metallicSmoothTexture"></param> /// <param name="smoothness"></param> /// <param name="occlusionTexture"></param> /// <returns></returns> public int ExportMetallicSmoothnessOcclusion(Texture metallicSmoothTexture, float smoothness, Texture occlusionTexture) { if (metallicSmoothTexture == null && occlusionTexture == null) { return(-1); } // cache if (metallicSmoothTexture != null && m_exportMap.TryGetValue(new ExportKey(metallicSmoothTexture, ConvertTypes.OcclusionMetallicRoughness), out var index)) { return(index); } if (occlusionTexture != null && m_exportMap.TryGetValue(new ExportKey(occlusionTexture, ConvertTypes.OcclusionMetallicRoughness), out index)) { return(index); } // // Unity と glTF で互換性が無いので必ず変換が必用 // index = Exported.Count; var texture2D = OcclusionMetallicRoughnessConverter.Export(metallicSmoothTexture, smoothness, occlusionTexture); Exported.Add(texture2D); if (metallicSmoothTexture != null) { m_exportMap.Add(new ExportKey(metallicSmoothTexture, ConvertTypes.OcclusionMetallicRoughness), index); } if (occlusionTexture != null && occlusionTexture != metallicSmoothTexture) { m_exportMap.Add(new ExportKey(occlusionTexture, ConvertTypes.OcclusionMetallicRoughness), index); } return(index); }
private Color32 ImportPixel(Color32 metallicRoughnessPixel, float metallicFactor, float roughnessFactor, Color32 occlusionPixel) { var metallicRoughnessTexture = new Texture2D(4, 4, TextureFormat.ARGB32, mipChain: false, linear: true); metallicRoughnessTexture.SetPixels32(Enumerable.Range(0, 16).Select(_ => metallicRoughnessPixel).ToArray()); metallicRoughnessTexture.Apply(); var occlusionTexture = new Texture2D(4, 4, TextureFormat.ARGB32, mipChain: false, linear: true); occlusionTexture.SetPixels32(Enumerable.Range(0, 16).Select(_ => occlusionPixel).ToArray()); occlusionTexture.Apply(); var converted = OcclusionMetallicRoughnessConverter.Import( metallicRoughnessTexture, metallicFactor, roughnessFactor, occlusionTexture, false ); var result = converted.GetPixels32()[0]; UnityEngine.Object.DestroyImmediate(metallicRoughnessTexture); UnityEngine.Object.DestroyImmediate(occlusionTexture); UnityEngine.Object.DestroyImmediate(converted); return(result); }
public void ImportingColorTest() { { var roughnessFactor = 1.0f; Assert.That( OcclusionMetallicRoughnessConverter.ImportPixel(new Color32(255, 255, 255, 255), 1.0f, roughnessFactor, default), // r <- 255 : Same metallic (src.r) // g <- 0 : (Unused) // b <- 0 : (Unused) // a <- 0 : ((1 - sqrt(src.g(as float) * roughnessFactor)))(as uint8) Is.EqualTo(new Color32(255, 0, 0, 0))); } { var roughnessFactor = 1.0f; Assert.That( OcclusionMetallicRoughnessConverter.ImportPixel(new Color32(255, 128, 255, 255), 1.0f, roughnessFactor, default), // r <- 255 : Same metallic (src.r) // g <- 0 : (Unused) // b <- 0 : (Unused) // a <- 128 : ((1 - sqrt(src.g(as float) * roughnessFactor)))(as uint8) Is.EqualTo(new Color32(255, 0, 0, 127))); // smoothness 0.5 * src.a 1.0 } { var roughnessFactor = 0.5f; Assert.That( OcclusionMetallicRoughnessConverter.ImportPixel(new Color32(255, 255, 255, 255), 1.0f, roughnessFactor, default), // r <- 255 : Same metallic (src.r) // g <- 0 : (Unused) // b <- 0 : (Unused) // a <- 74 : ((1 - sqrt(src.g(as float) * roughnessFactor)))(as uint8) Is.EqualTo(new Color32(255, 0, 0, 127))); } { var roughnessFactor = 0.0f; Assert.That( OcclusionMetallicRoughnessConverter.ImportPixel(new Color32(255, 255, 255, 255), 1.0f, roughnessFactor, default), // r <- 255 : Same metallic (src.r) // g <- 0 : (Unused) // b <- 0 : (Unused) // a <- 255 : ((1 - sqrt(src.g(as float) * roughnessFactor)))(as uint8) Is.EqualTo(new Color32(255, 0, 0, 255))); } }
/// <summary> /// テクスチャ生成情報を基に、テクスチャ生成を行う。 /// SubAssetKey が同じ場合はキャッシュを返す。 /// </summary> public async Task <Texture> GetTextureAsync(TextureDescriptor texDesc, IAwaitCaller awaitCaller) { var subAssetKey = texDesc.SubAssetKey; if (_externalMap != null && _externalMap.TryGetValue(subAssetKey, out var externalTexture)) { return(externalTexture); } if (_textureCache.TryGetValue(subAssetKey, out var cachedTexture)) { return(cachedTexture); } switch (texDesc.TextureType) { case TextureImportTypes.NormalMap: { // no conversion. Unity's normal map is same with glTF's. // // > contrary to Unity’s usual convention of using Y as “up” // https://docs.unity3d.com/2018.4/Documentation/Manual/StandardShaderMaterialParameterNormalMap.html var data0 = await texDesc.Index0(); var rawTexture = await TextureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.Linear, awaitCaller); rawTexture.name = subAssetKey.Name; rawTexture.SetSampler(texDesc.Sampler); _textureCache.Add(subAssetKey, rawTexture); return(rawTexture); } case TextureImportTypes.StandardMap: { Texture2D metallicRoughnessTexture = default; Texture2D occlusionTexture = default; if (texDesc.Index0 != null) { var data0 = await texDesc.Index0(); metallicRoughnessTexture = await TextureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.Linear, awaitCaller); } if (texDesc.Index1 != null) { var data1 = await texDesc.Index1(); occlusionTexture = await TextureDeserializer.LoadTextureAsync(data1, texDesc.Sampler.EnableMipMap, ColorSpace.Linear, awaitCaller); } var combinedTexture = OcclusionMetallicRoughnessConverter.Import(metallicRoughnessTexture, texDesc.MetallicFactor, texDesc.RoughnessFactor, occlusionTexture, _isLegacySquaredRoughness); combinedTexture.name = subAssetKey.Name; combinedTexture.SetSampler(texDesc.Sampler); _textureCache.Add(subAssetKey, combinedTexture); UnityObjectDestoyer.DestroyRuntimeOrEditor(metallicRoughnessTexture); UnityObjectDestoyer.DestroyRuntimeOrEditor(occlusionTexture); return(combinedTexture); } case TextureImportTypes.sRGB: { var data0 = await texDesc.Index0(); var rawTexture = await TextureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.sRGB, awaitCaller); rawTexture.name = subAssetKey.Name; rawTexture.SetSampler(texDesc.Sampler); _textureCache.Add(subAssetKey, rawTexture); return(rawTexture); } case TextureImportTypes.Linear: { var data0 = await texDesc.Index0(); var rawTexture = await TextureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.Linear, awaitCaller); rawTexture.name = subAssetKey.Name; rawTexture.SetSampler(texDesc.Sampler); _textureCache.Add(subAssetKey, rawTexture); return(rawTexture); } default: throw new ArgumentOutOfRangeException(); } }