squash commits
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e4668f2c206f7344488bbf14e0b42a99
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,183 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: SSS Material
|
||||
m_Shader: {fileID: 4800000, guid: dd867f0212ded544396217ac461f949c, type: 3}
|
||||
m_ValidKeywords:
|
||||
- _METALLICGLOSSMAP
|
||||
m_InvalidKeywords:
|
||||
- _
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _AO:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _Albedo:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _BRDF:
|
||||
m_Texture: {fileID: 2800000, guid: 777d4a97dda93184980a90195afc5456, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _BRDFTex:
|
||||
m_Texture: {fileID: 2800000, guid: 438762e23bc56bf4188ce947bf60e0e3, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _BentNormal:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 2800000, guid: fc9ae852b7d50e9488f1a6a37f706a41, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _Cavity:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailBumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormal:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: d03b3b0a9f509bc45aa0629f22ce32fc, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 2800000, guid: d03b3b0a9f509bc45aa0629f22ce32fc, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _NormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 2800000, guid: d03b3b0a9f509bc45aa0629f22ce32fc, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OverlayMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _SmoothnessMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _SpecMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ThicknessMap:
|
||||
m_Texture: {fileID: 2800000, guid: d03b3b0a9f509bc45aa0629f22ce32fc, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _texcoord:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _texcoord2:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _BumpScale: 0.55
|
||||
- _CullMode: 2
|
||||
- _CurveBias: 0.005
|
||||
- _Cutoff: 0.5
|
||||
- _Cutout: 0.5
|
||||
- _DetailBumpMapScale: 1
|
||||
- _DetailIntensity: 1
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 0.531
|
||||
- _Glossiness: 0
|
||||
- _GlossyReflections: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 0
|
||||
- _NormalDistortion: 1
|
||||
- _OcclusionStrength: 0.07
|
||||
- _OcclusionUVSource: 0
|
||||
- _Parallax: 0.02
|
||||
- _Rim: 3.22
|
||||
- _RimPower: 3.22
|
||||
- _SSSAmbient: 0.1
|
||||
- _SSSDist: 7.62
|
||||
- _SSSIntensity: 0
|
||||
- _SSSPow: 6.03
|
||||
- _SSSShadow: 1
|
||||
- _Scale: 1
|
||||
- _ScatteringByAlbedo: 1
|
||||
- _SecondUVSource: 0
|
||||
- _SkinDetailTiling: 1
|
||||
- _Smoothness: 0.7
|
||||
- _SmoothnessFromAlbedo: 1
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _Thickness: 1
|
||||
- _ThicknessMapInvert: 1
|
||||
- _ThicknessMapPower: 1
|
||||
- _ThicknessUVSource: 0
|
||||
- _TranslucentPower: 1
|
||||
- _UVSec: 0
|
||||
- _UseAlphaToMask: 0
|
||||
- _UseCutout: 0
|
||||
- _UseSkinScattering: 1
|
||||
- _WrappingFactor: 1
|
||||
- _WrappingPowerFactor: 1
|
||||
- _ZWrite: 1
|
||||
- __dirty: 1
|
||||
m_Colors:
|
||||
- _AlbedoTinting: {r: 1, g: 1, b: 1, a: 0}
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 0}
|
||||
- _OverlayColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _SSSCol: {r: 1, g: 0.1660024, b: 0, a: 1}
|
||||
- _SecondarySpecLobeColor: {r: 1, g: 1, b: 1, a: 0}
|
||||
- _SpecTint: {r: 1, g: 1, b: 1, a: 0}
|
||||
- _SubSurfaceColor: {r: 1, g: 0.5804797, b: 0.37846017, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
@@ -0,0 +1,15 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5c6dd6ed5e185c742a48649027e86903
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 35611
|
||||
packageName: UMA 2
|
||||
packageVersion: 2.13
|
||||
assetPath: Assets/UMA/Content/SkinShaders/Materials/SSS Material.mat
|
||||
uploadId: 679826
|
||||
@@ -0,0 +1,203 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: SSS SRP Material
|
||||
m_Shader: {fileID: -6465566751694194690, guid: e2c95817ac413714c8f36b80020c9867,
|
||||
type: 3}
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords:
|
||||
- _
|
||||
- _METALLICGLOSSMAP
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _AO:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _Albedo:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _BRDF:
|
||||
m_Texture: {fileID: 2800000, guid: 777d4a97dda93184980a90195afc5456, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _BRDFTex:
|
||||
m_Texture: {fileID: 2800000, guid: 438762e23bc56bf4188ce947bf60e0e3, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _BaseMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _BentNormal:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 2800000, guid: fc9ae852b7d50e9488f1a6a37f706a41, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _Cavity:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailBumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormal:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: d03b3b0a9f509bc45aa0629f22ce32fc, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 2800000, guid: d03b3b0a9f509bc45aa0629f22ce32fc, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _NormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 2800000, guid: d03b3b0a9f509bc45aa0629f22ce32fc, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OverlayMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _SmoothnessMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _SpecMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ThicknessMap:
|
||||
m_Texture: {fileID: 2800000, guid: d03b3b0a9f509bc45aa0629f22ce32fc, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _texcoord:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _texcoord2:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _BumpScale: 0.55
|
||||
- _ColorModulation: 1.6
|
||||
- _CullMode: 2
|
||||
- _CurveBias: 0.005
|
||||
- _Cutoff: 0.5
|
||||
- _Cutout: 0.5
|
||||
- _DetailBumpMapScale: 1
|
||||
- _DetailIntensity: 1
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DoubleSidedNormalMode: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 0.81
|
||||
- _Glossiness: 0
|
||||
- _GlossyReflections: 1
|
||||
- _HalfLambertStrength: 4.5
|
||||
- _InvertThickness: 1
|
||||
- _Metallic: 0.24
|
||||
- _MetallicModulation: 1
|
||||
- _Mode: 0
|
||||
- _NormalDistortion: 1
|
||||
- _NormalStrength: 0.7
|
||||
- _OcclusionStrength: 0.07
|
||||
- _OcclusionUVSource: 0
|
||||
- _Parallax: 0.02
|
||||
- _Rim: 3.22
|
||||
- _RimLightPower: 4
|
||||
- _RimLightingModulation: 0
|
||||
- _RimPower: 3.22
|
||||
- _SSSAmbient: 0.1
|
||||
- _SSSDist: 7.62
|
||||
- _SSSGlow: 0.3
|
||||
- _SSSIntensity: 0
|
||||
- _SSSLevel: 0.306
|
||||
- _SSSPow: 6.03
|
||||
- _SSSShadow: 1
|
||||
- _Scale: 1
|
||||
- _ScatteringByAlbedo: 1
|
||||
- _SecondUVSource: 0
|
||||
- _SkinDetailTiling: 1
|
||||
- _Smoothness: 0.7
|
||||
- _SmoothnessFromAlbedo: 0
|
||||
- _SmoothnessModulation: 0.39
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _Thickness: 1
|
||||
- _ThicknessMapInvert: 1
|
||||
- _ThicknessMapPower: 1
|
||||
- _ThicknessUVSource: 0
|
||||
- _TranslucentPower: 1
|
||||
- _UVSec: 0
|
||||
- _UberTile: 1
|
||||
- _UseAlphaToMask: 0
|
||||
- _UseCutout: 0
|
||||
- _UseHalfLambert: 0
|
||||
- _UseSkinScattering: 1
|
||||
- _WrappingFactor: 1
|
||||
- _WrappingPowerFactor: 1
|
||||
- _ZWrite: 1
|
||||
- __dirty: 1
|
||||
m_Colors:
|
||||
- _AlbedoTinting: {r: 1, g: 1, b: 1, a: 0}
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 0}
|
||||
- _OverlayColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _RimLightColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _SSSCol: {r: 1, g: 0.1660024, b: 0, a: 1}
|
||||
- _SSSColor: {r: 1, g: 0.39999998, b: 0.39999998, a: 1}
|
||||
- _SecondarySpecLobeColor: {r: 1, g: 1, b: 1, a: 0}
|
||||
- _SpecTint: {r: 1, g: 1, b: 1, a: 0}
|
||||
- _SubSurfaceColor: {r: 1, g: 0.5804797, b: 0.37846017, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
@@ -0,0 +1,15 @@
|
||||
fileFormatVersion: 2
|
||||
guid: abff9986cf3b4fc4681d96078854c09c
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 35611
|
||||
packageName: UMA 2
|
||||
packageVersion: 2.13
|
||||
assetPath: Assets/UMA/Content/SkinShaders/Materials/SSS SRP Material.mat
|
||||
uploadId: 679826
|
||||
@@ -0,0 +1,92 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: ac718b8ce852d1445b8fbe5c323134ac, type: 3}
|
||||
m_Name: UMA SSS Material
|
||||
m_EditorClassIdentifier:
|
||||
translateSRP: 0
|
||||
_material: {fileID: 2100000, guid: 5c6dd6ed5e185c742a48649027e86903, type: 2}
|
||||
_secondPass: {fileID: 0}
|
||||
srpMaterials:
|
||||
- SRP: 1
|
||||
material: {fileID: 2100000, guid: 5c6dd6ed5e185c742a48649027e86903, type: 2}
|
||||
secondPass: {fileID: 0}
|
||||
alternateKeywords:
|
||||
- _MainTex
|
||||
- _BumpMap
|
||||
- _MetallicGlossMap
|
||||
- _OcclusionMap
|
||||
- _ThicknessMap
|
||||
- SRP: 2
|
||||
material: {fileID: 2100000, guid: abff9986cf3b4fc4681d96078854c09c, type: 2}
|
||||
secondPass: {fileID: 0}
|
||||
alternateKeywords:
|
||||
- _BaseMap
|
||||
- _BumpMap
|
||||
- _MetallicGlossMap
|
||||
- SRP: 3
|
||||
material: {fileID: 2100000, guid: abff9986cf3b4fc4681d96078854c09c, type: 2}
|
||||
secondPass: {fileID: 0}
|
||||
alternateKeywords:
|
||||
- _BaseMap
|
||||
- _BumpMap
|
||||
- _MetallicGlossMap
|
||||
materialType: 1
|
||||
channels:
|
||||
- channelType: 0
|
||||
textureFormat: 0
|
||||
materialPropertyName: _MainTex
|
||||
sourceTextureName:
|
||||
Compression: 0
|
||||
DownSample: 0
|
||||
ConvertRenderTexture: 0
|
||||
NonShaderTexture: 0
|
||||
- channelType: 0
|
||||
textureFormat: 0
|
||||
materialPropertyName: _BumpMap
|
||||
sourceTextureName:
|
||||
Compression: 0
|
||||
DownSample: 0
|
||||
ConvertRenderTexture: 0
|
||||
NonShaderTexture: 0
|
||||
- channelType: 0
|
||||
textureFormat: 0
|
||||
materialPropertyName: _MetallicGlossMap
|
||||
sourceTextureName:
|
||||
Compression: 0
|
||||
DownSample: 0
|
||||
ConvertRenderTexture: 0
|
||||
NonShaderTexture: 0
|
||||
- channelType: 0
|
||||
textureFormat: 0
|
||||
materialPropertyName: _OcclusionMap
|
||||
sourceTextureName:
|
||||
Compression: 0
|
||||
DownSample: 0
|
||||
ConvertRenderTexture: 0
|
||||
NonShaderTexture: 0
|
||||
- channelType: 0
|
||||
textureFormat: 0
|
||||
materialPropertyName: _ThicknessMap
|
||||
sourceTextureName:
|
||||
Compression: 0
|
||||
DownSample: 0
|
||||
ConvertRenderTexture: 0
|
||||
NonShaderTexture: 0
|
||||
MipMapBias: 0
|
||||
AnisoLevel: 1
|
||||
MatFilterMode: 1
|
||||
Compression: 0
|
||||
shaderParms: []
|
||||
MaskWithCurrentColor: 0
|
||||
maskMultiplier: {r: 1, g: 1, b: 1, a: 1}
|
||||
MaterialName:
|
||||
ShaderName:
|
||||
@@ -0,0 +1,15 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9baec5f7e5dc828408f9350562791968
|
||||
timeCreated: 1471987731
|
||||
licenseType: Store
|
||||
NativeFormatImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 35611
|
||||
packageName: UMA 2
|
||||
packageVersion: 2.13
|
||||
assetPath: Assets/UMA/Content/SkinShaders/Materials/UMA SSS Material.asset
|
||||
uploadId: 679826
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 073e3a878373d5e4fb83ef8af524f7ef
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 s-ilent
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,14 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ab6b5a62a0c0ada4ba16d514bf0bbda4
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 35611
|
||||
packageName: UMA 2
|
||||
packageVersion: 2.13
|
||||
assetPath: Assets/UMA/Content/SkinShaders/Shader/LICENSE.rtf
|
||||
uploadId: 679826
|
||||
@@ -0,0 +1,279 @@
|
||||
// Put together with Amplify's help.
|
||||
Shader "Custom/Subsurface Scattering"
|
||||
{
|
||||
Properties
|
||||
{
|
||||
[Header(Standard)]
|
||||
_Color ("Color", Color) = (1,1,1,1)
|
||||
_MainTex("Albedo", 2D) = "white" {}
|
||||
[NoScaleOffset][Normal]_BumpMap("Normal Map", 2D) = "bump" {}
|
||||
_BumpScale ("Normal Scale", Float) = 1
|
||||
[NoScaleOffset]_MetallicGlossMap("Metallic", 2D) = "black" {}
|
||||
_GlossMapScale("Smoothness", Range(0, 1)) = 1.0
|
||||
[Toggle(_)]_SmoothnessFromAlbedo("Smoothness stored in Albedo alpha", Float) = 0.0
|
||||
[NoScaleOffset]_OcclusionMap("Occlusion", 2D) = "white" {}
|
||||
_OcclusionStrength("Occlusion Strength", Range(0, 1)) = 1.0
|
||||
[Enum(UV1, 0, UV2, 1)] _OcclusionUVSource("Occlusion UV Source", Float) = 0
|
||||
|
||||
[Header(Detail)]
|
||||
[NoScaleOffset]_OverlayMap("Overlay", 2D) = "black" {}
|
||||
_OverlayColor ("Overlay Color", Color) = (1,1,1,1)
|
||||
[NoScaleOffset]_DetailMask("Detail Mask", 2D) = "white" {}
|
||||
[Normal]_DetailBumpMap("Detail Normal Map", 2D) = "bump" {}
|
||||
_DetailMetallicGlossMap("Detail Metallic", 2D) = "white" {}
|
||||
_DetailBumpMapScale ("Detail Scale", Float) = 1
|
||||
[Enum(UV1, 0, UV2, 1)] _SecondUVSource("Secondary UV Source", Float) = 0
|
||||
|
||||
[Header(SSS)]
|
||||
[NoScaleOffset]_ThicknessMap("Thickness Map", 2D) = "black" {}
|
||||
[Toggle(_)]_ThicknessMapInvert("Invert Thickness", Float) = 0.0
|
||||
_ThicknessMapPower ("Thickness Map Power", Range(0.01, 10)) = 1
|
||||
[Enum(UV1, 0, UV2, 1)] _ThicknessUVSource("Thickness UV Source", Float) = 0
|
||||
[Toggle(_)]_ScatteringByAlbedo("Tint Scattering with Albedo", Float) = 0.0
|
||||
_SSSCol ("Scattering Color", Color) = (1,1,1,1)
|
||||
_SSSIntensity ("Scattering Intensity", Range(0, 10)) = 1
|
||||
_SSSPow ("Scattering Power", Range(0.01, 10)) = 1
|
||||
_SSSDist ("Scattering Distance", Range(0, 10)) = 1
|
||||
_SSSAmbient ("Scattering Ambient Intensity", Range(0, 1)) = 0.1
|
||||
|
||||
[Header(System)]
|
||||
[Enum(UnityEngine.Rendering.CullMode)] _CullMode("Cull Mode", Float) = 2
|
||||
[ToggleOff(_SPECULARHIGHLIGHTS_OFF)]_SpecularHighlights ("Specular Highlights", Float) = 1.0
|
||||
[ToggleOff(_GLOSSYREFLECTIONS_OFF)]_GlossyReflections ("Glossy Reflections", Float) = 1.0
|
||||
[HideInInspector] _texcoord( "", 2D ) = "white" {}
|
||||
[HideInInspector] _texcoord2( "", 2D ) = "white" {}
|
||||
[HideInInspector] __dirty( "", Int ) = 1
|
||||
}
|
||||
|
||||
SubShader
|
||||
{
|
||||
Tags{ "RenderType" = "Opaque" "Queue" = "Geometry+0" }
|
||||
Cull[_CullMode]
|
||||
CGINCLUDE
|
||||
#include "UnityPBSLighting.cginc"
|
||||
#include "Lighting.cginc"
|
||||
#pragma target 3.0
|
||||
|
||||
#pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
|
||||
#pragma shader_feature _ _GLOSSYREFLECTIONS_OFF
|
||||
|
||||
#ifdef UNITY_PASS_SHADOWCASTER
|
||||
#undef INTERNAL_DATA
|
||||
#undef WorldReflectionVector
|
||||
#undef WorldNormalVector
|
||||
#define INTERNAL_DATA half3 internalSurfaceTtoW0; half3 internalSurfaceTtoW1; half3 internalSurfaceTtoW2;
|
||||
#define WorldReflectionVector(data,normal) reflect (data.worldRefl, half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal)))
|
||||
#define WorldNormalVector(data,normal) half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal))
|
||||
#endif
|
||||
struct Input
|
||||
{
|
||||
float3 worldNormal;
|
||||
INTERNAL_DATA
|
||||
float2 uv_texcoord;
|
||||
float2 uv2_texcoord2;
|
||||
};
|
||||
|
||||
struct SurfaceOutputCustomLightingCustom
|
||||
{
|
||||
half3 Albedo;
|
||||
half3 Normal;
|
||||
half3 Emission;
|
||||
half3 Specular;
|
||||
half Smoothness;
|
||||
half Occlusion;
|
||||
half Alpha;
|
||||
Input SurfInput;
|
||||
UnityGIInput GIData;
|
||||
};
|
||||
|
||||
uniform sampler2D _MainTex; uniform float4 _MainTex_ST;
|
||||
uniform sampler2D _BumpMap;
|
||||
uniform sampler2D _MetallicGlossMap;
|
||||
uniform sampler2D _OcclusionMap;
|
||||
uniform sampler2D _ThicknessMap;
|
||||
uniform sampler2D _OverlayMap;
|
||||
uniform sampler2D _DetailMask;
|
||||
uniform sampler2D _DetailBumpMap; uniform float4 _DetailBumpMap_ST;
|
||||
uniform sampler2D _DetailMetallicGlossMap; uniform float4 _DetailMetallicGlossMap_ST;
|
||||
|
||||
uniform float _ThicknessMapPower;
|
||||
uniform float _ThicknessMapInvert;
|
||||
uniform float3 _SSSCol;
|
||||
uniform float _SSSAmbient;
|
||||
uniform float _SSSIntensity;
|
||||
uniform float _SSSPow;
|
||||
uniform float _SSSDist;
|
||||
uniform float3 _Color;
|
||||
uniform float3 _OverlayColor;
|
||||
|
||||
uniform float _DetailBumpMapScale;
|
||||
uniform float _ScatteringByAlbedo;
|
||||
uniform float _SmoothnessFromAlbedo;
|
||||
uniform float _BumpScale;
|
||||
uniform float _OcclusionStrength;
|
||||
uniform float _GlossMapScale;
|
||||
|
||||
uniform float _SecondUVSource;
|
||||
uniform float _OcclusionUVSource;
|
||||
uniform float _ThicknessUVSource;
|
||||
|
||||
#include "SSS_Utils.cginc"
|
||||
|
||||
inline half4 LightingStandardCustomLighting( inout SurfaceOutputCustomLightingCustom s, half3 viewDir, UnityGI gi )
|
||||
{
|
||||
UnityGIInput data = s.GIData;
|
||||
Input i = s.SurfInput;
|
||||
half4 c = 0;
|
||||
SurfaceOutputStandard s1 = (SurfaceOutputStandard ) 0;
|
||||
float2 scaledUV = TRANSFORM_TEX(i.uv_texcoord, _MainTex);
|
||||
|
||||
float4 _MainTex_var = tex2D( _MainTex, scaledUV );
|
||||
float2 texcoord2 = _SecondUVSource? scaledUV : i.uv2_texcoord2;
|
||||
float detailMask = tex2D( _DetailMask, scaledUV ).a;
|
||||
|
||||
s1.Albedo = lerp(_MainTex_var.rgb * _Color, _OverlayColor, tex2D( _OverlayMap, texcoord2 ).rgb * detailMask);
|
||||
s1.Normal = WorldNormalVector( i , NormalInTangentSpace(scaledUV, texcoord2, detailMask) );
|
||||
s1.Normal = normalize(s1.Normal);
|
||||
s1.Emission = float3( 0,0,0 );
|
||||
float4 _MetallicGlossMap_var = tex2D( _MetallicGlossMap, scaledUV );
|
||||
float4 detailMetallicGlossMap_var = tex2D (_DetailMetallicGlossMap, TRANSFORM_TEX(texcoord2, _DetailMetallicGlossMap));
|
||||
_MetallicGlossMap_var *= lerp(1.0, detailMetallicGlossMap_var, detailMask);
|
||||
s1.Metallic = _MetallicGlossMap_var.r;
|
||||
s1.Smoothness = _SmoothnessFromAlbedo? _MainTex_var.a : _MetallicGlossMap_var.a;
|
||||
s1.Smoothness *= _GlossMapScale;
|
||||
s1.Smoothness = GeometricNormalFiltering(s1.Smoothness, i.worldNormal, 0.25, 0.5);
|
||||
float2 occlusionUV = _OcclusionUVSource? scaledUV : i.uv2_texcoord2;
|
||||
s1.Occlusion = LerpOneTo(tex2D( _OcclusionMap, occlusionUV ).g, _OcclusionStrength);
|
||||
|
||||
data.light = gi.light;
|
||||
|
||||
UnityGI gi1 = gi;
|
||||
#ifdef UNITY_PASS_FORWARDBASE
|
||||
Unity_GlossyEnvironmentData g1 = UnityGlossyEnvironmentSetup( s1.Smoothness, data.worldViewDir, s1.Normal, float3(0,0,0));
|
||||
gi1 = UnityGlobalIllumination( data, s1.Occlusion, s1.Normal, g1 );
|
||||
#endif
|
||||
|
||||
#ifdef UNITY_PASS_FORWARDBASE
|
||||
float ase_lightAtten = data.atten;
|
||||
if( _LightColor0.a == 0)
|
||||
ase_lightAtten = 0;
|
||||
#else
|
||||
float3 ase_lightAttenRGB = gi.light.color / ( ( _LightColor0.rgb ) + 0.000001 );
|
||||
float ase_lightAtten = max( max( ase_lightAttenRGB.r, ase_lightAttenRGB.g ), ase_lightAttenRGB.b );
|
||||
#endif
|
||||
#if defined(HANDLE_SHADOWS_BLENDING_IN_GI)
|
||||
half bakedAtten = UnitySampleBakedOcclusion(data.lightmapUV.xy, data.worldPos);
|
||||
float zDist = dot(_WorldSpaceCameraPos - data.worldPos, UNITY_MATRIX_V[2].xyz);
|
||||
float fadeDist = UnityComputeShadowFadeDistance(data.worldPos, zDist);
|
||||
ase_lightAtten = UnityMixRealtimeAndBakedShadows(data.atten, bakedAtten, UnityComputeShadowFade(fadeDist));
|
||||
#endif
|
||||
|
||||
float2 thicknessUV = _ThicknessUVSource? scaledUV : i.uv2_texcoord2;
|
||||
float3 thicknessMap_var = tex2D( _ThicknessMap, thicknessUV ).rgb;
|
||||
float3 lightDirection = Unity_SafeNormalize(_WorldSpaceLightPos0.xyz);
|
||||
|
||||
float3 subsurfaceColour = _ScatteringByAlbedo? _SSSCol*s1.Albedo : _SSSCol;
|
||||
|
||||
float3 finalResult = LightingStandard ( s1, viewDir, gi1 ).rgb;
|
||||
finalResult += getSubsurfaceScatteringLight(gi.light.color, gi.light.dir, s1.Normal, data.worldViewDir,
|
||||
ase_lightAtten, thicknessMap_var, gi1.indirect.diffuse, subsurfaceColour );
|
||||
finalResult += s1.Emission;
|
||||
|
||||
c.rgb = finalResult;
|
||||
c.a = 1;
|
||||
return c;
|
||||
}
|
||||
|
||||
inline void LightingStandardCustomLighting_GI( inout SurfaceOutputCustomLightingCustom s, UnityGIInput data, inout UnityGI gi )
|
||||
{
|
||||
s.GIData = data;
|
||||
}
|
||||
|
||||
void surf( Input i , inout SurfaceOutputCustomLightingCustom o )
|
||||
{
|
||||
o.SurfInput = i;
|
||||
o.Normal = float3(0,0,1);
|
||||
}
|
||||
|
||||
ENDCG
|
||||
CGPROGRAM
|
||||
#pragma surface surf StandardCustomLighting keepalpha fullforwardshadows
|
||||
|
||||
ENDCG
|
||||
Pass
|
||||
{
|
||||
Name "ShadowCaster"
|
||||
Tags{ "LightMode" = "ShadowCaster" }
|
||||
ZWrite On
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#pragma target 3.0
|
||||
#pragma multi_compile_shadowcaster
|
||||
#pragma multi_compile UNITY_PASS_SHADOWCASTER
|
||||
#pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2
|
||||
#include "HLSLSupport.cginc"
|
||||
#if ( SHADER_API_D3D11 || SHADER_API_GLCORE || SHADER_API_GLES3 || SHADER_API_METAL || SHADER_API_VULKAN )
|
||||
#define CAN_SKIP_VPOS
|
||||
#endif
|
||||
#include "UnityCG.cginc"
|
||||
#include "Lighting.cginc"
|
||||
#include "UnityPBSLighting.cginc"
|
||||
struct v2f
|
||||
{
|
||||
V2F_SHADOW_CASTER;
|
||||
float2 customPack1 : TEXCOORD1;
|
||||
float4 tSpace0 : TEXCOORD2;
|
||||
float4 tSpace1 : TEXCOORD3;
|
||||
float4 tSpace2 : TEXCOORD4;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
v2f vert( appdata_full v )
|
||||
{
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID( v );
|
||||
UNITY_INITIALIZE_OUTPUT( v2f, o );
|
||||
UNITY_TRANSFER_INSTANCE_ID( v, o );
|
||||
Input customInputData;
|
||||
float3 worldPos = mul( unity_ObjectToWorld, v.vertex ).xyz;
|
||||
half3 worldNormal = UnityObjectToWorldNormal( v.normal );
|
||||
half3 worldTangent = UnityObjectToWorldDir( v.tangent.xyz );
|
||||
half tangentSign = v.tangent.w * unity_WorldTransformParams.w;
|
||||
half3 worldBinormal = cross( worldNormal, worldTangent ) * tangentSign;
|
||||
o.tSpace0 = float4( worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x );
|
||||
o.tSpace1 = float4( worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y );
|
||||
o.tSpace2 = float4( worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z );
|
||||
o.customPack1.xy = customInputData.uv_texcoord;
|
||||
o.customPack1.xy = v.texcoord;
|
||||
TRANSFER_SHADOW_CASTER_NORMALOFFSET( o )
|
||||
return o;
|
||||
}
|
||||
half4 frag( v2f IN
|
||||
#if !defined( CAN_SKIP_VPOS )
|
||||
, UNITY_VPOS_TYPE vpos : VPOS
|
||||
#endif
|
||||
) : SV_Target
|
||||
{
|
||||
UNITY_SETUP_INSTANCE_ID( IN );
|
||||
Input surfIN;
|
||||
UNITY_INITIALIZE_OUTPUT( Input, surfIN );
|
||||
surfIN.uv_texcoord = IN.customPack1.xy;
|
||||
float3 worldPos = float3( IN.tSpace0.w, IN.tSpace1.w, IN.tSpace2.w );
|
||||
half3 worldViewDir = normalize( UnityWorldSpaceViewDir( worldPos ) );
|
||||
surfIN.worldNormal = float3( IN.tSpace0.z, IN.tSpace1.z, IN.tSpace2.z );
|
||||
surfIN.internalSurfaceTtoW0 = IN.tSpace0.xyz;
|
||||
surfIN.internalSurfaceTtoW1 = IN.tSpace1.xyz;
|
||||
surfIN.internalSurfaceTtoW2 = IN.tSpace2.xyz;
|
||||
SurfaceOutputCustomLightingCustom o;
|
||||
UNITY_INITIALIZE_OUTPUT( SurfaceOutputCustomLightingCustom, o )
|
||||
surf( surfIN, o );
|
||||
#if defined( CAN_SKIP_VPOS )
|
||||
float2 vpos = IN.pos;
|
||||
#endif
|
||||
SHADOW_CASTER_FRAGMENT( IN )
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
Fallback "Diffuse"
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a781225a8dde0884ebc7069212a16927
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
nonModifiableTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 35611
|
||||
packageName: UMA 2
|
||||
packageVersion: 2.13
|
||||
assetPath: Assets/UMA/Content/SkinShaders/Shader/SSS.shader
|
||||
uploadId: 679826
|
||||
@@ -0,0 +1,99 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// Helper functions
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
float RoughnessToPerceptualRoughness(float roughness)
|
||||
{
|
||||
return sqrt(roughness);
|
||||
}
|
||||
|
||||
float RoughnessToPerceptualSmoothness(float roughness)
|
||||
{
|
||||
return 1.0 - sqrt(roughness);
|
||||
}
|
||||
|
||||
float PerceptualSmoothnessToRoughness(float perceptualSmoothness)
|
||||
{
|
||||
return (1.0 - perceptualSmoothness) * (1.0 - perceptualSmoothness);
|
||||
}
|
||||
|
||||
float PerceptualSmoothnessToPerceptualRoughness(float perceptualSmoothness)
|
||||
{
|
||||
return (1.0 - perceptualSmoothness);
|
||||
}
|
||||
|
||||
float PerceptualRoughnessToPerceptualSmoothness(float perceptualRoughness)
|
||||
{
|
||||
return (1.0 - perceptualRoughness);
|
||||
}
|
||||
|
||||
// Return modified perceptualSmoothness based on provided variance (get from GeometricNormalVariance + TextureNormalVariance)
|
||||
float NormalFiltering(float perceptualSmoothness, float variance, float threshold)
|
||||
{
|
||||
float roughness = PerceptualSmoothnessToRoughness(perceptualSmoothness);
|
||||
// Ref: Geometry into Shading - http://graphics.pixar.com/library/BumpRoughness/paper.pdf - equation (3)
|
||||
float squaredRoughness = saturate(roughness * roughness + min(2.0 * variance, threshold * threshold)); // threshold can be really low, square the value for easier control
|
||||
|
||||
return RoughnessToPerceptualSmoothness(sqrt(squaredRoughness));
|
||||
}
|
||||
|
||||
// Reference: Error Reduction and Simplification for Shading Anti-Aliasing
|
||||
// Specular antialiasing for geometry-induced normal (and NDF) variations: Tokuyoshi / Kaplanyan et al.'s method.
|
||||
// This is the deferred approximation, which works reasonably well so we keep it for forward too for now.
|
||||
// screenSpaceVariance should be at most 0.5^2 = 0.25, as that corresponds to considering
|
||||
// a gaussian pixel reconstruction kernel with a standard deviation of 0.5 of a pixel, thus 2 sigma covering the whole pixel.
|
||||
float GeometricNormalVariance(float3 geometricNormalWS, float screenSpaceVariance)
|
||||
{
|
||||
float3 deltaU = ddx(geometricNormalWS);
|
||||
float3 deltaV = ddy(geometricNormalWS);
|
||||
|
||||
return screenSpaceVariance * (dot(deltaU, deltaU) + dot(deltaV, deltaV));
|
||||
}
|
||||
|
||||
// Return modified perceptualSmoothness
|
||||
float GeometricNormalFiltering(float perceptualSmoothness, float3 geometricNormalWS, float screenSpaceVariance, float threshold)
|
||||
{
|
||||
float variance = GeometricNormalVariance(geometricNormalWS, screenSpaceVariance);
|
||||
return NormalFiltering(perceptualSmoothness, variance, threshold);
|
||||
}
|
||||
|
||||
//SSS method from GDC 2011 conference by Colin Barre-Bresebois & Marc Bouchard and modified by Xiexe
|
||||
float3 getSubsurfaceScatteringLight (float3 lightColor, float3 lightDirection, float3 normalDirection, float3 viewDirection,
|
||||
float attenuation, float3 thickness, float3 indirectLight, float3 subsurfaceColour)
|
||||
{
|
||||
float3 vLTLight = lightDirection + normalDirection * _SSSDist; // Distortion
|
||||
float3 fLTDot = pow(saturate(dot(viewDirection, -vLTLight)), _SSSPow)
|
||||
* _SSSIntensity;
|
||||
|
||||
return lerp(1, attenuation, float(any(_WorldSpaceLightPos0.xyz)))
|
||||
* (fLTDot + _SSSAmbient) * abs(_ThicknessMapInvert-thickness)
|
||||
* (lightColor + indirectLight) * subsurfaceColour;
|
||||
|
||||
}
|
||||
|
||||
inline float3 BlendNormalsPD(float3 n1, float3 n2) {
|
||||
return normalize(float3(n1.xy*n2.z + n2.xy*n1.z, n1.z*n2.z));
|
||||
}
|
||||
|
||||
// Based on NormalInTangentSpace from UnityStandardInput
|
||||
inline float3 NormalInTangentSpace(float2 texcoords, float2 texcoords2, half mask)
|
||||
{
|
||||
//float3 normalTangent = UnpackNormal(tex2D(_BumpMap,TRANSFORM_TEX(texcoords.xy, _MainTex)));
|
||||
//float3 normalTangent = UnpackNormal(tex2D(_BumpMap,texcoords.xy));
|
||||
half3 normalTangent = UnpackScaleNormal(tex2D (_BumpMap, texcoords.xy), _BumpScale);
|
||||
|
||||
half3 detailNormalTangent = UnpackScaleNormal(tex2D (_DetailBumpMap, TRANSFORM_TEX(texcoords2.xy, _DetailBumpMap)), _DetailBumpMapScale);
|
||||
#if _DETAIL_LERP
|
||||
normalTangent = lerp(
|
||||
normalTangent,
|
||||
detailNormalTangent,
|
||||
mask);
|
||||
#else
|
||||
normalTangent = lerp(
|
||||
normalTangent,
|
||||
BlendNormalsPD(normalTangent, detailNormalTangent),
|
||||
mask);
|
||||
#endif
|
||||
|
||||
return normalTangent;
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5687fa2fc82f7f74aae2f0250d103ac7
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
nonModifiableTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 35611
|
||||
packageName: UMA 2
|
||||
packageVersion: 2.13
|
||||
assetPath: Assets/UMA/Content/SkinShaders/Shader/SSS_Utils.cginc
|
||||
uploadId: 679826
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ed34263bb43420b49bc744778fad8efe
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 s-ilent
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,14 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7942a848115dddb46a61980d4c4bd5b9
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 35611
|
||||
packageName: UMA 2
|
||||
packageVersion: 2.13
|
||||
assetPath: Assets/UMA/Content/SkinShaders/standard-subsurface-scattering-master/LICENSE
|
||||
uploadId: 679826
|
||||
@@ -0,0 +1,37 @@
|
||||
# Standard Subsurface Scattering
|
||||
|
||||
A simple subsurface scattering shader for Unity/VRchat that implements an approximation of a subsurface scattering effect, while keeping most of the options present in the Standard shader.
|
||||
|
||||
# [Can't find the Download link? Click here!](https://gitlab.com/s-ilent/standard-subsurface-scattering/-/archive/master/standard-subsurface-scattering-master.zip)
|
||||
|
||||

|
||||
|
||||
## Installation
|
||||
|
||||
Download the repository. Then place the Shader/ folder with the shader into your Assets/ directory.
|
||||
|
||||
## Usage
|
||||
|
||||
This shader features most (but not all) of the features available in the Unity Standard shader. You can drop in most kinds of texture map (if you set them in Standard, they'll be transferred over for you automatically.)
|
||||
The main difference is in the addition of the thickness map. You can create this map in a few ways.
|
||||
- Invert the normals of your model in Blender and bake ambient occlusion. This will create a true "thickness" map.
|
||||
- If you use Substance Painter, you can set it up to generate a thickness map. Please see the Substance Painter documentation for more info.
|
||||
- If you're lazy, like me, you can use the "Invert Thickness Map" option to use a preexisting texture. For example, you can get a nice effect on character models by using a metalness map as your thickness, with "Invert Thickness Map". This will make light pass through everything but metal. Note that for best appearance, you'll want to boost the Power variable.
|
||||
|
||||
If your thickness map doesn't define a colour for the scattering, you should also set "Tint Scattering by Albedo" so that the SSS effect isn't pure white.
|
||||
|
||||
From there, you can tweak the values as you see fit. I recommend **leaving Intensity at 1**, as SSS is normally a subtle effect, and Intensity is a straight multiplier.
|
||||
|
||||
## Something I want is missing!
|
||||
|
||||
Request it and it will be fixed later.
|
||||
|
||||
## The default settings are weird!
|
||||
|
||||
Play around and see what works!
|
||||
|
||||
I recommend keeping intensity at 1.
|
||||
|
||||
## License?
|
||||
|
||||
This work is licensed under MIT license.
|
||||
@@ -0,0 +1,14 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2a5fc17f40332ee4a9ad46bdb74662c0
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 35611
|
||||
packageName: UMA 2
|
||||
packageVersion: 2.13
|
||||
assetPath: Assets/UMA/Content/SkinShaders/standard-subsurface-scattering-master/README.md
|
||||
uploadId: 679826
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5034481f938a1b142b0e863fe4755939
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 79f6a0c5b3661644e9d4f7712487591e
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+126
@@ -0,0 +1,126 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: SSS Demo
|
||||
m_Shader: {fileID: 4800000, guid: dd867f0212ded544396217ac461f949c, type: 3}
|
||||
m_ShaderKeywords: _ _METALLICGLOSSMAP
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _BRDFTex:
|
||||
m_Texture: {fileID: 2800000, guid: 438762e23bc56bf4188ce947bf60e0e3, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailBumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OverlayMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ThicknessMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _texcoord:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _texcoord2:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
- _BumpScale: 1
|
||||
- _CullMode: 2
|
||||
- _Cutoff: 0.5
|
||||
- _Cutout: 0.5
|
||||
- _DetailBumpMapScale: 1
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _GlossyReflections: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _OcclusionUVSource: 0
|
||||
- _Parallax: 0.02
|
||||
- _SSSAmbient: 0
|
||||
- _SSSDist: 1
|
||||
- _SSSIntensity: 1
|
||||
- _SSSPow: 1
|
||||
- _SSSShadow: 1
|
||||
- _ScatteringByAlbedo: 1
|
||||
- _SecondUVSource: 0
|
||||
- _SmoothnessFromAlbedo: 0
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _ThicknessMapInvert: 1
|
||||
- _ThicknessMapPower: 1
|
||||
- _ThicknessUVSource: 0
|
||||
- _UVSec: 0
|
||||
- _UseAlphaToMask: 0
|
||||
- _UseCutout: 0
|
||||
- _UseSkinScattering: 1
|
||||
- _ZWrite: 1
|
||||
- __dirty: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 1, g: 0.8283805, b: 0.7216981, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
- _OverlayColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _SSSCol: {r: 1, g: 1, b: 1, a: 1}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 511ba8c25b0549c4ba9a8dbd34424156
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 35611
|
||||
packageName: UMA 2
|
||||
packageVersion: 2.13
|
||||
assetPath: Assets/UMA/Content/SkinShaders/standard-subsurface-scattering-master/Shaders/SSSSS/SSS
|
||||
Demo.mat
|
||||
uploadId: 679826
|
||||
+108
@@ -0,0 +1,108 @@
|
||||
// Put together with Amplify's help.
|
||||
Shader "Silent/Subsurface Scattering (Specular)"
|
||||
{
|
||||
Properties
|
||||
{
|
||||
[Header(Standard)]
|
||||
_Color ("Color", Color) = (1,1,1,1)
|
||||
_MainTex("Albedo", 2D) = "white" {}
|
||||
[NoScaleOffset][Normal]_BumpMap("Normal Map", 2D) = "bump" {}
|
||||
_BumpScale ("Normal Scale", Float) = 1
|
||||
[NoScaleOffset]_MetallicGlossMap("Specular", 2D) = "black" {}
|
||||
_SpecularColor("Specular Tint", Color) = (1,1,1)
|
||||
_GlossMapScale("Smoothness", Range(0, 1)) = 1.0
|
||||
[ToggleUI]_SmoothnessFromAlbedo("Smoothness stored in Albedo alpha", Float) = 0.0
|
||||
[NoScaleOffset]_OcclusionMap("Occlusion", 2D) = "white" {}
|
||||
_OcclusionStrength("Occlusion Strength", Range(0, 1)) = 1.0
|
||||
[Enum(UV1, 0, UV2, 1)] _OcclusionUVSource("Occlusion UV Source", Float) = 0
|
||||
_EmissionMap("Emission", 2D) = "black" {}
|
||||
[HDR]_EmissionColor ("Emission Color", Color) = (1,1,1,1)
|
||||
|
||||
[Header(Detail)]
|
||||
[NoScaleOffset]_OverlayMap("Overlay", 2D) = "black" {}
|
||||
_OverlayColor ("Overlay Color", Color) = (1,1,1,1)
|
||||
[NoScaleOffset]_DetailMask("Detail Mask", 2D) = "white" {}
|
||||
[Normal]_DetailBumpMap("Detail Normal Map", 2D) = "bump" {}
|
||||
_DetailMetallicGlossMap("Detail Metallic", 2D) = "white" {}
|
||||
_DetailBumpMapScale ("Detail Scale", Float) = 1
|
||||
[Enum(UV1, 0, UV2, 1)] _SecondUVSource("Secondary UV Source", Float) = 0
|
||||
|
||||
[Header(Transmission)]
|
||||
[NoScaleOffset]_ThicknessMap("Thickness Map", 2D) = "black" {}
|
||||
[ToggleUI]_ThicknessMapInvert("Invert Thickness", Float) = 0.0
|
||||
_ThicknessMapPower ("Thickness Map Power", Range(0.01, 10)) = 1
|
||||
[Enum(UV1, 0, UV2, 1)] _ThicknessUVSource("Thickness UV Source", Float) = 0
|
||||
[ToggleUI]_ScatteringByAlbedo("Tint Scattering with Albedo", Float) = 0.0
|
||||
_SSSCol ("Scattering Color", Color) = (1,1,1,1)
|
||||
_SSSIntensity ("Scattering Intensity", Range(0, 10)) = 1
|
||||
_SSSPow ("Scattering Power", Range(0.01, 10)) = 1
|
||||
_SSSDist ("Scattering Distance", Range(0, 10)) = 1
|
||||
_SSSAmbient ("Scattering Ambient Intensity", Range(0, 0.5)) = 0
|
||||
_SSSShadow ("Scattering Shadow Power", Range(0, 1)) = 1
|
||||
|
||||
[Header(Skin)]
|
||||
[Toggle(_METALLICGLOSSMAP)]_UseSkinScattering("Use Skin Scattering", Float) = 0.0
|
||||
[NoScaleOffset]_BRDFTex("Skin BRDF LUT", 2D) = "white" {}
|
||||
|
||||
[Header(Wrapped Diffuse)]
|
||||
_WrappingFactor("Wrapping Factor", Range(0.001, 1)) = 0.01
|
||||
[Gamma]_WrappingPowerFactor("Wrapping Power Factor", Float) = 1
|
||||
|
||||
[Header(System)]
|
||||
[Enum(UnityEngine.Rendering.CullMode)] _CullMode("Cull Mode", Float) = 2
|
||||
[Toggle(_ALPHATEST_ON)] _UseCutout("Alpha Test Cutout", Float) = 0
|
||||
[Toggle(_ALPHABLEND_ON)] _UseAlphaToMask("Alpha To Coverage Transparency", Float) = 0
|
||||
_Cutout("Cutout", Range(0, 1)) = 0.5
|
||||
[ToggleOff(_SPECULARHIGHLIGHTS_OFF)]_SpecularHighlights ("Specular Highlights", Float) = 1.0
|
||||
[ToggleOff(_GLOSSYREFLECTIONS_OFF)]_GlossyReflections ("Glossy Reflections", Float) = 1.0
|
||||
[HideInInspector] _texcoord( "", 2D ) = "white" {}
|
||||
[HideInInspector] _texcoord2( "", 2D ) = "white" {}
|
||||
[HideInInspector] __dirty( "", Int ) = 1
|
||||
}
|
||||
|
||||
SubShader
|
||||
{
|
||||
Tags{ "RenderType" = "TransparentCutout" "Queue" = "AlphaTest+0" }
|
||||
Cull[_CullMode]
|
||||
AlphaToMask [_UseAlphaToMask]
|
||||
|
||||
CGINCLUDE
|
||||
|
||||
#pragma shader_feature _SPECULARHIGHLIGHTS_OFF
|
||||
#pragma shader_feature _GLOSSYREFLECTIONS_OFF
|
||||
#pragma shader_feature _ALPHATEST_ON
|
||||
|
||||
// Reuse Standard keywords for features to avoid reaching limit
|
||||
// This one is for scattering.
|
||||
#pragma shader_feature _METALLICGLOSSMAP
|
||||
|
||||
#define SSS_SPECULAR
|
||||
#include "SSS_Standard.cginc"
|
||||
|
||||
ENDCG
|
||||
CGPROGRAM
|
||||
#pragma surface surf StandardCustomLighting keepalpha fullforwardshadows
|
||||
|
||||
ENDCG
|
||||
Pass
|
||||
{
|
||||
Name "ShadowCaster"
|
||||
Tags{ "LightMode" = "ShadowCaster" }
|
||||
ZWrite On
|
||||
AlphaToMask Off
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#pragma target 3.0
|
||||
#pragma multi_compile_shadowcaster
|
||||
#pragma multi_compile UNITY_PASS_SHADOWCASTER
|
||||
#pragma shader_feature _ _ALPHATEST_ON
|
||||
#pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2
|
||||
|
||||
#include "SSS_Shadow.cginc"
|
||||
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
Fallback "Standard"
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3286a5d3dc0c3dd4e8dfc9dcd833291c
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures:
|
||||
- _MainTex: {instanceID: 0}
|
||||
- _BumpMap: {instanceID: 0}
|
||||
- _MetallicGlossMap: {instanceID: 0}
|
||||
- _OcclusionMap: {instanceID: 0}
|
||||
- _OverlayMap: {instanceID: 0}
|
||||
- _DetailMask: {instanceID: 0}
|
||||
- _DetailBumpMap: {instanceID: 0}
|
||||
- _DetailMetallicGlossMap: {instanceID: 0}
|
||||
- _ThicknessMap: {instanceID: 0}
|
||||
- _BRDFTex: {fileID: 2800000, guid: 438762e23bc56bf4188ce947bf60e0e3, type: 3}
|
||||
- _texcoord: {instanceID: 0}
|
||||
- _texcoord2: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 35611
|
||||
packageName: UMA 2
|
||||
packageVersion: 2.13
|
||||
assetPath: Assets/UMA/Content/SkinShaders/standard-subsurface-scattering-master/Shaders/SSSSS/SSS
|
||||
Specular.shader
|
||||
uploadId: 679826
|
||||
+107
@@ -0,0 +1,107 @@
|
||||
// Put together with Amplify's help.
|
||||
Shader "Silent/Subsurface Scattering"
|
||||
{
|
||||
Properties
|
||||
{
|
||||
[Header(Standard)]
|
||||
_Color ("Color", Color) = (1,1,1,1)
|
||||
_MainTex("Albedo", 2D) = "white" {}
|
||||
[NoScaleOffset][Normal]_BumpMap("Normal Map", 2D) = "bump" {}
|
||||
_BumpScale ("Normal Scale", Float) = 1
|
||||
[NoScaleOffset]_MetallicGlossMap("Metallic", 2D) = "black" {}
|
||||
_GlossMapScale("Smoothness", Range(0, 1)) = 1.0
|
||||
[ToggleUI]_SmoothnessFromAlbedo("Smoothness stored in Albedo alpha", Float) = 0.0
|
||||
[NoScaleOffset]_OcclusionMap("Occlusion", 2D) = "white" {}
|
||||
_OcclusionStrength("Occlusion Strength", Range(0, 1)) = 1.0
|
||||
[Enum(UV1, 0, UV2, 1)] _OcclusionUVSource("Occlusion UV Source", Float) = 0
|
||||
_EmissionMap("Emission", 2D) = "black" {}
|
||||
[HDR]_EmissionColor ("Emission Color", Color) = (1,1,1,1)
|
||||
|
||||
[Header(Detail)]
|
||||
[NoScaleOffset]_OverlayMap("Overlay", 2D) = "black" {}
|
||||
_OverlayColor ("Overlay Color", Color) = (1,1,1,1)
|
||||
[NoScaleOffset]_DetailMask("Detail Mask", 2D) = "white" {}
|
||||
[Normal]_DetailBumpMap("Detail Normal Map", 2D) = "bump" {}
|
||||
_DetailMetallicGlossMap("Detail Metallic", 2D) = "white" {}
|
||||
_DetailBumpMapScale ("Detail Scale", Float) = 1
|
||||
[Enum(UV1, 0, UV2, 1)] _SecondUVSource("Secondary UV Source", Float) = 0
|
||||
|
||||
[Header(Transmission)]
|
||||
[NoScaleOffset]_ThicknessMap("Thickness Map", 2D) = "black" {}
|
||||
[ToggleUI]_ThicknessMapInvert("Invert Thickness", Float) = 0.0
|
||||
_ThicknessMapPower ("Thickness Map Power", Range(0.01, 10)) = 1
|
||||
[Enum(UV1, 0, UV2, 1)] _ThicknessUVSource("Thickness UV Source", Float) = 0
|
||||
[ToggleUI]_ScatteringByAlbedo("Tint Scattering with Albedo", Float) = 0.0
|
||||
_SSSCol ("Scattering Color", Color) = (1,1,1,1)
|
||||
_SSSIntensity ("Scattering Intensity", Range(0, 10)) = 1
|
||||
_SSSPow ("Scattering Power", Range(0.01, 10)) = 1
|
||||
_SSSDist ("Scattering Distance", Range(0, 10)) = 1
|
||||
_SSSAmbient ("Scattering Ambient Intensity", Range(0, 0.5)) = 0
|
||||
_SSSShadow ("Scattering Shadow Power", Range(0, 1)) = 1
|
||||
|
||||
[Header(Skin)]
|
||||
[Toggle(_METALLICGLOSSMAP)]_UseSkinScattering("Use Skin Scattering", Float) = 0.0
|
||||
[NoScaleOffset]_BRDFTex("Skin BRDF LUT", 2D) = "white" {}
|
||||
|
||||
[Header(Wrapped Diffuse)]
|
||||
_WrappingFactor("Wrapping Factor", Range(0.001, 1)) = 0.01
|
||||
[Gamma]_WrappingPowerFactor("Wrapping Power Factor", Float) = 1
|
||||
|
||||
[Header(System)]
|
||||
[Enum(UnityEngine.Rendering.CullMode)] _CullMode("Cull Mode", Float) = 2
|
||||
[Toggle(_ALPHATEST_ON)] _UseCutout("Alpha Test Cutout", Float) = 0
|
||||
[Toggle(_ALPHABLEND_ON)] _UseAlphaToMask("Alpha To Coverage Transparency", Float) = 0
|
||||
_Cutout("Cutout", Range(0, 1)) = 0.5
|
||||
[ToggleOff(_SPECULARHIGHLIGHTS_OFF)]_SpecularHighlights ("Specular Highlights", Float) = 1.0
|
||||
[ToggleOff(_GLOSSYREFLECTIONS_OFF)]_GlossyReflections ("Glossy Reflections", Float) = 1.0
|
||||
[HideInInspector] _texcoord( "", 2D ) = "white" {}
|
||||
[HideInInspector] _texcoord2( "", 2D ) = "white" {}
|
||||
[HideInInspector] __dirty( "", Int ) = 1
|
||||
}
|
||||
|
||||
SubShader
|
||||
{
|
||||
Tags{ "RenderType" = "TransparentCutout" "Queue" = "AlphaTest+0" }
|
||||
Cull[_CullMode]
|
||||
AlphaToMask [_UseAlphaToMask]
|
||||
|
||||
CGINCLUDE
|
||||
|
||||
#pragma shader_feature _SPECULARHIGHLIGHTS_OFF
|
||||
#pragma shader_feature _GLOSSYREFLECTIONS_OFF
|
||||
#pragma shader_feature _ALPHATEST_ON
|
||||
|
||||
// Reuse Standard keywords for features to avoid reaching limit
|
||||
// This one is for scattering.
|
||||
#pragma shader_feature _METALLICGLOSSMAP
|
||||
|
||||
#define SSS_METALLIC
|
||||
#include "SSS_Standard.cginc"
|
||||
|
||||
ENDCG
|
||||
CGPROGRAM
|
||||
#pragma surface surf StandardCustomLighting keepalpha fullforwardshadows
|
||||
#pragma target 3.0
|
||||
|
||||
ENDCG
|
||||
Pass
|
||||
{
|
||||
Name "ShadowCaster"
|
||||
Tags{ "LightMode" = "ShadowCaster" }
|
||||
ZWrite On
|
||||
AlphaToMask Off
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#pragma multi_compile_shadowcaster
|
||||
#pragma multi_compile UNITY_PASS_SHADOWCASTER
|
||||
#pragma shader_feature _ _ALPHATEST_ON
|
||||
#pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2
|
||||
|
||||
#include "SSS_Shadow.cginc"
|
||||
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
Fallback "Standard"
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dd867f0212ded544396217ac461f949c
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures:
|
||||
- _MainTex: {instanceID: 0}
|
||||
- _BumpMap: {instanceID: 0}
|
||||
- _MetallicGlossMap: {instanceID: 0}
|
||||
- _OcclusionMap: {instanceID: 0}
|
||||
- _OverlayMap: {instanceID: 0}
|
||||
- _DetailMask: {instanceID: 0}
|
||||
- _DetailBumpMap: {instanceID: 0}
|
||||
- _DetailMetallicGlossMap: {instanceID: 0}
|
||||
- _ThicknessMap: {instanceID: 0}
|
||||
- _BRDFTex: {fileID: 2800000, guid: 438762e23bc56bf4188ce947bf60e0e3, type: 3}
|
||||
- _texcoord: {instanceID: 0}
|
||||
- _texcoord2: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 35611
|
||||
packageName: UMA 2
|
||||
packageVersion: 2.13
|
||||
assetPath: Assets/UMA/Content/SkinShaders/standard-subsurface-scattering-master/Shaders/SSSSS/SSS.shader
|
||||
uploadId: 679826
|
||||
+330
@@ -0,0 +1,330 @@
|
||||
#ifndef SSS_CORE_INCLUDED
|
||||
#define SSS_CORE_INCLUDED
|
||||
//-----------------------------------------------------------------------------
|
||||
// BRDF functions
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
// See UnityStandardBRDF for more info
|
||||
|
||||
UNITY_DECLARE_TEX2D(_BRDFTex);
|
||||
|
||||
half4 UNITY_BRDF_PBS_SSSS (half3 diffColor, half3 specColor, half oneMinusReflectivity, half smoothness, half thickness,
|
||||
float3 normal, float3 viewDir,
|
||||
UnityLight light, UnityIndirect gi)
|
||||
{
|
||||
float perceptualRoughness = SmoothnessToPerceptualRoughness (smoothness);
|
||||
float3 halfDir = Unity_SafeNormalize (float3(light.dir) + viewDir);
|
||||
|
||||
// NdotV should not be negative for visible pixels, but it can happen due to perspective projection and normal mapping
|
||||
// In this case normal should be modified to become valid (i.e facing camera) and not cause weird artifacts.
|
||||
// but this operation adds few ALU and users may not want it. Alternative is to simply take the abs of NdotV (less correct but works too).
|
||||
// Following define allow to control this. Set it to 0 if ALU is critical on your platform.
|
||||
// This correction is interesting for GGX with SmithJoint visibility function because artifacts are more visible in this case due to highlight edge of rough surface
|
||||
// Edit: Disable this code by default for now as it is not compatible with two sided lighting used in SpeedTree.
|
||||
#define UNITY_HANDLE_CORRECTLY_NEGATIVE_NDOTV 0
|
||||
|
||||
#if UNITY_HANDLE_CORRECTLY_NEGATIVE_NDOTV
|
||||
// The amount we shift the normal toward the view vector is defined by the dot product.
|
||||
half shiftAmount = dot(normal, viewDir);
|
||||
normal = shiftAmount < 0.0f ? normal + viewDir * (-shiftAmount + 1e-5f) : normal;
|
||||
// A re-normalization should be applied here but as the shift is small we don't do it to save ALU.
|
||||
//normal = normalize(normal);
|
||||
|
||||
float nv = saturate(dot(normal, viewDir)); // TODO: this saturate should no be necessary here
|
||||
#else
|
||||
half nv = abs(dot(normal, viewDir)); // This abs allow to limit artifact
|
||||
#endif
|
||||
|
||||
float nl = saturate(dot(normal, light.dir));
|
||||
float nh = saturate(dot(normal, halfDir));
|
||||
|
||||
half lv = saturate(dot(light.dir, viewDir));
|
||||
half lh = saturate(dot(light.dir, halfDir));
|
||||
|
||||
// Diffuse term
|
||||
half3 diffuseTerm = DisneyDiffuse(nv, nl, lh, perceptualRoughness) * nl;
|
||||
|
||||
#if defined(_METALLICGLOSSMAP) // Scattering
|
||||
// Skin Lighting
|
||||
float2 brdfUV;
|
||||
// Half-Lambert lighting value based on blurred normals.
|
||||
brdfUV.x = nl * 0.5 + 0.5;
|
||||
// Curvature amount. Multiplied by light's luminosity so brighter light = more scattering.
|
||||
// Pleae note: gi.light.color already contains light attenuation
|
||||
brdfUV.y = thickness * dot(light.color, fixed3(0.22, 0.707, 0.071));
|
||||
half3 brdf = UNITY_SAMPLE_TEX2D ( _BRDFTex, brdfUV ).rgb;
|
||||
#else
|
||||
float wrappedDiffuse = pow(saturate((diffuseTerm + _WrappingFactor) /
|
||||
(1.0f + _WrappingFactor)), _WrappingPowerFactor) * (_WrappingPowerFactor + 1) / (2 * (1 + _WrappingFactor));
|
||||
half3 brdf = wrappedDiffuse;
|
||||
#endif
|
||||
|
||||
// Specular term
|
||||
// HACK: theoretically we should divide diffuseTerm by Pi and not multiply specularTerm!
|
||||
// BUT 1) that will make shader look significantly darker than Legacy ones
|
||||
// and 2) on engine side "Non-important" lights have to be divided by Pi too in cases when they are injected into ambient SH
|
||||
float roughness = PerceptualRoughnessToRoughness(perceptualRoughness);
|
||||
#if UNITY_BRDF_GGX
|
||||
// GGX with roughtness to 0 would mean no specular at all, using max(roughness, 0.002) here to match HDrenderloop roughtness remapping.
|
||||
roughness = max(roughness, 0.002);
|
||||
float V = SmithJointGGXVisibilityTerm (nl, nv, roughness);
|
||||
float D = GGXTerm (nh, roughness);
|
||||
#else
|
||||
// Legacy
|
||||
half V = SmithBeckmannVisibilityTerm (nl, nv, roughness);
|
||||
half D = NDFBlinnPhongNormalizedTerm (nh, PerceptualRoughnessToSpecPower(perceptualRoughness));
|
||||
#endif
|
||||
|
||||
float specularTerm = V*D * UNITY_PI; // Torrance-Sparrow model, Fresnel is applied later
|
||||
|
||||
# ifdef UNITY_COLORSPACE_GAMMA
|
||||
specularTerm = sqrt(max(1e-4h, specularTerm));
|
||||
# endif
|
||||
|
||||
// specularTerm * nl can be NaN on Metal in some cases, use max() to make sure it's a sane value
|
||||
specularTerm = max(0, specularTerm * nl);
|
||||
#if defined(_SPECULARHIGHLIGHTS_OFF)
|
||||
specularTerm = 0.0;
|
||||
#endif
|
||||
|
||||
// surfaceReduction = Int D(NdotH) * NdotH * Id(NdotL>0) dH = 1/(roughness^2+1)
|
||||
half surfaceReduction;
|
||||
# ifdef UNITY_COLORSPACE_GAMMA
|
||||
surfaceReduction = 1.0-0.28*roughness*perceptualRoughness; // 1-0.28*x^3 as approximation for (1/(x^4+1))^(1/2.2) on the domain [0;1]
|
||||
# else
|
||||
surfaceReduction = 1.0 / (roughness*roughness + 1.0); // fade \in [0.5;1]
|
||||
# endif
|
||||
|
||||
const float epsilon = 1.192092896e-07; // Smallest positive number, such that 1.0 + epsilon != 1.0
|
||||
|
||||
// SH brdf term
|
||||
#if defined(_METALLICGLOSSMAP) // Scattering
|
||||
float3 shLength = GetSHLength();
|
||||
float3 giBase = saturate(gi.diffuse / shLength);
|
||||
float giBaseL = dot(giBase, 1.0/3.0) + epsilon;
|
||||
giBase /= giBaseL;
|
||||
|
||||
brdfUV.x = giBaseL * 0.5 + 0.5;
|
||||
brdfUV.y = thickness * dot(shLength, fixed3(0.22, 0.707, 0.071));
|
||||
half3 brdfSH = UNITY_SAMPLE_TEX2D ( _BRDFTex, brdfUV ).rgb;
|
||||
gi.diffuse = max(0, shLength * giBase * lerp(giBaseL, brdfSH, thickness));
|
||||
#endif
|
||||
|
||||
// To provide true Lambert lighting, we need to be able to kill specular completely.
|
||||
specularTerm *= any(specColor) ? 1.0 : 0.0;
|
||||
|
||||
half grazingTerm = saturate(smoothness + (1-oneMinusReflectivity));
|
||||
half3 color = diffColor * (gi.diffuse + light.color * lerp(diffuseTerm, brdf, thickness))
|
||||
+ specularTerm * light.color * FresnelTerm (specColor, lh)
|
||||
+ surfaceReduction * gi.specular * FresnelLerp (specColor, grazingTerm, nv);
|
||||
|
||||
return half4(color, 1);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Surface functions
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
struct SurfaceOutputStandardSSSS
|
||||
{
|
||||
fixed3 Albedo; // base (diffuse or specular) color
|
||||
float3 Normal; // tangent space normal, if written
|
||||
half3 Emission;
|
||||
half Metallic; // 0=non-metal, 1=metal
|
||||
// Smoothness is the user facing name, it should be perceptual smoothness but user should not have to deal with it.
|
||||
// Everywhere in the code you meet smoothness it is perceptual smoothness
|
||||
half Smoothness; // 0=rough, 1=smooth
|
||||
half Occlusion; // occlusion (default 1)
|
||||
fixed Alpha; // alpha for transparencies
|
||||
fixed Thickness;
|
||||
};
|
||||
|
||||
|
||||
struct SurfaceOutputStandardSpecularSSSS
|
||||
{
|
||||
fixed3 Albedo; // diffuse color
|
||||
fixed3 Specular; // specular color
|
||||
float3 Normal; // tangent space normal, if written
|
||||
half3 Emission;
|
||||
half Smoothness; // 0=rough, 1=smooth
|
||||
half Occlusion; // occlusion (default 1)
|
||||
fixed Alpha; // alpha for transparencies
|
||||
fixed Thickness;
|
||||
};
|
||||
|
||||
inline half4 LightingStandardSSSS (SurfaceOutputStandardSSSS s, UnityGIInput data, UnityGI gi)
|
||||
{
|
||||
s.Normal = normalize(s.Normal);
|
||||
|
||||
half oneMinusReflectivity;
|
||||
half3 specColor;
|
||||
s.Albedo = DiffuseAndSpecularFromMetallic (s.Albedo, s.Metallic, /*out*/ specColor, /*out*/ oneMinusReflectivity);
|
||||
|
||||
// shader relies on pre-multiply alpha-blend (_SrcBlend = One, _DstBlend = OneMinusSrcAlpha)
|
||||
// this is necessary to handle transparency in physically correct way - only diffuse component gets affected by alpha
|
||||
half outputAlpha;
|
||||
s.Albedo = PreMultiplyAlpha (s.Albedo, s.Alpha, oneMinusReflectivity, /*out*/ outputAlpha);
|
||||
|
||||
half4 c = UNITY_BRDF_PBS_SSSS (s.Albedo, specColor, oneMinusReflectivity, s.Smoothness, s.Thickness, s.Normal, data.worldViewDir, gi.light, gi.indirect);
|
||||
|
||||
|
||||
#if defined(UNITY_PASS_FORWARDBASE) && defined(VERTEXLIGHT_ON)
|
||||
// energy conservation
|
||||
UnityLight light = gi.light;
|
||||
UnityIndirect nullGi = gi.indirect;
|
||||
|
||||
nullGi.diffuse = 0;
|
||||
nullGi.specular = 0;
|
||||
|
||||
for(int num = 0; num < 4 && any(unity_LightColor[num].rgb > 0); num++)
|
||||
{
|
||||
UnityLight light;
|
||||
float3 lightPos = float3(unity_4LightPosX0[num], unity_4LightPosY0[num], unity_4LightPosZ0[num]);
|
||||
light.dir = lightPos - data.worldPos;
|
||||
|
||||
float lengthSq = dot(light.dir, light.dir);
|
||||
float atten2 = saturate(1 - (lengthSq * unity_4LightAtten0[num] / 25));
|
||||
|
||||
if (atten2 > 0)
|
||||
{
|
||||
light.dir *= min(1e30, rsqrt(lengthSq));
|
||||
float atten = 1.0 / (1.0 + (lengthSq * unity_4LightAtten0[num]));
|
||||
//atten = unityPointAttenuation(lengthSq, unity_4LightAtten0[num]);
|
||||
atten = min(atten, atten2 * atten2);
|
||||
|
||||
light.color = unity_LightColor[num].rgb * atten;
|
||||
|
||||
c += UNITY_BRDF_PBS_SSSS (s.Albedo, specColor,
|
||||
oneMinusReflectivity, s.Smoothness,
|
||||
s.Thickness, s.Normal,
|
||||
data.worldViewDir, light, nullGi);
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
c.a = outputAlpha;
|
||||
return c;
|
||||
}
|
||||
|
||||
inline half4 LightingStandardSSSS_Deferred (SurfaceOutputStandardSSSS s, float3 viewDir, UnityGI gi, out half4 outGBuffer0, out half4 outGBuffer1, out half4 outGBuffer2)
|
||||
{
|
||||
half oneMinusReflectivity;
|
||||
half3 specColor;
|
||||
s.Albedo = DiffuseAndSpecularFromMetallic (s.Albedo, s.Metallic, /*out*/ specColor, /*out*/ oneMinusReflectivity);
|
||||
|
||||
half4 c = UNITY_BRDF_PBS_SSSS (s.Albedo, specColor, oneMinusReflectivity, s.Smoothness, s.Thickness, s.Normal, viewDir, gi.light, gi.indirect);
|
||||
|
||||
UnityStandardData data;
|
||||
data.diffuseColor = s.Albedo;
|
||||
data.occlusion = s.Occlusion;
|
||||
data.specularColor = specColor;
|
||||
data.smoothness = s.Smoothness;
|
||||
data.normalWorld = s.Normal;
|
||||
|
||||
UnityStandardDataToGbuffer(data, outGBuffer0, outGBuffer1, outGBuffer2);
|
||||
|
||||
half4 emission = half4(s.Emission + c.rgb, 1);
|
||||
return emission;
|
||||
}
|
||||
|
||||
inline void LightingStandardSSSS_GI (
|
||||
SurfaceOutputStandardSSSS s,
|
||||
UnityGIInput data,
|
||||
inout UnityGI gi)
|
||||
{
|
||||
#if defined(UNITY_PASS_DEFERRED) && UNITY_ENABLE_REFLECTION_BUFFERS
|
||||
gi = UnityGlobalIllumination_Geom(data, s.Occlusion, s.Normal);
|
||||
#else
|
||||
Unity_GlossyEnvironmentData g = UnityGlossyEnvironmentSetup(s.Smoothness, data.worldViewDir, s.Normal, lerp(unity_ColorSpaceDielectricSpec.rgb, s.Albedo, s.Metallic));
|
||||
gi = UnityGlobalIllumination_Geom(data, s.Occlusion, s.Normal, g);
|
||||
#endif
|
||||
}
|
||||
|
||||
inline half4 LightingStandardSSSSSpecular (SurfaceOutputStandardSpecularSSSS s, UnityGIInput data, UnityGI gi)
|
||||
{
|
||||
s.Normal = normalize(s.Normal);
|
||||
|
||||
// energy conservation
|
||||
half oneMinusReflectivity;
|
||||
s.Albedo = EnergyConservationBetweenDiffuseAndSpecular (s.Albedo, s.Specular, /*out*/ oneMinusReflectivity);
|
||||
|
||||
// shader relies on pre-multiply alpha-blend (_SrcBlend = One, _DstBlend = OneMinusSrcAlpha)
|
||||
// this is necessary to handle transparency in physically correct way - only diffuse component gets affected by alpha
|
||||
half outputAlpha;
|
||||
s.Albedo = PreMultiplyAlpha (s.Albedo, s.Alpha, oneMinusReflectivity, /*out*/ outputAlpha);
|
||||
|
||||
half4 c = UNITY_BRDF_PBS_SSSS (s.Albedo, s.Specular, oneMinusReflectivity, s.Smoothness, s.Thickness, s.Normal, data.worldViewDir, gi.light, gi.indirect);
|
||||
|
||||
#if defined(UNITY_PASS_FORWARDBASE) && defined(VERTEXLIGHT_ON)
|
||||
// energy conservation
|
||||
UnityLight light = gi.light;
|
||||
UnityIndirect nullGi = gi.indirect;
|
||||
|
||||
nullGi.diffuse = 0;
|
||||
nullGi.specular = 0;
|
||||
|
||||
for(int num = 0; num < 4 && any(unity_LightColor[num].rgb > 0); num++)
|
||||
{
|
||||
UnityLight light;
|
||||
float3 lightPos = float3(unity_4LightPosX0[num], unity_4LightPosY0[num], unity_4LightPosZ0[num]);
|
||||
light.dir = lightPos - data.worldPos;
|
||||
|
||||
float lengthSq = dot(light.dir, light.dir);
|
||||
float atten2 = saturate(1 - (lengthSq * unity_4LightAtten0[num] / 25));
|
||||
|
||||
if (atten2 > 0)
|
||||
{
|
||||
light.dir *= min(1e30, rsqrt(lengthSq));
|
||||
float atten = 1.0 / (1.0 + (lengthSq * unity_4LightAtten0[num]));
|
||||
//atten = unityPointAttenuation(lengthSq, unity_4LightAtten0[num]);
|
||||
atten = min(atten, atten2 * atten2);
|
||||
|
||||
light.color = unity_LightColor[num].rgb * atten;
|
||||
|
||||
c += UNITY_BRDF_PBS_SSSS (s.Albedo, s.Specular,
|
||||
oneMinusReflectivity, s.Smoothness,
|
||||
s.Thickness, s.Normal,
|
||||
data.worldViewDir, light, nullGi);
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
c.a = outputAlpha;
|
||||
return c;
|
||||
}
|
||||
|
||||
inline half4 LightingStandardSSSSSpecular_Deferred (SurfaceOutputStandardSpecularSSSS s, float3 viewDir, UnityGI gi, out half4 outGBuffer0, out half4 outGBuffer1, out half4 outGBuffer2)
|
||||
{
|
||||
// energy conservation
|
||||
half oneMinusReflectivity;
|
||||
s.Albedo = EnergyConservationBetweenDiffuseAndSpecular (s.Albedo, s.Specular, /*out*/ oneMinusReflectivity);
|
||||
|
||||
half4 c = UNITY_BRDF_PBS_SSSS (s.Albedo, s.Specular, oneMinusReflectivity, s.Smoothness, s.Thickness, s.Normal, viewDir, gi.light, gi.indirect);
|
||||
|
||||
UnityStandardData data;
|
||||
data.diffuseColor = s.Albedo;
|
||||
data.occlusion = s.Occlusion;
|
||||
data.specularColor = s.Specular;
|
||||
data.smoothness = s.Smoothness;
|
||||
data.normalWorld = s.Normal;
|
||||
|
||||
UnityStandardDataToGbuffer(data, outGBuffer0, outGBuffer1, outGBuffer2);
|
||||
|
||||
half4 emission = half4(s.Emission + c.rgb, 1);
|
||||
return emission;
|
||||
}
|
||||
|
||||
inline void LightingStandardSSSSSpecular_GI (
|
||||
SurfaceOutputStandardSpecularSSSS s,
|
||||
UnityGIInput data,
|
||||
inout UnityGI gi)
|
||||
{
|
||||
#if defined(UNITY_PASS_DEFERRED) && UNITY_ENABLE_REFLECTION_BUFFERS
|
||||
gi = UnityGlobalIllumination_Geom(data, s.Occlusion, s.Normal);
|
||||
#else
|
||||
Unity_GlossyEnvironmentData g = UnityGlossyEnvironmentSetup(s.Smoothness, data.worldViewDir, s.Normal, s.Specular);
|
||||
gi = UnityGlobalIllumination_Geom(data, s.Occlusion, s.Normal, g);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif // SSS_CORE_INCLUDED
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b397c9c20b437d6459940d848fd7bb20
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
nonModifiableTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 35611
|
||||
packageName: UMA 2
|
||||
packageVersion: 2.13
|
||||
assetPath: Assets/UMA/Content/SkinShaders/standard-subsurface-scattering-master/Shaders/SSSSS/SSS_Core.cginc
|
||||
uploadId: 679826
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
#ifndef SSS_SHADOW_INCLUDED
|
||||
#define SSS_SHADOW_INCLUDED
|
||||
|
||||
#include "HLSLSupport.cginc"
|
||||
#if ( SHADER_API_D3D11 || SHADER_API_GLCORE || SHADER_API_GLES3 || SHADER_API_METAL || SHADER_API_VULKAN )
|
||||
#define CAN_SKIP_VPOS
|
||||
#endif
|
||||
#include "UnityCG.cginc"
|
||||
#include "Lighting.cginc"
|
||||
#include "UnityPBSLighting.cginc"
|
||||
struct v2f
|
||||
{
|
||||
V2F_SHADOW_CASTER;
|
||||
float4 customPack1 : TEXCOORD1;
|
||||
float4 tSpace0 : TEXCOORD2;
|
||||
float4 tSpace1 : TEXCOORD3;
|
||||
float4 tSpace2 : TEXCOORD4;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
v2f vert( appdata_full v )
|
||||
{
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID( v );
|
||||
UNITY_INITIALIZE_OUTPUT( v2f, o );
|
||||
UNITY_TRANSFER_INSTANCE_ID( v, o );
|
||||
Input customInputData;
|
||||
float3 worldPos = mul( unity_ObjectToWorld, v.vertex ).xyz;
|
||||
half3 worldNormal = UnityObjectToWorldNormal( v.normal );
|
||||
half3 worldTangent = UnityObjectToWorldDir( v.tangent.xyz );
|
||||
half tangentSign = v.tangent.w * unity_WorldTransformParams.w;
|
||||
half3 worldBinormal = cross( worldNormal, worldTangent ) * tangentSign;
|
||||
o.tSpace0 = float4( worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x );
|
||||
o.tSpace1 = float4( worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y );
|
||||
o.tSpace2 = float4( worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z );
|
||||
o.customPack1.xy = customInputData.uv_texcoord;
|
||||
o.customPack1.xy = v.texcoord;
|
||||
o.customPack1.zw = v.texcoord1;
|
||||
|
||||
TRANSFER_SHADOW_CASTER_NORMALOFFSET( o )
|
||||
return o;
|
||||
}
|
||||
half4 frag( v2f IN
|
||||
#if !defined( CAN_SKIP_VPOS )
|
||||
, UNITY_VPOS_TYPE vpos : VPOS
|
||||
#endif
|
||||
) : SV_Target
|
||||
{
|
||||
UNITY_SETUP_INSTANCE_ID( IN );
|
||||
Input surfIN;
|
||||
UNITY_INITIALIZE_OUTPUT( Input, surfIN );
|
||||
surfIN.uv_texcoord = IN.customPack1.xy;
|
||||
surfIN.uv2_texcoord2 = IN.customPack1.zw;
|
||||
float3 worldPos = float3( IN.tSpace0.w, IN.tSpace1.w, IN.tSpace2.w );
|
||||
half3 worldViewDir = normalize( UnityWorldSpaceViewDir( worldPos ) );
|
||||
surfIN.worldNormal = float3( IN.tSpace0.z, IN.tSpace1.z, IN.tSpace2.z );
|
||||
surfIN.internalSurfaceTtoW0 = IN.tSpace0.xyz;
|
||||
surfIN.internalSurfaceTtoW1 = IN.tSpace1.xyz;
|
||||
surfIN.internalSurfaceTtoW2 = IN.tSpace2.xyz;
|
||||
SurfaceOutputCustomLightingCustom o;
|
||||
UNITY_INITIALIZE_OUTPUT( SurfaceOutputCustomLightingCustom, o );
|
||||
|
||||
#if !defined(SSS_CUSTOM_SHADOW)
|
||||
float2 scaledUV = TRANSFORM_TEX(surfIN.uv_texcoord, _MainTex);
|
||||
|
||||
float4 _MainTex_var = tex2D( _MainTex, scaledUV );
|
||||
#if !(defined(_ALPHATEST_ON) || defined(_ALPHABLEND_ON) || defined(_ALPHAPREMULTIPLY_ON))
|
||||
o.Alpha = 1.0;
|
||||
#else
|
||||
o.Alpha = (_SmoothnessFromAlbedo? 1.0 : _MainTex_var.a) * _Color.a ;
|
||||
o.Alpha = ((o.Alpha - _Cutout) / 0.0001 + 0.5);
|
||||
clip(o.Alpha - 1.0/255.0 );
|
||||
#endif
|
||||
#else
|
||||
customShadow( surfIN, o );
|
||||
#endif
|
||||
|
||||
#if defined( CAN_SKIP_VPOS )
|
||||
float2 vpos = IN.pos;
|
||||
#endif
|
||||
SHADOW_CASTER_FRAGMENT( IN )
|
||||
}
|
||||
|
||||
#endif // SSS_SHADOW_INCLUDED
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9670dae62ebdb8e4dbebe1dd39e0ba49
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
nonModifiableTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 35611
|
||||
packageName: UMA 2
|
||||
packageVersion: 2.13
|
||||
assetPath: Assets/UMA/Content/SkinShaders/standard-subsurface-scattering-master/Shaders/SSSSS/SSS_Shadow.cginc
|
||||
uploadId: 679826
|
||||
+227
@@ -0,0 +1,227 @@
|
||||
#ifndef SSS_INPUT_INCLUDED
|
||||
#define SSS_INPUT_INCLUDED
|
||||
|
||||
#include "UnityPBSLighting.cginc"
|
||||
#include "Lighting.cginc"
|
||||
|
||||
#ifdef UNITY_PASS_SHADOWCASTER
|
||||
#undef INTERNAL_DATA
|
||||
#undef WorldReflectionVector
|
||||
#undef WorldNormalVector
|
||||
#define INTERNAL_DATA half3 internalSurfaceTtoW0; half3 internalSurfaceTtoW1; half3 internalSurfaceTtoW2;
|
||||
#define WorldReflectionVector(data,normal) reflect (data.worldRefl, half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal)))
|
||||
#define WorldNormalVector(data,normal) half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal))
|
||||
#endif
|
||||
|
||||
struct Input
|
||||
{
|
||||
float3 worldNormal;
|
||||
float4 screenPos;
|
||||
INTERNAL_DATA
|
||||
float2 uv_texcoord;
|
||||
float2 uv2_texcoord2;
|
||||
half facing : VFACE;
|
||||
};
|
||||
|
||||
struct SurfaceOutputCustomLightingCustom
|
||||
{
|
||||
half3 Albedo;
|
||||
half3 Normal;
|
||||
half3 Emission;
|
||||
half3 Specular;
|
||||
half Smoothness;
|
||||
half Occlusion;
|
||||
half Alpha;
|
||||
half Thickness;
|
||||
half3 SubsurfaceColour;
|
||||
Input SurfInput;
|
||||
UnityGIInput GIData;
|
||||
};
|
||||
|
||||
uniform sampler2D _MainTex; uniform float4 _MainTex_ST;
|
||||
uniform sampler2D _BumpMap;
|
||||
uniform sampler2D _MetallicGlossMap;
|
||||
uniform sampler2D _OcclusionMap;
|
||||
uniform sampler2D _ThicknessMap;
|
||||
uniform sampler2D _OverlayMap;
|
||||
uniform sampler2D _EmissionMap;
|
||||
uniform sampler2D _DetailMask;
|
||||
uniform sampler2D _DetailBumpMap; uniform float4 _DetailBumpMap_ST;
|
||||
uniform sampler2D _DetailMetallicGlossMap; uniform float4 _DetailMetallicGlossMap_ST;
|
||||
|
||||
uniform float _ThicknessMapPower;
|
||||
uniform float _ThicknessMapInvert;
|
||||
uniform float3 _SSSCol;
|
||||
uniform float _SSSAmbient;
|
||||
uniform float _SSSIntensity;
|
||||
uniform float _SSSPow;
|
||||
uniform float _SSSDist;
|
||||
uniform float _SSSShadow;
|
||||
uniform float4 _Color;
|
||||
uniform float3 _OverlayColor;
|
||||
uniform float3 _EmissionColor;
|
||||
uniform float3 _SpecularColor;
|
||||
|
||||
uniform float _DetailBumpMapScale;
|
||||
uniform float _ScatteringByAlbedo;
|
||||
uniform float _SmoothnessFromAlbedo;
|
||||
uniform float _BumpScale;
|
||||
uniform float _OcclusionStrength;
|
||||
uniform float _GlossMapScale;
|
||||
uniform float _Cutout;
|
||||
|
||||
uniform float _WrappingFactor;
|
||||
uniform float _WrappingPowerFactor;
|
||||
|
||||
uniform float _SecondUVSource;
|
||||
uniform float _OcclusionUVSource;
|
||||
uniform float _ThicknessUVSource;
|
||||
|
||||
#include "SSS_Utils.cginc"
|
||||
#include "SSS_Core.cginc"
|
||||
|
||||
inline void LightingStandardCustomLighting_GI( inout SurfaceOutputCustomLightingCustom s, UnityGIInput data, inout UnityGI gi )
|
||||
{
|
||||
s.GIData = data;
|
||||
}
|
||||
|
||||
void surf( Input i , inout SurfaceOutputCustomLightingCustom s1 )
|
||||
{
|
||||
s1.SurfInput = i;
|
||||
|
||||
float2 scaledUV = TRANSFORM_TEX(i.uv_texcoord, _MainTex);
|
||||
|
||||
float4 _MainTex_var = tex2D( _MainTex, scaledUV );
|
||||
float2 texcoord2 = _SecondUVSource? i.uv2_texcoord2 : scaledUV;
|
||||
float detailMask = tex2D( _DetailMask, scaledUV ).a;
|
||||
float3 overlayMask = tex2D(_OverlayMap,texcoord2).rgb*detailMask;
|
||||
|
||||
#if defined(USE_DETAIL_AS_ALPHA)
|
||||
_Color.a = lerp( _Color.a, tex2D( _OverlayMap, texcoord2 ).rgb,
|
||||
detailMask);
|
||||
#endif
|
||||
|
||||
#if !(defined(_ALPHATEST_ON) || defined(_ALPHABLEND_ON) || defined(_ALPHAPREMULTIPLY_ON))
|
||||
s1.Alpha = 1.0;
|
||||
#else
|
||||
s1.Alpha = (_SmoothnessFromAlbedo? 1.0 : _MainTex_var.a) * _Color.a;
|
||||
s1.Alpha = ((s1.Alpha - _Cutout) / max(fwidth(s1.Alpha), 0.0001) + 0.5);
|
||||
clip(s1.Alpha - 1.0/255.0 );
|
||||
#endif
|
||||
|
||||
#if defined(USE_DETAIL_AS_ALPHA)
|
||||
s1.Albedo = _MainTex_var.rgb * _Color;
|
||||
#else
|
||||
s1.Albedo = lerp(_MainTex_var.rgb * _Color, _OverlayColor, overlayMask);
|
||||
#endif
|
||||
|
||||
s1.Normal = NormalInTangentSpace(scaledUV, texcoord2, detailMask);
|
||||
|
||||
s1.Emission = tex2D( _EmissionMap, scaledUV ).rgb * _EmissionColor.rgb;
|
||||
float4 _MetallicGlossMap_var = tex2D( _MetallicGlossMap, scaledUV );
|
||||
float4 detailMetallicGlossMap_var = tex2D (_DetailMetallicGlossMap, TRANSFORM_TEX(texcoord2, _DetailMetallicGlossMap));
|
||||
_MetallicGlossMap_var *= lerp(1.0, detailMetallicGlossMap_var, detailMask);
|
||||
|
||||
#if defined(SSS_METALLIC)
|
||||
s1.Specular = _MetallicGlossMap_var.r;
|
||||
#else
|
||||
s1.Specular = _MetallicGlossMap_var.rgb;
|
||||
#endif
|
||||
|
||||
s1.Specular *= _SpecularColor;
|
||||
|
||||
s1.Smoothness = _SmoothnessFromAlbedo? _MainTex_var.a : _MetallicGlossMap_var.a;
|
||||
s1.Smoothness *= _GlossMapScale;
|
||||
|
||||
float2 occlusionUV = _OcclusionUVSource? i.uv2_texcoord2 : scaledUV;
|
||||
s1.Occlusion = LerpOneTo(tex2D( _OcclusionMap, occlusionUV ).g, _OcclusionStrength);
|
||||
|
||||
float2 thicknessUV = _ThicknessUVSource? i.uv2_texcoord2 : scaledUV;
|
||||
float3 thicknessMap_var = tex2D( _ThicknessMap, thicknessUV ).rgb;
|
||||
s1.Thickness = pow(abs(_ThicknessMapInvert-thicknessMap_var), _ThicknessMapPower);
|
||||
s1.SubsurfaceColour = _ScatteringByAlbedo? _SSSCol*s1.Albedo : _SSSCol;
|
||||
}
|
||||
|
||||
inline half4 LightingStandardCustomLighting( inout SurfaceOutputCustomLightingCustom s, half3 viewDir, UnityGI gi )
|
||||
{
|
||||
UnityGIInput data = s.GIData;
|
||||
Input i = s.SurfInput;
|
||||
half4 c = 0;
|
||||
|
||||
#if defined(SSS_METALLIC)
|
||||
SurfaceOutputStandardSSSS s1 = (SurfaceOutputStandardSSSS ) 0;
|
||||
#else
|
||||
SurfaceOutputStandardSpecularSSSS s1 = (SurfaceOutputStandardSpecularSSSS ) 0;
|
||||
#endif
|
||||
|
||||
s1.Albedo = s.Albedo;
|
||||
s1.Normal = s.Normal;
|
||||
s1.Emission = s.Emission;
|
||||
#if defined(SSS_METALLIC)
|
||||
s1.Metallic = s.Specular.r;
|
||||
#else
|
||||
s1.Specular = s.Specular;
|
||||
#endif
|
||||
s1.Smoothness = s.Smoothness;
|
||||
s1.Occlusion = s.Occlusion;
|
||||
s1.Alpha = s.Alpha;
|
||||
s1.Thickness = s.Thickness;
|
||||
|
||||
s1.Smoothness = GeometricNormalFiltering(s1.Smoothness, i.worldNormal, 0.25, 0.5);
|
||||
|
||||
data.light = gi.light;
|
||||
|
||||
UnityGI gi1 = gi;
|
||||
#ifdef UNITY_PASS_FORWARDBASE
|
||||
Unity_GlossyEnvironmentData g1 =
|
||||
UnityGlossyEnvironmentSetup( s.Smoothness, data.worldViewDir, s1.Normal, float3(0,0,0));
|
||||
gi1 = UnityGlobalIllumination_Geom( data, 1.0, s1.Normal, g1, s1.Thickness);
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
float NdotV = saturate(abs(dot(s1.Normal, viewDir)));
|
||||
float occlusion = ComputeMicroShadowing(s1.Occlusion * 0.8 + 0.3, NdotV, 1.0);
|
||||
float3 occlusionCol = GTAOMultiBounce( saturate(occlusion * 1.2), s1.Albedo);
|
||||
gi1.indirect.diffuse *= occlusionCol;
|
||||
gi1.indirect.specular *= occlusion;
|
||||
|
||||
float NdotL = saturate(abs(dot(s1.Normal, gi.light.dir)));
|
||||
occlusion = ComputeMicroShadowing(s1.Occlusion * 0.8 + 0.3, NdotL, 1.0);
|
||||
occlusionCol = GTAOMultiBounce( saturate(occlusion * 1.2), s1.Albedo);
|
||||
gi.light.color *= occlusionCol;
|
||||
#endif
|
||||
|
||||
#ifdef UNITY_PASS_FORWARDBASE
|
||||
float ase_lightAtten = data.atten;
|
||||
if( _LightColor0.a == 0)
|
||||
ase_lightAtten = 0;
|
||||
#else
|
||||
float3 ase_lightAttenRGB = gi.light.color / ( ( _LightColor0.rgb ) + 0.000001 );
|
||||
float ase_lightAtten = max( max( ase_lightAttenRGB.r, ase_lightAttenRGB.g ), ase_lightAttenRGB.b );
|
||||
#endif
|
||||
|
||||
#if defined(HANDLE_SHADOWS_BLENDING_IN_GI)
|
||||
half bakedAtten = UnitySampleBakedOcclusion(data.lightmapUV.xy, data.worldPos);
|
||||
float zDist = dot(_WorldSpaceCameraPos - data.worldPos, UNITY_MATRIX_V[2].xyz);
|
||||
float fadeDist = UnityComputeShadowFadeDistance(data.worldPos, zDist);
|
||||
ase_lightAtten = UnityMixRealtimeAndBakedShadows(data.atten, bakedAtten, UnityComputeShadowFade(fadeDist));
|
||||
#endif
|
||||
|
||||
#if defined(SSS_METALLIC)
|
||||
float3 finalResult = LightingStandardSSSS ( s1, data, gi1 ).rgb;
|
||||
#else
|
||||
float3 finalResult = LightingStandardSSSSSpecular ( s1, data, gi1 ).rgb;
|
||||
#endif
|
||||
|
||||
finalResult += getSubsurfaceScatteringLight(gi.light.color, gi.light.dir, s1.Normal, data.worldViewDir,
|
||||
LerpOneTo(ase_lightAtten, _SSSShadow), s1.Thickness, gi1.indirect.diffuse, s.SubsurfaceColour );
|
||||
|
||||
finalResult += s1.Emission;
|
||||
|
||||
c.rgb = finalResult;
|
||||
c.a = s1.Alpha;
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
#endif // SSS_INPUT_INCLUDED
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6e88fd0cd8e9dd446a184fd9e762d9a5
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
nonModifiableTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 35611
|
||||
packageName: UMA 2
|
||||
packageVersion: 2.13
|
||||
assetPath: Assets/UMA/Content/SkinShaders/standard-subsurface-scattering-master/Shaders/SSSSS/SSS_Standard.cginc
|
||||
uploadId: 679826
|
||||
+415
@@ -0,0 +1,415 @@
|
||||
#ifndef SSS_UTILS_INCLUDED
|
||||
#define SSS_UTILS_INCLUDED
|
||||
//-----------------------------------------------------------------------------
|
||||
// Helper functions
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
float RoughnessToPerceptualRoughness_local(float roughness)
|
||||
{
|
||||
return sqrt(roughness);
|
||||
}
|
||||
|
||||
float RoughnessToPerceptualSmoothness_local(float roughness)
|
||||
{
|
||||
return 1.0 - sqrt(roughness);
|
||||
}
|
||||
|
||||
float PerceptualSmoothnessToRoughness_local(float perceptualSmoothness)
|
||||
{
|
||||
return (1.0 - perceptualSmoothness) * (1.0 - perceptualSmoothness);
|
||||
}
|
||||
|
||||
float PerceptualSmoothnessToPerceptualRoughness_local(float perceptualSmoothness)
|
||||
{
|
||||
return (1.0 - perceptualSmoothness);
|
||||
}
|
||||
|
||||
float PerceptualRoughnessToPerceptualSmoothness_local(float perceptualRoughness)
|
||||
{
|
||||
return (1.0 - perceptualRoughness);
|
||||
}
|
||||
|
||||
// Return modified perceptualSmoothness based on provided variance (get from GeometricNormalVariance + TextureNormalVariance)
|
||||
float NormalFiltering(float perceptualSmoothness, float variance, float threshold)
|
||||
{
|
||||
float roughness = PerceptualSmoothnessToRoughness_local(perceptualSmoothness);
|
||||
// Ref: Geometry into Shading - http://graphics.pixar.com/library/BumpRoughness/paper.pdf - equation (3)
|
||||
float squaredRoughness = saturate(roughness * roughness + min(2.0 * variance, threshold * threshold)); // threshold can be floatly low, square the value for easier control
|
||||
|
||||
return RoughnessToPerceptualSmoothness_local(sqrt(squaredRoughness));
|
||||
}
|
||||
|
||||
// Reference: Error Reduction and Simplification for Shading Anti-Aliasing
|
||||
// Specular antialiasing for geometry-induced normal (and NDF) variations: Tokuyoshi / Kaplanyan et al.'s method.
|
||||
// This is the deferred approximation, which works reasonably well so we keep it for forward too for now.
|
||||
// screenSpaceVariance should be at most 0.5^2 = 0.25, as that corresponds to considering
|
||||
// a gaussian pixel reconstruction kernel with a standard deviation of 0.5 of a pixel, thus 2 sigma covering the whole pixel.
|
||||
float GeometricNormalVariance(float3 geometricNormalWS, float screenSpaceVariance)
|
||||
{
|
||||
float3 deltaU = ddx(geometricNormalWS);
|
||||
float3 deltaV = ddy(geometricNormalWS);
|
||||
|
||||
return screenSpaceVariance * (dot(deltaU, deltaU) + dot(deltaV, deltaV));
|
||||
}
|
||||
|
||||
// Return modified perceptualSmoothness
|
||||
float GeometricNormalFiltering(float perceptualSmoothness, float3 geometricNormalWS, float screenSpaceVariance, float threshold)
|
||||
{
|
||||
float variance = GeometricNormalVariance(geometricNormalWS, screenSpaceVariance);
|
||||
return NormalFiltering(perceptualSmoothness, variance, threshold);
|
||||
}
|
||||
|
||||
//SSS method from GDC 2011 conference by Colin Barre-Bresebois & Marc Bouchard and modified by Xiexe
|
||||
float3 getSubsurfaceScatteringLight (float3 lightColor, float3 lightDirection, float3 normalDirection, float3 viewDirection,
|
||||
float attenuation, float3 thickness, float3 indirectLight, float3 subsurfaceColour)
|
||||
{
|
||||
float3 vLTLight = lightDirection + normalDirection * _SSSDist; // Distortion
|
||||
float3 fLTDot = pow(saturate(dot(viewDirection, -vLTLight)), _SSSPow)
|
||||
* _SSSIntensity * 1.0/UNITY_PI;
|
||||
|
||||
return lerp(1, attenuation, float(any(_WorldSpaceLightPos0.xyz)))
|
||||
* (fLTDot + _SSSAmbient) * thickness
|
||||
* (lightColor + indirectLight) * subsurfaceColour;
|
||||
|
||||
}
|
||||
|
||||
inline float3 BlendNormalsPD(float3 n1, float3 n2) {
|
||||
return normalize(float3(n1.xy*n2.z + n2.xy*n1.z, n1.z*n2.z));
|
||||
}
|
||||
|
||||
// Based on NormalInTangentSpace from UnityStandardInput
|
||||
inline float3 NormalInTangentSpace(float2 texcoords, float2 texcoords2, half mask)
|
||||
{
|
||||
//float3 normalTangent = UnpackNormal(tex2D(_BumpMap,TRANSFORM_TEX(texcoords.xy, _MainTex)));
|
||||
//float3 normalTangent = UnpackNormal(tex2D(_BumpMap,texcoords.xy));
|
||||
half3 normalTangent = UnpackScaleNormal(tex2D (_BumpMap, texcoords.xy), _BumpScale);
|
||||
|
||||
half3 detailNormalTangent = UnpackScaleNormal(tex2D (_DetailBumpMap, TRANSFORM_TEX(texcoords2.xy, _DetailBumpMap)), _DetailBumpMapScale);
|
||||
#if _DETAIL_LERP
|
||||
normalTangent = lerp(
|
||||
normalTangent,
|
||||
detailNormalTangent,
|
||||
mask);
|
||||
#else
|
||||
normalTangent = lerp(
|
||||
normalTangent,
|
||||
BlendNormalsPD(normalTangent, detailNormalTangent),
|
||||
mask);
|
||||
#endif
|
||||
|
||||
return normalTangent;
|
||||
}
|
||||
|
||||
// "R2" dithering
|
||||
|
||||
// Triangle Wave
|
||||
float T(float z) {
|
||||
return z >= 0.5 ? 2.-2.*z : 2.*z;
|
||||
}
|
||||
|
||||
// R dither mask
|
||||
float intensity(float2 pixel) {
|
||||
const float a1 = 0.75487766624669276;
|
||||
const float a2 = 0.569840290998;
|
||||
return frac(a1 * float(pixel.x) + a2 * float(pixel.y));
|
||||
}
|
||||
|
||||
// Get the maximum SH contribution
|
||||
// synqark's Arktoon shader's shading method
|
||||
half3 GetSHLength ()
|
||||
{
|
||||
half3 x, x1;
|
||||
x.r = length(unity_SHAr);
|
||||
x.g = length(unity_SHAg);
|
||||
x.b = length(unity_SHAb);
|
||||
x1.r = length(unity_SHBr);
|
||||
x1.g = length(unity_SHBg);
|
||||
x1.b = length(unity_SHBb);
|
||||
return x + x1;
|
||||
}
|
||||
|
||||
half3 min3(float a, float b, float c) {
|
||||
return min(min(a, b), c);
|
||||
}
|
||||
|
||||
half3 min3(float3 a) {
|
||||
return min(min(a.x, a.y), a.z);
|
||||
}
|
||||
|
||||
half3 max3(float a, float b, float c) {
|
||||
return max(max(a, b), c);
|
||||
}
|
||||
|
||||
half3 max3(float3 a) {
|
||||
return max(max(a.x, a.y), a.z);
|
||||
}
|
||||
|
||||
half3 GetSHAvg ()
|
||||
{
|
||||
return float3(unity_SHAr.w,unity_SHAg.w,unity_SHAb.w);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Better GI functions
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
/* http://www.geomerics.com/wp-content/uploads/2015/08/CEDEC_Geomerics_ReconstructingDiffuseLighting1.pdf */
|
||||
float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n)
|
||||
{
|
||||
// average energy
|
||||
float R0 = L0;
|
||||
|
||||
// avg direction of incoming light
|
||||
float3 R1 = 0.5f * L1;
|
||||
|
||||
// directional brightness
|
||||
float lenR1 = length(R1);
|
||||
|
||||
// linear angle between normal and direction 0-1
|
||||
//float q = 0.5f * (1.0f + dot(R1 / lenR1, n));
|
||||
//float q = dot(R1 / lenR1, n) * 0.5 + 0.5;
|
||||
float q = dot(normalize(R1), n) * 0.5 + 0.5;
|
||||
q = saturate(q); // Thanks to ScruffyRuffles for the bug identity.
|
||||
|
||||
// power for q
|
||||
// lerps from 1 (linear) to 3 (cubic) based on directionality
|
||||
float p = 1.0f + 2.0f * lenR1 / R0;
|
||||
|
||||
// dynamic range constant
|
||||
// should vary between 4 (highly directional) and 0 (ambient)
|
||||
float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0);
|
||||
|
||||
return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p));
|
||||
}
|
||||
|
||||
// From https://github.com/lukis101/VRCUnityStuffs/tree/master/SH
|
||||
// SH Convolution Functions
|
||||
// Code adapted from https://blog.selfshadow.com/2012/01/07/righting-wrap-part-2/
|
||||
///////////////////////////
|
||||
|
||||
float3 GeneralWrapSH(float fA) // original unoptimized
|
||||
{
|
||||
// Normalization factor for our model.
|
||||
float norm = 0.5 * (2 + fA) / (1 + fA);
|
||||
float4 t = float4(2 * (fA + 1), fA + 2, fA + 3, fA + 4);
|
||||
return norm * float3(t.x / t.y, 2 * t.x / (t.y * t.z),
|
||||
t.x * (fA * fA - t.x + 5) / (t.y * t.z * t.w));
|
||||
}
|
||||
float3 GeneralWrapSHOpt(float fA)
|
||||
{
|
||||
const float4 t0 = float4(-0.047771, -0.129310, 0.214438, 0.279310);
|
||||
const float4 t1 = float4( 1.000000, 0.666667, 0.250000, 0.000000);
|
||||
|
||||
float3 r;
|
||||
r.xyz = saturate(t0.xxy * fA + t0.yzw);
|
||||
r.xyz = -r * fA + t1.xyz;
|
||||
return r;
|
||||
}
|
||||
|
||||
float3 GreenWrapSHOpt(float fW)
|
||||
{
|
||||
const float4 t0 = float4(0.0, 1.0 / 4.0, -1.0 / 3.0, -1.0 / 2.0);
|
||||
const float4 t1 = float4(1.0, 2.0 / 3.0, 1.0 / 4.0, 0.0);
|
||||
|
||||
float3 r;
|
||||
r.xyz = t0.xxy * fW + t0.xzw;
|
||||
r.xyz = r.xyz * fW + t1.xyz;
|
||||
return r;
|
||||
}
|
||||
|
||||
float3 ShadeSH9_wrapped(float3 normal, float3 conv)
|
||||
{
|
||||
float3 x0, x1, x2;
|
||||
conv *= float3(1, 1.5, 4); // Undo pre-applied cosine convolution
|
||||
//conv *= _Bands.xyz; // debugging
|
||||
|
||||
// Constant (L0)
|
||||
// Band 0 has constant part from 6th kernel (band 1) pre-applied, but ignore for performance
|
||||
x0 = float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w);
|
||||
|
||||
// Linear (L1) polynomial terms
|
||||
x1.r = (dot(unity_SHAr.xyz, normal));
|
||||
x1.g = (dot(unity_SHAg.xyz, normal));
|
||||
x1.b = (dot(unity_SHAb.xyz, normal));
|
||||
|
||||
// 4 of the quadratic (L2) polynomials
|
||||
float4 vB = normal.xyzz * normal.yzzx;
|
||||
x2.r = dot(unity_SHBr, vB);
|
||||
x2.g = dot(unity_SHBg, vB);
|
||||
x2.b = dot(unity_SHBb, vB);
|
||||
|
||||
// Final (5th) quadratic (L2) polynomial
|
||||
float vC = normal.x * normal.x - normal.y * normal.y;
|
||||
x2 += unity_SHC.rgb * vC;
|
||||
|
||||
return x0 * conv.x + x1 * conv.y + x2 * conv.z;
|
||||
}
|
||||
|
||||
float3 ShadeSH9_wrappedCorrect(float3 normal, float3 conv)
|
||||
{
|
||||
const float3 cosconv_inv = float3(1, 1.5, 4); // Inverse of the pre-applied cosine convolution
|
||||
float3 x0, x1, x2;
|
||||
conv *= cosconv_inv; // Undo pre-applied cosine convolution
|
||||
//conv *= _Bands.xyz; // debugging
|
||||
|
||||
// Constant (L0)
|
||||
x0 = float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w);
|
||||
// Remove the constant part from L2 and add it back with correct convolution
|
||||
float3 otherband = float3(unity_SHBr.z, unity_SHBg.z, unity_SHBb.z) / 3.0;
|
||||
x0 = (x0 + otherband) * conv.x - otherband * conv.z;
|
||||
|
||||
// Linear (L1) polynomial terms
|
||||
x1.r = (dot(unity_SHAr.xyz, normal));
|
||||
x1.g = (dot(unity_SHAg.xyz, normal));
|
||||
x1.b = (dot(unity_SHAb.xyz, normal));
|
||||
|
||||
// 4 of the quadratic (L2) polynomials
|
||||
float4 vB = normal.xyzz * normal.yzzx;
|
||||
x2.r = dot(unity_SHBr, vB);
|
||||
x2.g = dot(unity_SHBg, vB);
|
||||
x2.b = dot(unity_SHBb, vB);
|
||||
|
||||
// Final (5th) quadratic (L2) polynomial
|
||||
float vC = normal.x * normal.x - normal.y * normal.y;
|
||||
x2 += unity_SHC.rgb * vC;
|
||||
|
||||
return x0 + x1 * conv.y + x2 * conv.z;
|
||||
}
|
||||
|
||||
float PositivePow(float base, float power)
|
||||
{
|
||||
return pow(abs(base), power);
|
||||
}
|
||||
|
||||
bool isReflectionProbeActive()
|
||||
{
|
||||
#ifndef SHADER_TARGET_SURFACE_ANALYSIS // Required to use GetDimensions
|
||||
float height, width;
|
||||
unity_SpecCube0.GetDimensions(width, height);
|
||||
return !(height * width < 32);
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Ref: Moving Frostbite to PBR - Gotanda siggraph 2011
|
||||
// Return specular occlusion based on ambient occlusion (usually get from SSAO) and view/roughness info
|
||||
float GetSpecularOcclusionFromAmbientOcclusion(float NdotV, float ambientOcclusion, float roughness)
|
||||
{
|
||||
return saturate(PositivePow(NdotV + ambientOcclusion, exp2(-16.0 * roughness - 1.0)) - 1.0 + ambientOcclusion);
|
||||
}
|
||||
|
||||
inline UnityGI UnityGlobalIllumination_Geom (UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn,
|
||||
half thickness = 0.5)
|
||||
{
|
||||
UnityGI o_gi = UnityGI_Base(data, occlusion, normalWorld);
|
||||
#if UNITY_SHOULD_SAMPLE_SH
|
||||
#if 0
|
||||
o_gi.indirect.diffuse = ShadeSHPerPixel(normalWorld, data.ambient, data.worldPos);
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
float3 L0 = float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w);
|
||||
float3 nonLinearSH = float3(0,0,0);
|
||||
nonLinearSH.r = shEvaluateDiffuseL1Geomerics_local(L0.r, unity_SHAr.xyz, normalWorld);
|
||||
nonLinearSH.g = shEvaluateDiffuseL1Geomerics_local(L0.g, unity_SHAg.xyz, normalWorld);
|
||||
nonLinearSH.b = shEvaluateDiffuseL1Geomerics_local(L0.b, unity_SHAb.xyz, normalWorld);
|
||||
nonLinearSH = max(nonLinearSH, 0);
|
||||
nonLinearSH += SHEvalLinearL2(half4(normal, 1.0));
|
||||
o_gi.indirect.diffuse += nonLinearSH * occlusion;
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
float shWrap = thickness;
|
||||
float3 sh_conv = GeneralWrapSH(shWrap);
|
||||
o_gi.indirect.diffuse = ShadeSH9_wrappedCorrect(normalWorld, sh_conv);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
half NdotV = abs(dot(normalWorld, data.worldViewDir));
|
||||
float specOcclusion = GetSpecularOcclusionFromAmbientOcclusion(NdotV, occlusion, glossIn.roughness);
|
||||
#else
|
||||
float specOcclusion = occlusion;
|
||||
#endif
|
||||
|
||||
|
||||
if (isReflectionProbeActive())
|
||||
{
|
||||
o_gi.indirect.specular = UnityGI_IndirectSpecular(data, specOcclusion, glossIn);
|
||||
} else
|
||||
{
|
||||
// Use light probes for the indirect specular lighting.
|
||||
o_gi.indirect.specular = o_gi.indirect.diffuse;
|
||||
}
|
||||
return o_gi;
|
||||
}
|
||||
|
||||
half3 BetterSH9 (half4 normal) {
|
||||
float3 indirect;
|
||||
float3 L0 = float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w);
|
||||
indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, unity_SHAr.xyz, normal);
|
||||
indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, unity_SHAg.xyz, normal);
|
||||
indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, unity_SHAb.xyz, normal);
|
||||
indirect = max(0, indirect);
|
||||
return indirect;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Ref: Horizon Occlusion for Normal Mapped Reflections: http://marmosetco.tumblr.com/post/81245981087
|
||||
float GetHorizonOcclusion(float3 V, float3 normalWS, float3 vertexNormal, float horizonFade)
|
||||
{
|
||||
float3 R = reflect(-V, normalWS);
|
||||
float specularOcclusion = saturate(1.0 + horizonFade * dot(R, vertexNormal));
|
||||
// smooth it
|
||||
return specularOcclusion * specularOcclusion;
|
||||
}
|
||||
|
||||
// ref: Practical floattime Strategies for Accurate Indirect Occlusion
|
||||
// Update ambient occlusion to colored ambient occlusion based on statitics of how light is bouncing in an object and with the albedo of the object
|
||||
float3 GTAOMultiBounce(float visibility, float3 albedo)
|
||||
{
|
||||
float3 a = 2.0404 * albedo - 0.3324;
|
||||
float3 b = -4.7951 * albedo + 0.6417;
|
||||
float3 c = 2.7552 * albedo + 0.6903;
|
||||
|
||||
float x = visibility;
|
||||
return max(x, ((x * a + b) * x + c) * x);
|
||||
}
|
||||
|
||||
// Ref: The Technical Art of Uncharted 4 - Brinck and Maximov 2016
|
||||
float ComputeMicroShadowing(float AO, float NdotL, float opacity)
|
||||
{
|
||||
float aperture = 2.0 * AO * AO;
|
||||
float microshadow = saturate(NdotL + aperture - 1.0);
|
||||
return lerp(1.0, microshadow, opacity);
|
||||
}
|
||||
|
||||
// Invoke with finalcolor:ApplyDitherAlpha
|
||||
// Must be defined after surf in file.
|
||||
void ApplyDitherAlpha(Input IN, SurfaceOutputCustomLightingCustom o, inout fixed4 color) {
|
||||
float2 pos = (IN.screenPos.xy*_ScreenParams)/IN.screenPos.w;
|
||||
pos += _SinTime.x%4;
|
||||
float alpha = o.Alpha;
|
||||
|
||||
#if !(defined(_ALPHATEST_ON) || defined(_ALPHABLEND_ON) || defined(_ALPHAPREMULTIPLY_ON))
|
||||
alpha = 1.0;
|
||||
#else
|
||||
alpha = ((alpha - _Cutout) / max(fwidth(alpha), 0.0001) + 0.5);
|
||||
clip(alpha - 1.0/255.0 );
|
||||
#endif
|
||||
|
||||
//float mask = (T(intensity(pos)));
|
||||
//alpha = saturate(alpha + alpha * mask);
|
||||
|
||||
color.a = alpha;
|
||||
}
|
||||
|
||||
float unityPointAttenuation(float lengthSq, float range)
|
||||
{
|
||||
// Based on https://geom.io/bakery/wiki/index.php?title=Point_Light_Attenuation
|
||||
return 1/(pow((lengthSq/range)*5, 2.0)+1);
|
||||
|
||||
}
|
||||
|
||||
#endif // SSS_UTILS_INCLUDED
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5c0344c0f457988478df793fa62f9cdd
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 35611
|
||||
packageName: UMA 2
|
||||
packageVersion: 2.13
|
||||
assetPath: Assets/UMA/Content/SkinShaders/standard-subsurface-scattering-master/Shaders/SSSSS/SSS_Utils.cginc
|
||||
uploadId: 679826
|
||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 64 KiB |
+103
@@ -0,0 +1,103 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 438762e23bc56bf4188ce947bf60e0e3
|
||||
TextureImporter:
|
||||
fileIDToRecycleName: {}
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: -1
|
||||
aniso: -1
|
||||
mipBias: -1
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 1
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
platformSettings:
|
||||
- buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
spritePackingTag:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
AssetOrigin:
|
||||
serializedVersion: 1
|
||||
productId: 35611
|
||||
packageName: UMA 2
|
||||
packageVersion: 2.13
|
||||
assetPath: Assets/UMA/Content/SkinShaders/standard-subsurface-scattering-master/Shaders/SSSSS/diffusescatteringonring_gamma1024.png
|
||||
uploadId: 679826
|
||||
Reference in New Issue
Block a user