public SSAOFilter(NormalMapRenderer normalMapRenderer) : base(new ShaderProperties().SetProperty("NO_GI", true), (string)AssetManager.Load(AppDomain.CurrentDomain.BaseDirectory + "\\shaders\\post\\ssao.frag")) { this.normalMapRenderer = normalMapRenderer; noiseTex = AssetManager.LoadTexture(AppDomain.CurrentDomain.BaseDirectory + "\\textures\\noise_ssao.png"); Random rand = new Random(); for (int i = 0; i < kernel.Length; i++) kernel[i] = new Vector3f((float)rand.NextDouble()*10f, (float)rand.NextDouble() * 10f, (float)rand.NextDouble() * 10f); }
public SSAOFilter(NormalMapRenderer normalMapRenderer) : base(new ShaderProperties().SetProperty("NO_GI", true), (string)AssetManager.Load(AppDomain.CurrentDomain.BaseDirectory + "\\shaders\\post\\ssao.frag")) { this.normalMapRenderer = normalMapRenderer; noiseTex = AssetManager.LoadTexture(AppDomain.CurrentDomain.BaseDirectory + "\\textures\\noise_ssao.png"); Random rand = new Random(); for (int i = 0; i < kernel.Length; i++) { kernel[i] = new Vector3f((float)rand.NextDouble() * 10f, (float)rand.NextDouble() * 10f, (float)rand.NextDouble() * 10f); } }
public NormalMapRenderer MakeNormalMapRenderer(ChannelInputs ldChannelInputs, ChannelInputs hdChannelInputs, UvSet uvSet) { var ldChannelOutputs = figure.Evaluate(null, ldChannelInputs); var hdChannelOutputs = figure.Evaluate(null, hdChannelInputs); var ldControlPositions = figure.Geometry.VertexPositions.Select(p => p).ToArray(); figure.Morpher.Apply(ldChannelOutputs, ldControlPositions); var hdControlPositions = figure.Geometry.VertexPositions.Select(p => p).ToArray(); figure.Morpher.Apply(hdChannelOutputs, hdControlPositions); var activeHdMorphs = figure.Morpher.LoadActiveHdMorphs(hdChannelOutputs); int maxLevel = activeHdMorphs.Max(morph => morph.Morph.MaxLevel) + ExtraRefinementLevels; var controlTopology = new QuadTopology(figure.Geometry.VertexCount, figure.Geometry.Faces); var applier = HdMorphApplier.Make(controlTopology, hdControlPositions); var controlUvTopology = new QuadTopology(uvSet.Uvs.Length, uvSet.Faces); var controlUvs = uvSet.Uvs; var refinement = new Refinement(controlTopology, maxLevel); var uvRefinement = new Refinement(controlUvTopology, maxLevel, BoundaryInterpolation.EdgeAndCorner); var topology = controlTopology; var ldPositions = ldControlPositions; var hdPositions = hdControlPositions; var uvTopology = controlUvTopology; var uvs = controlUvs; var texturedLdPositions = ExtractTexturedPositions(topology, uvTopology, ldPositions); for (int levelIdx = 1; levelIdx <= maxLevel; ++levelIdx) { topology = refinement.GetTopology(levelIdx); ldPositions = refinement.Refine(levelIdx, ldPositions); hdPositions = refinement.Refine(levelIdx, hdPositions); foreach (var activeHdMorph in activeHdMorphs) { applier.Apply(activeHdMorph.Morph, activeHdMorph.Weight, levelIdx, topology, hdPositions); } uvTopology = uvRefinement.GetTopology(levelIdx); uvs = uvRefinement.Refine(levelIdx, uvs); texturedLdPositions = uvRefinement.Refine(levelIdx, texturedLdPositions); } var ldLimit = refinement.Limit(ldPositions); var hdLimit = refinement.Limit(hdPositions); var uvLimit = uvRefinement.Limit(uvs); var texturedLdLimit = uvRefinement.Limit(texturedLdPositions); int[] faceMap = refinement.GetFaceMap(); refinement.Dispose(); uvRefinement.Dispose(); var hdNormals = CalculateNormals(hdLimit); var ldNormals = CalculateNormals(ldLimit); var ldTangents = CalculateTangents(uvLimit, texturedLdLimit); int[] controlSurfaceMap = figure.Geometry.SurfaceMap; int[] surfaceMap = faceMap .Select(controlFaceIdx => controlSurfaceMap[controlFaceIdx]) .ToArray(); var renderer = new NormalMapRenderer(device, shaderCache, hdNormals, ldNormals, topology.Faces, uvLimit.values, ldTangents, uvTopology.Faces, surfaceMap); return(renderer); }
public SSRFilter(NormalMapRenderer normalMapRenderer) : base((string)AssetManager.Load(AppDomain.CurrentDomain.BaseDirectory + "\\shaders\\post\\ssr.frag")) { this.normalMapRenderer = normalMapRenderer; }
private void DumpNormals(TextureProcessor textureProcessor, DirectoryInfo shapeDirectory, ShapeImportConfiguration shapeImportConfiguration, ChannelInputs shapeInputs) { var normalsConf = shapeImportConfiguration?.normals; var baseNormalsConf = baseConfiguration?.normals; if (normalsConf == null && baseNormalsConf == null) { return; } var recipeFile = shapeDirectory.File("shape-normals.dat"); if (recipeFile.Exists) { return; } var surfaceGroups = normalsConf?.surfaceGroups ?? baseNormalsConf?.surfaceGroups; var uvSetName = normalsConf?.uvSet ?? baseNormalsConf?.uvSet ?? figure.DefaultUvSet.Name; var uvSet = figure.UvSets[uvSetName]; var surfaceNames = figure.Geometry.SurfaceNames; Dictionary <string, int> surfaceNameToIdx = Enumerable.Range(0, surfaceNames.Length) .ToDictionary(idx => surfaceNames[idx], idx => idx); bool generateFromHd = normalsConf?.generatedFromHd ?? false; var generatedTextureDirectory = CommonPaths.WorkDir.Subdirectory("generated-textures"); NormalMapRenderer normalMapRenderer = null; string[] textureNamesBySurface = Enumerable.Repeat(ShapeNormalsRecipe.DefaultTextureName, surfaceNames.Length).ToArray(); for (int groupIdx = 0; groupIdx < surfaceGroups.Count; ++groupIdx) { var surfaceIdxs = surfaceGroups[groupIdx] .Select(surfaceName => surfaceNameToIdx[surfaceName]) .ToList(); FileInfo textureFile; if (!generateFromHd) { var texturePath = normalsConf?.textures?[groupIdx]; if (texturePath == null) { continue; } textureFile = fileLocator.Locate(texturePath).File; } else { textureFile = generatedTextureDirectory.File($"normal-map-{shapeImportConfiguration.name}-{groupIdx}.png"); if (!textureFile.Exists) { if (normalMapRenderer == null) { Console.WriteLine($"Generating normals for shape '{shapeImportConfiguration.name}'..."); normalMapRenderer = hdMorphToNormalMapConverter.MakeNormalMapRenderer(figure, uvSet, shapeInputs); } var normalMap = normalMapRenderer.Render(new HashSet <int>(surfaceIdxs)); generatedTextureDirectory.CreateWithParents(); normalMap.Save(textureFile); normalMap.Dispose(); } } foreach (int surfaceIdx in surfaceIdxs) { var mask = TextureMask.Make(uvSet, figure.Geometry.SurfaceMap, surfaceIdx); var textureName = textureProcessor.RegisterForProcessing(textureFile, TextureProcessingType.Normal, true, mask); textureNamesBySurface[surfaceIdx] = textureName; } } normalMapRenderer?.Dispose(); var recipe = new ShapeNormalsRecipe(uvSetName, textureNamesBySurface); textureProcessor.RegisterAction(() => { shapeDirectory.CreateWithParents(); Persistance.Save(recipeFile, recipe); }); }