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(); }); }
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)); }
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(); }
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(); }