Пример #1
0
    public void Scatter(DeviceContext context, ImageBasedLightingEnvironment lightingEnvironment, ShaderResourceView controlVertexInfosView)
    {
        context.WithEvent("Scatterer::Scatter", () => {
            context.ClearState();

            context.ComputeShader.Set(samplingShader);
            lightingEnvironment.Apply(context.ComputeShader);
            context.ComputeShader.SetShaderResources(ShaderSlots.MaterialTextureStart,
                                                     stencilSegments,
                                                     stencilElems,
                                                     controlVertexInfosView);
            context.ComputeShader.SetUnorderedAccessView(0, sampledIrrandiancesBufferManager.OutView);
            context.Dispatch(IntegerUtils.RoundUp(vertexCount, ShaderNumThreads), 1, 1);

            context.ClearState();

            context.ComputeShader.Set(scatteringShader);
            context.ComputeShader.SetShaderResources(0,
                                                     sampledIrrandiancesBufferManager.InView,
                                                     formFactorSegments,
                                                     formFactorElements);
            context.ComputeShader.SetUnorderedAccessView(0, scatteredIrrandiancesBufferManager.OutView);
            context.Dispatch(IntegerUtils.RoundUp(vertexCount, ShaderNumThreads), 1, 1);

            context.ClearState();
        });
    }
Пример #2
0
    public void CalculateOcclusion(DeviceContext context)
    {
        if (unmorphedWithChildrenOcclusionInfosToUpload != null)
        {
            unmorphedWithChildrenOcclusionInfosBufferManager.Update(context, unmorphedWithChildrenOcclusionInfosToUpload);
            unmorphedWithChildrenOcclusionInfosToUpload = null;
        }

        if (parametersResources == null)
        {
            return;
        }

        context.WithEvent("Occluder::CalculateOcclusion", () => {
            context.ClearState();

            context.ComputeShader.Set(shader);
            context.ComputeShader.SetShaderResources(0,
                                                     unmorphedWithoutChildrenOcclusionInfosView,
                                                     unmorphedWithChildrenOcclusionInfosBufferManager.View,
                                                     parametersResources.baseOcclusionView,
                                                     parametersResources.channelWeightsBufferManager.View,
                                                     parametersResources.occlusionDeltaWeightSegmentsView,
                                                     parametersResources.occlusionDeltaWeightElemsView);
            context.ComputeShader.SetUnorderedAccessView(0, parametersResources.calculatedInfosBuffersBufferManager.OutView);

            context.Dispatch(IntegerUtils.RoundUp(parametersResources.vertexCount, ShaderNumThreads), 1, 1);

            context.ClearState();
        });
    }
    public OcclusionInfo[] Run(DeviceContext context, ShaderResourceView vertexInfos)
    {
        context.ClearState();
        context.ComputeShader.Set(shader);
        context.ComputeShader.SetConstantBuffer(0, hemispherePointsAndWeightsConstantBuffer);
        context.ComputeShader.SetShaderResources(0,
                                                 rasterCacheView,
                                                 facesView,
                                                 transparenciesView,
                                                 vertexMasksView,
                                                 faceMasksView,
                                                 vertexInfos);
        context.ComputeShader.SetUnorderedAccessView(0, outputBufferManager.View);

        for (int baseVertexIdx = 0; baseVertexIdx < vertexCount; baseVertexIdx += BatchSize)
        {
            ArraySegment segment = new ArraySegment(baseVertexIdx, Math.Max(vertexCount - baseVertexIdx, BatchSize));
            segmentBufferManager.Update(context, segment);
            context.ComputeShader.SetConstantBuffer(1, segmentBufferManager.Buffer);
            context.Dispatch(1, IntegerUtils.RoundUp(BatchSize, ShaderNumThreads / RasterRowCount), 1);
            context.Flush();
        }

        return(outputBufferManager.ReadContents(context));
    }
Пример #4
0
 public void Refine(DeviceContext context, ShaderResourceView vertexPositionsView, UnorderedAccessView resultsView)
 {
     context.ClearState();
     context.ComputeShader.Set(refinerShader);
     context.ComputeShader.SetShaderResources(0, stencilSegmentsView, stencilElemsView, vertexPositionsView);
     context.ComputeShader.SetUnorderedAccessView(0, resultsView);
     context.Dispatch(IntegerUtils.RoundUp(refinedVertexCount, ShaderNumThreads), 1, 1);
     context.ClearState();
 }
