コード例 #1
0
    public GpuShaper(Device device, ShaderCache shaderCache, FigureDefinition definition, ShaperParameters parameters)
    {
        this.device              = device;
        this.withDeltasShader    = shaderCache.GetComputeShader <GpuShaper>("figure/shaping/shader/Shaper-WithDeltas");
        this.withoutDeltasShader = shaderCache.GetComputeShader <GpuShaper>("figure/shaping/shader/Shaper-WithoutDeltas");

        this.vertexCount         = parameters.InitialPositions.Length;
        this.morphChannelIndices = parameters.MorphChannelIndices;
        this.boneIndices         = parameters.BoneIndices;
        this.occlusionSurrogates = OcclusionSurrogate.MakeAll(definition, parameters.OcclusionSurrogateParameters);

        this.initialPositionsView      = BufferUtilities.ToStructuredBufferView(device, parameters.InitialPositions);
        this.deltaSegmentsView         = BufferUtilities.ToStructuredBufferView(device, parameters.MorphDeltas.Segments);
        this.deltaElemsView            = BufferUtilities.ToStructuredBufferView(device, parameters.MorphDeltas.Elems);
        this.morphWeightsBufferManager = new StructuredBufferManager <float>(device, parameters.MorphCount);

        if (parameters.BaseDeltaWeights != null)
        {
            this.baseDeltaWeightSegmentsView = BufferUtilities.ToStructuredBufferView(device, parameters.BaseDeltaWeights.Segments);
            this.baseDeltaWeightElemsView    = BufferUtilities.ToStructuredBufferView(device, parameters.BaseDeltaWeights.Elems);
        }
        else
        {
            this.baseDeltaWeightSegmentsView = null;
            this.baseDeltaWeightElemsView    = null;
        }

        this.boneWeightSegmentsView      = BufferUtilities.ToStructuredBufferView(device, parameters.BoneWeights.Segments);
        this.boneWeightElemsView         = BufferUtilities.ToStructuredBufferView(device, parameters.BoneWeights.Elems);
        this.boneTransformsBufferManager = new StructuredBufferManager <StagedSkinningTransform>(device, parameters.BoneCount);

        this.occlusionSurrogateMapView            = BufferUtilities.ToStructuredBufferView(device, parameters.OcclusionSurrogateMap);
        this.occlusionSurrogateFacesView          = BufferUtilities.ToStructuredBufferView(device, OcclusionSurrogateCommon.Mesh.Faces.ToArray());
        this.occlusionSurrogateInfosBufferManager = new StructuredBufferManager <OcclusionSurrogate.Info>(device, parameters.OcclusionSurrogateParameters.Length);
    }
コード例 #2
0
    public StaticOccluder(Device device, OcclusionInfo[] figureOcclusionInfos, OcclusionInfo[] parentOcclusionInfos)
    {
        this.device = device;

        this.parentOcclusionInfos = parentOcclusionInfos;

        occlusionInfosBufferManager = new StructuredBufferManager <uint>(device, figureOcclusionInfos.Length);
        occlusionInfosToUpload      = OcclusionInfo.PackArray(figureOcclusionInfos);
    }
コード例 #3
0
    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);
    }
コード例 #4
0
    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();
    }
コード例 #5
0
    public FigureOcclusionCalculator(ContentFileLocator fileLocator, Device device, ShaderCache shaderCache, FigureGroup figureGroup, FaceTransparenciesGroup faceTransparenciesGroup)
    {
        this.device = device;

        this.figureGroup = figureGroup;

        var geometryConcatenator = new OcclusionGeometryConcatenator();

        //parent
        {
            var figure             = figureGroup.Parent;
            var faceTransparencies = faceTransparenciesGroup.Parent;

            var refinementResult = figure.Geometry.AsTopology().Refine(0);

            var segment = geometryConcatenator.Add(refinementResult.Mesh, faceTransparencies);
            parentSegment = segment;

            var surrogates = figure.OcclusionBinding.Surrogates;
            surrogateSegments = surrogates.Select(geometryConcatenator.Add).ToList();
        }

        //children
        for (int childIdx = 0; childIdx < figureGroup.Children.Length; ++childIdx)
        {
            var figure             = figureGroup.Children[childIdx];
            var faceTransparencies = faceTransparenciesGroup.Children[childIdx];

            var refinementResult = figure.Geometry.AsTopology().Refine(0);

            var segment = geometryConcatenator.Add(refinementResult.Mesh, faceTransparencies);
            childSegments.Add(segment);

            var surrogates = figure.OcclusionBinding.Surrogates;
            if (surrogates.Count != 0)
            {
                // There's no technical reason this couldn't be implemented; I just haven't needed it yet.
                throw new NotImplementedException("occlusion surrogates aren't supported on child figures");
            }
        }

        groupControlPositionsBufferManager = new StructuredBufferManager <Vector3>(device, geometryConcatenator.Mesh.ControlVertexCount);
        vertexRefiner = new BasicVertexRefiner(device, shaderCache, geometryConcatenator.Mesh.Stencils);
        refinedVertexInfosBufferManager = new InOutStructuredBufferManager <BasicRefinedVertexInfo>(device, vertexRefiner.RefinedVertexCount);
        occlusionCalculator             = new GpuOcclusionCalculator(device, shaderCache,
                                                                     geometryConcatenator.Mesh.Topology,
                                                                     geometryConcatenator.FaceTransparencies,
                                                                     geometryConcatenator.FaceMasks,
                                                                     geometryConcatenator.VertexMasks);
    }