public void SSIMMultiscaleLuminance()
        {
            var s       = new MultiscaleSSIMShader();
            var toRed   = new ImageFramework.Model.Shader.TransformShader("return value.r;", "float4", "float");
            var fromRed = new ImageFramework.Model.Shader.TransformShader("return float4(value, value, value, 1.0);", "float", "float4");
            var tex     = IO.LoadImageTexture(TestData.Directory + "checkers.dds");
            var redTex  = new TextureArray2D(tex.LayerMipmap, tex.Size, Format.R32_Float, true);
            var dstTex  = new TextureArray2D(tex.LayerMipmap, tex.Size, Format.R32G32B32A32_Float, true);
            var upload  = new UploadBuffer(256);

            Assert.AreEqual(tex.NumMipmaps, 3);
            var expected = tex.GetPixelColors(LayerMipmapSlice.Mip2)[0];

            // copy checkers red channel only
            foreach (var lm in tex.LayerMipmap.Range)
            {
                toRed.Run(tex, redTex, lm, upload);
            }

            // this should copy lowest resolution mipmap to first mipmap
            s.RunCopy(redTex, LayerMipmapSlice.Mip0, upload);

            // copy back
            foreach (var lm in tex.LayerMipmap.Range)
            {
                fromRed.Run(redTex, dstTex, lm, upload);
            }

            var actual = dstTex.GetPixelColors(LayerMipmapSlice.Mip0);

            foreach (var color in actual)
            {
                Assert.IsTrue(color.Equals(expected, Color.Channel.R, 0.0011f));
            }
        }
Exemple #2
0
        public void Execute(ITexture orgTex, ITexture helpTex, LayerMipmapSlice lm, UploadBuffer uploadBuffer)
        {
            var size = orgTex.Size.GetMip(lm.Mipmap);
            var dev  = Device.Get();


            initTexShader.Run(orgTex, helpTex, lm, uploadBuffer);

            Texture3D pong = new Texture3D(helpTex.NumMipmaps, helpTex.Size, Format.R8_UInt, true, false);

            bool readHelpTex = false;

            dev.Compute.Set(compute.Compute);

            ImageFramework.DirectX.Query.SyncQuery syncQuery = new ImageFramework.DirectX.Query.SyncQuery();

            for (int i = 0; i < 127; i++)
            {
                swapTextures(ref readHelpTex, helpTex, pong, lm);

                //x-direction
                uploadBuffer.SetData(new DirBufferData
                {
                    dir = new Int3(1, 0, 0),
                    dim = size
                });
                dev.Compute.SetConstantBuffer(0, uploadBuffer.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, lm);

                //y-direction
                uploadBuffer.SetData(new DirBufferData
                {
                    dir = new Int3(0, 1, 0),
                    dim = size
                });
                dev.Compute.SetConstantBuffer(0, uploadBuffer.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, lm);

                //z-direction
                uploadBuffer.SetData(new DirBufferData
                {
                    dir = new Int3(0, 0, 1),
                    dim = size
                });
                dev.Compute.SetConstantBuffer(0, uploadBuffer.Handle);
                dev.Dispatch(Utility.DivideRoundUp(size.X, workgroupSize.X), Utility.DivideRoundUp(size.Y, workgroupSize.Y), Utility.DivideRoundUp(size.Z, workgroupSize.Z));

#if DEBUG
                if (i % 8 == 0)
                {
                    syncQuery.Set();
                    syncQuery.WaitForGpu();
                    Console.WriteLine("Iteration: " + i);
                }
#endif
            }

            // unbind
            dev.Compute.SetShaderResource(0, null);
            dev.Compute.SetUnorderedAccessView(0, null);
            dev.Compute.Set(null);


            endShader.Run(pong, helpTex, lm, uploadBuffer);
            pong?.Dispose();
        }