Пример #5
0
    private void CalculatePositionsCommon(
        DeviceContext context,
        UnorderedAccessView vertexInfosOutView,
        ShaderResourceView occlusionInfosView,
        ShaderResourceView parentDeltasInView,
        UnorderedAccessView deltasOutView)
    {
        context.WithEvent("GpuShaper::CalculatePositions", () => {
            context.ClearState();

            if (deltasOutView != null)
            {
                context.ComputeShader.Set(withDeltasShader);
            }
            else
            {
                context.ComputeShader.Set(withoutDeltasShader);
            }

            context.ComputeShader.SetShaderResources(0,
                                                     initialPositionsView,
                                                     deltaSegmentsView,
                                                     deltaElemsView,
                                                     morphWeightsBufferManager.View,
                                                     baseDeltaWeightSegmentsView,
                                                     baseDeltaWeightElemsView,
                                                     boneWeightSegmentsView,
                                                     boneWeightElemsView,
                                                     boneTransformsBufferManager.View,
                                                     occlusionInfosView,
                                                     occlusionSurrogateMapView,
                                                     occlusionSurrogateFacesView,
                                                     occlusionSurrogateInfosBufferManager.View,
                                                     parentDeltasInView);

            context.ComputeShader.SetUnorderedAccessViews(0,
                                                          vertexInfosOutView,
                                                          deltasOutView);

            context.Dispatch(IntegerUtils.RoundUp(vertexCount, ShaderNumThreads), 1, 1);

            context.ClearState();
        });
    }
    public void Dilate(MultiUvTextureMask mask, Size2 size, bool isLinear, DataBox imageData)
    {
        //set every alpha value to 0
        for (int i = 0; i < imageData.SlicePitch; i += 4)
        {
            var rgba = Utilities.Read <uint>(imageData.DataPointer + i);
            rgba &= 0xffffff;
            Utilities.Write <uint>(imageData.DataPointer + i, ref rgba);
        }

        var sourceTextureDesc = new Texture2DDescription {
            Width             = size.Width,
            Height            = size.Height,
            MipLevels         = 0,
            ArraySize         = 1,
            Format            = SharpDX.DXGI.Format.R8G8B8A8_UNorm,
            SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
            BindFlags         = BindFlags.ShaderResource | BindFlags.RenderTarget | BindFlags.UnorderedAccess,
            OptionFlags       = ResourceOptionFlags.GenerateMipMaps
        };
        var sourceTexture        = new Texture2D(device, sourceTextureDesc);
        var sourceTextureInView  = new ShaderResourceView(device, sourceTexture);
        var sourceTextureOutView = new UnorderedAccessView(device, sourceTexture);

        var destTextureDesc = new Texture2DDescription {
            Width             = size.Width,
            Height            = size.Height,
            MipLevels         = 1,
            ArraySize         = 1,
            Format            = SharpDX.DXGI.Format.R8G8B8A8_UNorm,
            SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
            BindFlags         = BindFlags.UnorderedAccess
        };
        var destTexture        = new Texture2D(device, destTextureDesc);
        var destTextureOutView = new UnorderedAccessView(device, destTexture);

        var stagingTextureDesc = new Texture2DDescription {
            Width             = size.Width,
            Height            = size.Height,
            MipLevels         = 1,
            ArraySize         = 1,
            Format            = SharpDX.DXGI.Format.R8G8B8A8_UNorm,
            SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
            Usage             = ResourceUsage.Staging,
            CpuAccessFlags    = CpuAccessFlags.Read
        };
        var stagingTexture = new Texture2D(device, stagingTextureDesc);

        var context = device.ImmediateContext;

        context.UpdateSubresource(imageData, sourceTexture, 0);

        foreach (var perUvMask in mask.PerUvMasks)
        {
            maskRenderer.RenderMaskToAlpha(perUvMask, size, sourceTexture);
        }

        context.ClearState();
        context.ComputeShader.Set(alphaPremultiplerShader);
        context.ComputeShader.SetUnorderedAccessView(0, sourceTextureOutView);
        context.Dispatch(
            IntegerUtils.RoundUp(size.Width, ShaderNumThreadsPerDim),
            IntegerUtils.RoundUp(size.Height, ShaderNumThreadsPerDim),
            1);
        context.ClearState();

        context.GenerateMips(sourceTextureInView);

        context.ClearState();
        context.ComputeShader.Set(dilatorShader);
        context.ComputeShader.SetShaderResources(0, sourceTextureInView);
        context.ComputeShader.SetUnorderedAccessView(0, destTextureOutView);
        context.Dispatch(
            IntegerUtils.RoundUp(size.Width, ShaderNumThreadsPerDim),
            IntegerUtils.RoundUp(size.Height, ShaderNumThreadsPerDim),
            1);
        context.ClearState();

        context.CopyResource(destTexture, stagingTexture);

        var resultImageData = context.MapSubresource(stagingTexture, 0, MapMode.Read, MapFlags.None);

        CopyDataBox(resultImageData, imageData);
        context.UnmapSubresource(stagingTexture, 0);

        stagingTexture.Dispose();

        destTexture.Dispose();
        destTextureOutView.Dispose();

        sourceTexture.Dispose();
        sourceTextureInView.Dispose();
        sourceTextureOutView.Dispose();
    }