/// <summary> /// Handles the Click event of the ButtonImagePath control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> private void ButtonImagePath_Click(object sender, EventArgs e) { Cursor.Current = Cursors.WaitCursor; IGorgonImage image = null; var png = new GorgonCodecPng(); try { if (DialogOpenPng.ShowDialog(this) != DialogResult.OK) { return; } TextImagePath.Text = DialogOpenPng.FileName; _sourceTexture?.Texture?.Dispose(); _outputTexture?.Dispose(); _sourceTexture = null; _outputTexture = null; image = png.LoadFromFile(DialogOpenPng.FileName); _sourceTexture = image.ConvertToFormat(BufferFormat.R8G8B8A8_UNorm) .ToTexture2D(_graphics, new GorgonTexture2DLoadOptions { Name = Path.GetFileNameWithoutExtension(DialogOpenPng.FileName) }).GetShaderResourceView(); _outputTexture = new GorgonTexture2D(_graphics, new GorgonTexture2DInfo(_sourceTexture, "Output") { Format = BufferFormat.R8G8B8A8_Typeless, Binding = TextureBinding.ShaderResource | TextureBinding.ReadWriteView }); // Get an SRV for the output texture so we can render it later. _outputView = _outputTexture.GetShaderResourceView(BufferFormat.R8G8B8A8_UNorm); // Get a UAV for the output. _outputUav = _outputTexture.GetReadWriteView(BufferFormat.R32_UInt); // Process the newly loaded texture. _sobel.Process(_sourceTexture, _outputUav, TrackThickness.Value, TrackThreshold.Value / 100.0f); TrackThreshold.Enabled = TrackThickness.Enabled = true; } catch (Exception ex) { GorgonDialogs.ErrorBox(this, ex); TrackThreshold.Enabled = TrackThickness.Enabled = false; } finally { image?.Dispose(); Cursor.Current = Cursors.Default; } }
/// <summary> /// Function to process a texture into the output texture. /// </summary> /// <param name="texture">The texture to process.</param> /// <param name="outputTexture">The output texture that will receive the processed texture.</param> /// <param name="thickness">The thickness of the sobel lines.</param> /// <param name="threshold">The threshold used to determine an edge.</param> public void Process(GorgonTexture2DView texture, GorgonTexture2DReadWriteView outputTexture, int thickness, float threshold) { if ((texture == null) || (outputTexture == null)) { return; } if ((_dispatch == null) || (_dispatch.ShaderResources[0] != texture) || (_dispatch.ReadWriteViews[0].ReadWriteView != outputTexture)) { _dispatch = _dispatchBuilder.ReadWriteView(new GorgonReadWriteViewBinding(outputTexture)) .ShaderResource(texture) .Build(); } _sobelOptions[0] = thickness; _sobelOptions[1] = threshold; _sobelData.SetData(_sobelOptions); // Send 32 threads per group. _compute.Execute(_dispatch, (int)(texture.Width / 32.0f).FastCeiling(), (int)(texture.Height / 32.0f).FastCeiling(), 1); }