コード例 #1
0
    public FigureGroup(Device device, FigureFacade parentFigure, FigureFacade[] childFigures)
    {
        this.parentFigure = parentFigure;
        this.childFigures = childFigures;

        this.modelToWorldTransform = new CoordinateNormalMatrixPairConstantBufferManager(device);
        this.parentDeltas          = new InOutStructuredBufferManager <Vector3>(device, parentFigure.VertexCount);

        parentFigure.RegisterChildren(childFigures.ToList());
    }
コード例 #2
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);
    }
コード例 #3
0
    public Scatterer(Device device, ShaderCache shaderCache, SubdivisionMesh mesh, PackedLists <Vector3WeightedIndex> formFactors)
    {
        vertexCount        = mesh.Stencils.Count;
        stencilSegments    = BufferUtilities.ToStructuredBufferView(device, mesh.Stencils.Segments);
        stencilElems       = BufferUtilities.ToStructuredBufferView(device, mesh.Stencils.Elems);
        formFactorSegments = BufferUtilities.ToStructuredBufferView(device, formFactors.Segments);
        formFactorElements = BufferUtilities.ToStructuredBufferView(device, formFactors.Elems);

        samplingShader   = shaderCache.GetComputeShader <Scatterer>("figure/scattering/SampleVertexIrradiances");
        scatteringShader = shaderCache.GetComputeShader <Scatterer>("figure/scattering/ScatterIrradiances");

        sampledIrrandiancesBufferManager   = new InOutStructuredBufferManager <Vector3>(device, vertexCount);
        scatteredIrrandiancesBufferManager = new InOutStructuredBufferManager <Vector3>(device, vertexCount);
    }
コード例 #4
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);
    }
コード例 #5
0
    public ControlVertexProvider(Device device, ShaderCache shaderCache,
                                 OccluderLoader occluderLoader,
                                 FigureDefinition definition,
                                 ShaperParameters shaperParameters)
    {
        this.occluderLoader = occluderLoader;
        this.definition     = definition;
        this.shaper         = new GpuShaper(device, shaderCache, definition, shaperParameters);
        this.vertexCount    = shaperParameters.InitialPositions.Length;

        controlVertexInfosBufferManager = new InOutStructuredBufferManager <ControlVertexInfo>(device, vertexCount);
        if (definition.ChannelSystem.Parent == null)
        {
            this.controlVertexInfoStagingBufferManager = new StagingStructuredBufferManager <ControlVertexInfo>(device, vertexCount, BackingArrayCount);
        }
    }
    private void ProcessTexturedSurface(int surfaceIdx, string uvSetName, FileInfo file, bool isLinear)
    {
        bool isOrderedTransparent = surfaceProperties.RenderOrder.Contains(surfaceIdx);
        bool isMaxing             = isOrderedTransparent;

        var context = device.ImmediateContext;

        var opacityTexture     = LoadOpacityTexture(file, isLinear);
        var opacityTextureView = new ShaderResourceView(device, opacityTexture);

        // Not sure by, possibly a nvidia bug, but the vertex buffer padding by an extra element is necessary.
        // Otherwise (0,0) gets passed to the vertex shader instead of the last vertex.
        var uvSet    = figure.UvSets[uvSetName];
        var vertices = uvSet.Uvs;
        var vertexBufferSizeInBytes = Vector2.SizeInBytes * (vertices.Length + 1);
        var vertexBuffer            = Buffer.Create(device, BindFlags.VertexBuffer, vertices, vertexBufferSizeInBytes);

        List <int> faceIdxMap      = new List <int>();
        List <int> triangleIndices = new List <int>();

        for (int faceIdx = 0; faceIdx < faceCount; ++faceIdx)
        {
            if (figure.Geometry.SurfaceMap[faceIdx] != surfaceIdx)
            {
                continue;
            }

            faceIdxMap.Add(faceIdx);

            Quad face = figure.DefaultUvSet.Faces[faceIdx];
            triangleIndices.Add(face.Index0);
            triangleIndices.Add(face.Index1);
            triangleIndices.Add(face.Index2);

            if (!face.IsDegeneratedIntoTriangle)
            {
                triangleIndices.Add(face.Index2);
                triangleIndices.Add(face.Index3);
                triangleIndices.Add(face.Index0);
            }
        }

        var indexBuffer = Buffer.Create(device, BindFlags.IndexBuffer, triangleIndices.ToArray());

        var transparencyCounterBufferManager = new InOutStructuredBufferManager <TransparencyCounters>(device, faceIdxMap.Count);

        context.ClearState();

        states.Apply(context);

        context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
        context.InputAssembler.InputLayout       = inputLayout;
        context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertexBuffer, Vector2.SizeInBytes, 0));
        context.InputAssembler.SetIndexBuffer(indexBuffer, Format.R32_UInt, 0);

        context.VertexShader.Set(vertexShader);

        context.Rasterizer.SetViewport(0, 0, opacityTexture.Description.Width, opacityTexture.Description.Height);

        context.PixelShader.Set(isMaxing ? maxingPixelShader : addingPixelShader);
        context.PixelShader.SetShaderResources(0, opacityTextureView);

        context.OutputMerger.SetUnorderedAccessView(0, transparencyCounterBufferManager.OutView);

        context.DrawIndexed(triangleIndices.Count, 0, 0);

        context.ClearState();

        var transparencyCounterStagingBufferManager = new StagingStructuredBufferManager <TransparencyCounters>(device, faceIdxMap.Count);

        transparencyCounterStagingBufferManager.CopyToStagingBuffer(context, transparencyCounterBufferManager.Buffer);
        var array = transparencyCounterStagingBufferManager.FillArrayFromStagingBuffer(context);

        for (int faceIdx = 0; faceIdx < faceIdxMap.Count; ++faceIdx)
        {
            TransparencyCounters transparencyCounter = array[faceIdx];

            if (transparencyCounter.pixelCount > (1 << 24))
            {
                throw new Exception("pixel count overflow");
            }

            float transparency;
            if (isMaxing)
            {
                transparency = (float)transparencyCounter.transparencyCount / 0xff;
            }
            else
            {
                transparency = transparencyCounter.transparencyCount == 0 ? 0 : (float)transparencyCounter.transparencyCount / transparencyCounter.pixelCount / 0xff;
            }
            faceTransparencies[faceIdxMap[faceIdx]] = transparency;
        }

        opacityTextureView.Dispose();
        opacityTexture.Dispose();
        indexBuffer.Dispose();
        vertexBuffer.Dispose();
        transparencyCounterBufferManager.Dispose();
        transparencyCounterStagingBufferManager.Dispose();
    }