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