public RendererManaged.Texture2D CreateTextureCube(RendererManaged.Device _Device) { if (m_Opts.m_type != ImageOptions.TYPE.TT_CUBIC) { throw new Exception("The image is not a cube map texture!"); } RendererManaged.PIXEL_FORMAT TextureFormat = m_Opts.m_format.EquivalentRendererFormat; uint ArraySize = 6 * m_Opts.m_arraySize; uint MipsCount = m_Opts.m_curNumLevels; uint PixelSize = m_Opts.m_format.BitsCount >> 3; List <RendererManaged.PixelsBuffer> Content = new List <RendererManaged.PixelsBuffer>(); for (uint SliceIndex = 0; SliceIndex < ArraySize; SliceIndex++) { for (uint MipLevelIndex = 0; MipLevelIndex < MipsCount; MipLevelIndex++) { ImageSlice Slice = m_Slices[MipLevelIndex * ArraySize + SliceIndex]; // Stupidly stored in reverse order! RendererManaged.PixelsBuffer Pixels = new RendererManaged.PixelsBuffer((int)(Slice.m_Width * Slice.m_Height * PixelSize)); Content.Add(Pixels); using (BinaryWriter Writer = Pixels.OpenStreamWrite()) Writer.Write(Slice.m_Content); } } RendererManaged.Texture2D Result = new RendererManaged.Texture2D(_Device, (int)m_Opts.m_curWidth, (int)m_Opts.m_curHeight, -6 * (int)m_Opts.m_arraySize, (int)m_Opts.m_curNumLevels, TextureFormat, false, false, Content.ToArray()); return(Result); }
private void ApplyBilateralFiltering(RendererManaged.Texture2D _Source, RendererManaged.Texture2D _Target, float _BilateralRadius, float _BilateralTolerance, bool _Wrap, int _ProgressBarMax) { _Source.SetCS(0); _Target.SetCSUAV(0); // m_CB_Filter.m.Radius = _BilateralRadius; // m_CB_Filter.m.Tolerance = _BilateralTolerance; m_CB_Filter.m.Sigma_Radius = (float)(-0.5 * Math.Pow(_BilateralRadius / 3.0f, -2.0)); m_CB_Filter.m.Sigma_Tolerance = _BilateralTolerance > 0.0f ? (float)(-0.5 * Math.Pow(_BilateralTolerance, -2.0)) : -1e6f; m_CB_Filter.m.Tile = (uint)(_Wrap ? 1 : 0); m_CS_BilateralFilter.Use(); int h = Math.Max(1, MAX_LINES * 1024 / W); int CallsCount = (int)Math.Ceiling((float)H / h); for (int i = 0; i < CallsCount; i++) { m_CB_Filter.m.Y0 = (UInt32)(i * h); m_CB_Filter.UpdateData(); m_CS_BilateralFilter.Dispatch(W, h, 1); m_Device.Present(true); progressBar.Value = (int)(0.01f * (0 + _ProgressBarMax * (i + 1) / CallsCount) * progressBar.Maximum); // for ( int a=0; a < 10; a++ ) Application.DoEvents(); } // Single gulp (crashes the driver on large images!) // m_CS_BilateralFilter.Dispatch( W, H, 1 ); _Target.RemoveFromLastAssignedSlotUAV(); // So we can use it as input for next stage }
private void LoadNormalMap(System.IO.FileInfo _FileName) { try { // Dispose of existing resources if (m_BitmapSourceNormal != null) { m_BitmapSourceNormal.Dispose(); } m_BitmapSourceNormal = null; if (m_TextureSourceNormal != null) { m_TextureSourceNormal.Dispose(); } m_TextureSourceNormal = null; // Load the source image assuming it's in linear space (all normal maps should be in linear space, with the default value being (0.5, 0.5, 1)) m_BitmapSourceNormal = new ImageUtility.Bitmap(_FileName, m_ProfileLinear); // outputPanelInputHeightMap.Image = m_BitmapSourceNormal; int W = m_BitmapSourceNormal.Width; int H = m_BitmapSourceNormal.Height; // Build the source texture ImageUtility.float4[,] ContentRGB = m_BitmapSourceNormal.ConvertedContentRGB; RendererManaged.PixelsBuffer SourceNormalMap = new RendererManaged.PixelsBuffer(W * H * 4 * 4); using (System.IO.BinaryWriter Wr = SourceNormalMap.OpenStreamWrite()) for (int Y = 0; Y < H; Y++) { for (int X = 0; X < W; X++) { float Nx = 2.0f * ContentRGB[X, Y].x - 1.0f; float Ny = 1.0f - 2.0f * ContentRGB[X, Y].y; float Nz = 2.0f * ContentRGB[X, Y].z - 1.0f; Wr.Write(Nx); Wr.Write(Ny); Wr.Write(Nz); Wr.Write(1.0f); } } m_TextureSourceNormal = new RendererManaged.Texture2D(m_Device, W, H, 1, 1, RendererManaged.PIXEL_FORMAT.RGBA32_FLOAT, false, false, new RendererManaged.PixelsBuffer[] { SourceNormalMap }); } catch (Exception _e) { MessageBox("An error occurred while opening the image:\n\n", _e); } }
private void buttonClearNormalMap_Click(object sender, EventArgs e) { if (m_TextureSourceNormal != null) { m_TextureSourceNormal.Dispose(); } // Create the default, planar normal map RendererManaged.PixelsBuffer SourceNormalMap = new RendererManaged.PixelsBuffer(4 * 4); using (System.IO.BinaryWriter Wr = SourceNormalMap.OpenStreamWrite()) { Wr.Write(0.0f); Wr.Write(0.0f); Wr.Write(1.0f); Wr.Write(1.0f); } m_TextureSourceNormal = new RendererManaged.Texture2D(m_Device, 1, 1, 1, 1, RendererManaged.PIXEL_FORMAT.RGBA32_FLOAT, false, false, new RendererManaged.PixelsBuffer[] { SourceNormalMap }); }
/// <summary> /// Creates a 2D texture from the image /// </summary> /// <returns></returns> public RendererManaged.Texture2D CreateTexture2D( RendererManaged.Device _Device ) { if ( m_Opts.m_type != ImageOptions.TYPE.TT_2D ) throw new Exception( "The image is not a 2D texture!" ); RendererManaged.PIXEL_FORMAT TextureFormat = m_Opts.m_format.EquivalentRendererFormat; uint ArraySize = m_Opts.m_arraySize; uint MipsCount = m_Opts.m_curNumLevels; uint PixelSize = m_Opts.m_format.BitsCount >> 3; List<RendererManaged.PixelsBuffer> Content = new List<RendererManaged.PixelsBuffer>(); for ( uint SliceIndex=0; SliceIndex < ArraySize; SliceIndex++ ) { for ( uint MipLevelIndex=0; MipLevelIndex < MipsCount; MipLevelIndex++ ) { ImageSlice Slice = m_Slices[MipLevelIndex*ArraySize+SliceIndex]; // Stupidly stored in reverse order! RendererManaged.PixelsBuffer Pixels = new RendererManaged.PixelsBuffer( (int) (Slice.m_Width * Slice.m_Height * PixelSize) ); Content.Add( Pixels ); using ( BinaryWriter Writer = Pixels.OpenStreamWrite() ) Writer.Write( Slice.m_Content ); } } RendererManaged.Texture2D Result = new RendererManaged.Texture2D( _Device, (int) m_Opts.m_curWidth, (int) m_Opts.m_curHeight, (int) m_Opts.m_arraySize, (int) m_Opts.m_curNumLevels, TextureFormat, false, false, Content.ToArray() ); return Result; }
private void LoadHeightMap(System.IO.FileInfo _FileName) { try { panelParameters.Enabled = false; // Dispose of existing resources if (m_BitmapSource != null) { m_BitmapSource.Dispose(); } m_BitmapSource = null; if (m_TextureTarget_CPU != null) { m_TextureTarget_CPU.Dispose(); } m_TextureTarget_CPU = null; if (m_TextureTarget0 != null) { m_TextureTarget0.Dispose(); } m_TextureTarget0 = null; if (m_TextureTarget1 != null) { m_TextureTarget1.Dispose(); } m_TextureTarget1 = null; if (m_TextureSource != null) { m_TextureSource.Dispose(); } m_TextureSource = null; // Load the source image assuming it's in linear space m_SourceFileName = _FileName; m_BitmapSource = new ImageUtility.Bitmap(_FileName, m_ProfileLinear); outputPanelInputHeightMap.Image = m_BitmapSource; W = m_BitmapSource.Width; H = m_BitmapSource.Height; // Build the source texture RendererManaged.PixelsBuffer SourceHeightMap = new RendererManaged.PixelsBuffer(W * H * 4); using (System.IO.BinaryWriter Wr = SourceHeightMap.OpenStreamWrite()) for (int Y = 0; Y < H; Y++) { for (int X = 0; X < W; X++) { Wr.Write(m_BitmapSource.ContentXYZ[X, Y].y); } } m_TextureSource = new RendererManaged.Texture2D(m_Device, W, H, 1, 1, RendererManaged.PIXEL_FORMAT.R32_FLOAT, false, false, new RendererManaged.PixelsBuffer[] { SourceHeightMap }); // Build the target UAV & staging texture for readback m_TextureTarget0 = new RendererManaged.Texture2D(m_Device, W, H, 1, 1, RendererManaged.PIXEL_FORMAT.R32_FLOAT, false, true, null); m_TextureTarget1 = new RendererManaged.Texture2D(m_Device, W, H, 1, 1, RendererManaged.PIXEL_FORMAT.R32_FLOAT, false, true, null); m_TextureTarget_CPU = new RendererManaged.Texture2D(m_Device, W, H, 1, 1, RendererManaged.PIXEL_FORMAT.R32_FLOAT, true, false, null); panelParameters.Enabled = true; buttonGenerate.Focus(); } catch (Exception _e) { MessageBox("An error occurred while opening the image:\n\n", _e); } }