Beispiel #1
0
        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));
            }
        }
Beispiel #2
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);
        }
Beispiel #3
0
        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();
        }