private OccluderParametersResources(Device device, OccluderParameters parameters) { vertexCount = parameters.BaseOcclusion.Length; channelWeightsBufferManager = new StructuredBufferManager <float>(device, parameters.ChannelNames.Count); baseOcclusionView = BufferUtilities.ToStructuredBufferView(device, parameters.BaseOcclusion); occlusionDeltaWeightSegmentsView = BufferUtilities.ToStructuredBufferView(device, parameters.Deltas.Segments); occlusionDeltaWeightElemsView = BufferUtilities.ToStructuredBufferView(device, parameters.Deltas.Elems); calculatedInfosBuffersBufferManager = new InOutStructuredBufferManager <uint>(device, parameters.BaseOcclusion.Length); }
public OccluderParameters CalculateOccluderParameters() { var baseInputs = MakePosedShapeInputs(); var baseOutputs = figure.Evaluate(null, baseInputs); var baseOcclusionInfos = CalculateOcclusion(baseOutputs); List <Channel> channels = new List <Channel>(); List <List <OcclusionDelta> > perVertexDeltas = new List <List <OcclusionDelta> >(); for (int i = 0; i < baseOcclusionInfos.Length; ++i) { perVertexDeltas.Add(new List <OcclusionDelta>()); } foreach (var channel in GetChannelsForOcclusionSystem()) { Console.WriteLine($"\t{channel.Name}..."); int occlusionChannelIdx = channels.Count; channels.Add(channel); var inputs = new ChannelInputs(baseInputs); channel.SetValue(inputs, 1); var outputs = figure.Evaluate(null, inputs); var occlusionInfos = CalculateOcclusion(outputs); for (int vertexIdx = 0; vertexIdx < occlusionInfos.Length; ++vertexIdx) { if (Math.Abs(occlusionInfos[vertexIdx].Front - baseOcclusionInfos[vertexIdx].Front) > OcclusionDifferenceThreshold) { var delta = new OcclusionDelta(occlusionChannelIdx, OcclusionInfo.Pack(occlusionInfos[vertexIdx])); perVertexDeltas[vertexIdx].Add(delta); } } } var parameters = new OccluderParameters( OcclusionInfo.PackArray(baseOcclusionInfos), channels.Select(channel => channel.Name).ToList(), PackedLists <OcclusionDelta> .Pack(perVertexDeltas)); return(parameters); }
public static OccluderParametersResources Make(Device device, OccluderParameters parameters) { return(parameters != null ? new OccluderParametersResources(device, parameters) : null); }
public DeformableOccluder(Device device, ShaderCache shaderCache, ChannelSystem channelSystem, OcclusionInfo[] unmorphedOcclusionInfos, OccluderParameters parameters) { this.unmorphedOcclusionInfos = unmorphedOcclusionInfos; shader = shaderCache.GetComputeShader <DeformableOccluder>("figure/occlusion/shader/Occluder"); unmorphedWithoutChildrenOcclusionInfosView = BufferUtilities.ToStructuredBufferView(device, OcclusionInfo.PackArray(unmorphedOcclusionInfos)); unmorphedWithChildrenOcclusionInfosBufferManager = new StructuredBufferManager <uint>(device, unmorphedOcclusionInfos.Length); parametersResources = OccluderParametersResources.Make(device, parameters); channelIndices = parameters.ChannelNames .Select(channelName => channelSystem.ChannelsByName[channelName].Index) .ToArray(); }