private PackedLists <WeightedIndex> CalculateFormFactorsForColorComponent( ScatteringFormFactorCalculator formFactorCalculator, IMaterialSettings[] materialSettingsArray, int componentIdx) { var profiles = materialSettingsArray .Select(baseMaterialSettings => { UberMaterialSettings materialSettings = baseMaterialSettings as UberMaterialSettings; if (materialSettings is null) { return(null); } if (materialSettings.thinWalled) { return(null); } var volumeSettings = new VolumeParameters( materialSettings.transmittedMeasurementDistance, materialSettings.transmittedColor[componentIdx], materialSettings.scatteringMeasurementDistance, materialSettings.sssAmount, materialSettings.sssDirection); ScatteringProfile profile = new ScatteringProfile( volumeSettings.SurfaceAlbedo, volumeSettings.MeanFreePathLength); return(profile); }) .ToArray(); PackedLists <WeightedIndex> formFactors = formFactorCalculator.Calculate(profiles); return(formFactors); }
public UberMaterial(Device device, ShaderCache shaderCache, UberMaterialSettings settings, Buffer constantBuffer, ShaderResourceView[] textureViews) { this.standardShader = shaderCache.GetPixelShader <UberMaterial>(StandardShaderName); this.unorderedTransparencyShader = shaderCache.GetPixelShader <UberMaterial>(UnorderedTransparencyShaderName); this.settings = settings; this.constantBuffer = constantBuffer; this.textureViews = textureViews; }
public static UberMaterial Load(Device device, ShaderCache shaderCache, TextureLoader textureLoader, UberMaterialSettings settings) { UberConstants constants; UberTextures textures; //Base / Mixing constants.baseMixingMode = settings.baseMixing; //Base / Diffuse / Reflection SetFloatTexture(textureLoader, settings.metallicWeight, out constants.metallicWeight, out textures.metallicWeight); SetFloatTexture(textureLoader, settings.diffuseWeight, out constants.diffuseWeight, out textures.diffuseWeight); SetColorTexture(textureLoader, settings.baseColor, out constants.baseColor, out textures.baseColor); //Base / Diffuse Translucency SetFloatTexture(textureLoader, settings.translucencyWeight, out constants.translucencyWeight, out textures.translucencyWeight); constants.baseColorEffect = settings.baseColorEffect; SetColorTexture(textureLoader, settings.translucencyColor, out constants.translucencyColor, out textures.translucencyColor); constants.sssReflectanceTint = settings.sssReflectanceTint; //Base / Glossy / Reflection SetFloatTexture(textureLoader, settings.glossyWeight, out constants.glossyWeight, out textures.glossyWeight); SetFloatTexture(textureLoader, settings.glossyLayeredWeight, out constants.glossyLayeredWeight, out textures.glossyLayeredWeight); SetColorTexture(textureLoader, settings.glossyColor, out constants.glossyColor, out textures.glossyColor); constants.glossyColorEffect = settings.glossyColorEffect; SetColorTexture(textureLoader, settings.glossySpecular, out constants.glossySpecular, out textures.glossySpecular); SetFloatTexture(textureLoader, settings.glossiness, out constants.glossiness, out textures.glossiness); SetFloatTexture(textureLoader, settings.glossyReflectivity, out constants.glossyReflectivity, out textures.glossyReflectivity); SetFloatTexture(textureLoader, settings.glossyRoughness, out constants.glossyRoughness, out textures.glossyRoughness); //Base / Glossy / Refraction constants.refractionIndex = settings.refractionIndex; SetFloatTexture(textureLoader, settings.refractionWeight, out constants.refractionWeight, out textures.refractionWeight); //Base Bump SetBumpTexture(textureLoader, settings.bumpStrength, out constants.bumpStrength, out textures.bumpStrength); SetBumpTexture(textureLoader, settings.normalMap, out constants.normalMap, out textures.normalMap); // Top Coat SetFloatTexture(textureLoader, settings.topCoatWeight, out constants.topCoatWeight, out textures.topCoatWeight); SetColorTexture(textureLoader, settings.topCoatColor, out constants.topCoatColor, out textures.topCoatColor); constants.topCoatColorEffect = settings.topCoatColorEffect; SetFloatTexture(textureLoader, settings.topCoatRoughness, out constants.topCoatRoughness, out textures.topCoatRoughness); constants.topCoatLayeringMode = settings.topCoatLayeringMode; SetFloatTexture(textureLoader, settings.topCoatReflectivity, out constants.topCoatReflectivity, out textures.topCoatReflectivity); SetFloatTexture(textureLoader, settings.topCoatIor, out constants.topCoatIOR, out textures.topCoatIOR); SetFloatTexture(textureLoader, settings.topCoatCurveNormal, out constants.topCoatCurveNormal, out textures.topCoatCurveNormal); SetFloatTexture(textureLoader, settings.topCoatCurveGrazing, out constants.topCoatCurveGrazing, out textures.topCoatCurveGrazing); // Top Coat Bump SetBumpTexture(textureLoader, settings.topCoatBump, out constants.topCoatBump, out textures.topCoatBump); // Volume constants.thinWalled = settings.thinWalled ? 1 : 0; var volumeColor = Vector3.Zero; for (int colorComponent = 0; colorComponent < 3; ++colorComponent) { var volumeParameters = new VolumeParameters( settings.transmittedMeasurementDistance, settings.transmittedColor[colorComponent], settings.scatteringMeasurementDistance, settings.sssAmount, settings.sssDirection); volumeColor[colorComponent] = (float)volumeParameters.SurfaceAlbedo; } constants.volumeColor = volumeColor; // Geometry/Cutout SetFloatTexture(textureLoader, settings.cutoutOpacity, out constants.cutoutOpacity, out textures.cutoutOpacity); var constantBuffer = Buffer.Create(device, BindFlags.ConstantBuffer, ref constants, usage: ResourceUsage.Immutable); var defaultBumpTexture = textureLoader.Load(null, TextureLoader.DefaultMode.Bump); return(new UberMaterial(device, shaderCache, settings, constantBuffer, textures.ToArray(), defaultBumpTexture)); }
public IMaterialSettings Import(int surfaceIdx, MaterialBag bag) { var rawSettings = ImportRaw(bag); UberMaterialSettings settings = new UberMaterialSettings { }; settings.uvSet = rawSettings.uvSet; settings.baseMixing = rawSettings.baseMixing; var textureImporter = TextureImporter.Make(textureProcessor, figure, rawSettings.uvSet, surfaceIdx); //Base / Diffuse / Reflection settings.metallicWeight = textureImporter.ImportFloatTexture(rawSettings.metallicWeight); settings.diffuseWeight = textureImporter.ImportFloatTexture(rawSettings.diffuseWeight); settings.baseColor = textureImporter.ImportColorTexture(rawSettings.baseColor); //Base / Diffuse / Translucency settings.translucencyWeight = textureImporter.ImportFloatTexture(rawSettings.translucencyWeight); settings.baseColorEffect = rawSettings.baseColorEffect; settings.translucencyColor = textureImporter.ImportColorTexture(rawSettings.translucencyColor); settings.sssReflectanceTint = rawSettings.sssReflectanceTint; //Base / Glossy / Reflection settings.glossyWeight = textureImporter.ImportFloatTexture(rawSettings.glossyWeight); settings.glossyLayeredWeight = textureImporter.ImportFloatTexture(rawSettings.glossyLayeredWeight); settings.glossyColor = textureImporter.ImportColorTexture(rawSettings.glossyColor); settings.glossyColorEffect = rawSettings.glossyColorEffect; settings.glossyReflectivity = textureImporter.ImportFloatTexture(rawSettings.glossyReflectivity); settings.glossySpecular = textureImporter.ImportColorTexture(rawSettings.glossySpecular); settings.glossyRoughness = textureImporter.ImportFloatTexture(rawSettings.glossyRoughness); settings.glossiness = textureImporter.ImportFloatTexture(rawSettings.glossiness); //Base / Glossy / Refraction settings.refractionIndex = rawSettings.refractionIndex; settings.refractionWeight = textureImporter.ImportFloatTexture(rawSettings.refractionWeight); //Base / Bump settings.bumpStrength = textureImporter.ImportBumpTexture(rawSettings.bumpStrength); settings.normalMap = textureImporter.ImportNormalTexture(rawSettings.normalMap); //Top Coat settings.topCoatWeight = textureImporter.ImportFloatTexture(rawSettings.topCoatWeight); settings.topCoatColor = textureImporter.ImportColorTexture(rawSettings.topCoatColor); settings.topCoatColorEffect = rawSettings.topCoatColorEffect; settings.topCoatRoughness = textureImporter.ImportFloatTexture(rawSettings.topCoatRoughness); settings.topCoatGlossiness = textureImporter.ImportFloatTexture(rawSettings.topCoatGlossiness); settings.topCoatLayeringMode = rawSettings.topCoatLayeringMode; settings.topCoatReflectivity = textureImporter.ImportFloatTexture(rawSettings.topCoatReflectivity); settings.topCoatIor = textureImporter.ImportFloatTexture(rawSettings.topCoatIor); settings.topCoatCurveNormal = textureImporter.ImportFloatTexture(rawSettings.topCoatCurveNormal); settings.topCoatCurveGrazing = textureImporter.ImportFloatTexture(rawSettings.topCoatCurveGrazing); //Top Coat / Bump if (rawSettings.topCoatBumpMode != 0) { Console.WriteLine("warning: skipping top coat bump map with mode 'normal'"); settings.topCoatBump = new FloatTexture { image = null, value = 1 }; } else { settings.topCoatBump = textureImporter.ImportBumpTexture(rawSettings.topCoatBump); } //Volume settings.thinWalled = rawSettings.thinWalled; settings.transmittedMeasurementDistance = rawSettings.transmittedMeasurementDistance; settings.transmittedColor = rawSettings.transmittedColor; settings.scatteringMeasurementDistance = rawSettings.scatteringMeasurementDistance; settings.sssAmount = rawSettings.sssAmount; settings.sssDirection = rawSettings.sssDirection; //Geometry / Cutout settings.cutoutOpacity = textureImporter.ImportFloatTexture(rawSettings.cutoutOpacity); // process face transparencies if (settings.thinWalled && settings.refractionWeight.value > 0) { //HACK: assume refractive surfaces are fully transparent faceTransparencyProcessor.ProcessConstantSurface(surfaceIdx, 0); } else { faceTransparencyProcessor.ProcessSurface(surfaceIdx, rawSettings.uvSet, rawSettings.cutoutOpacity); } return(settings); }