private void swapTextures(ref bool readHelpTex, SpaceSkippingTexture3D helpTex, SpaceSkippingTexture3D pong) { var dev = Device.Get(); if (readHelpTex) { readHelpTex = false; dev.Compute.SetShaderResource(1, null); dev.Compute.SetUnorderedAccessView(0, null); dev.Compute.SetShaderResource(1, pong.GetSrView(0)); dev.Compute.SetUnorderedAccessView(0, helpTex.GetUaView(0)); } else { readHelpTex = true; dev.Compute.SetShaderResource(1, null); dev.Compute.SetUnorderedAccessView(0, null); dev.Compute.SetShaderResource(1, helpTex.GetSrView(0)); dev.Compute.SetUnorderedAccessView(0, pong.GetUaView(0)); } }
public override void UpdateImage(int id, ITexture texture) { base.UpdateImage(id, texture); helpTextures[id]?.Dispose(); if (texture is null) { return; } SpaceSkippingTexture3D tex = new SpaceSkippingTexture3D(texture.Size, texture.NumMipmaps); helpTextures[id] = tex; emptySpaceSkippingShader.Execute(texture.GetSrView(LayerMipmapSlice.Mip0), helpTextures[id], texture.Size); }
public void Execute(ShaderResourceView orgTex, SpaceSkippingTexture3D helpTex, Size3 size) { var dev = Device.Get(); dev.Compute.Set(compute.Compute); dev.Compute.SetShaderResource(0, orgTex); UploadBuffer directionBuffer = new UploadBuffer(Int3.SizeInBytes); SpaceSkippingTexture3D pong = new SpaceSkippingTexture3D(helpTex.Size, helpTex.NumMipmaps); bool readHelpTex = true; dev.Compute.SetShaderResource(1, helpTex.GetSrView(0)); dev.Compute.SetUnorderedAccessView(0, pong.GetUaView(0)); for (int i = 0; i < 255; i++) { swapTextures(ref readHelpTex, helpTex, pong); //x-direction directionBuffer.SetData(new DirBufferData { dir = new Int3(1, 0, 0) }); dev.Compute.SetConstantBuffer(0, directionBuffer.Handle); dev.Dispatch(Utility.DivideRoundUp(size.X, workgroupSize.X), Utility.DivideRoundUp(size.Y, workgroupSize.Y), Utility.DivideRoundUp(size.Z, workgroupSize.Z)); swapTextures(ref readHelpTex, helpTex, pong); //y-direction directionBuffer.SetData(new DirBufferData { dir = new Int3(0, 1, 0) }); dev.Compute.SetConstantBuffer(0, directionBuffer.Handle); dev.Dispatch(Utility.DivideRoundUp(size.X, workgroupSize.X), Utility.DivideRoundUp(size.Y, workgroupSize.Y), Utility.DivideRoundUp(size.Z, workgroupSize.Z)); swapTextures(ref readHelpTex, helpTex, pong); //z-direction directionBuffer.SetData(new DirBufferData { dir = new Int3(0, 0, 1) }); dev.Compute.SetConstantBuffer(0, directionBuffer.Handle); dev.Dispatch(Utility.DivideRoundUp(size.X, workgroupSize.X), Utility.DivideRoundUp(size.Y, workgroupSize.Y), Utility.DivideRoundUp(size.Z, workgroupSize.Z)); } //DebugTex(helpTex); // unbind dev.Compute.SetShaderResource(0, null); dev.Compute.SetShaderResource(1, null); dev.Compute.SetUnorderedAccessView(0, null); dev.Compute.Set(null); pong?.Dispose(); }