Пример #1
0
    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);
    }
Пример #2
0
 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));
    }
Пример #4
0
    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);
    }