private void BuildRandomTexture()
        {
            //
            // Create the random data.
            //
            var rand         = new Random();
            var randomValues = new Vector4[1024];

            for (int i = 0; i < 1024; ++i)
            {
                randomValues[i] = new Vector4(rand.RandF(-1.0f, 1.0f),
                                              rand.RandF(-1.0f, 1.0f),
                                              rand.RandF(-1.0f, 1.0f),
                                              rand.RandF(-1.0f, 1.0f));
            }

            //
            // Create the texture.
            //
            var texDesc = new Texture1DDescription
            {
                Width          = 1024,
                MipLevels      = 1,
                Format         = Format.R32G32B32A32_Float,
                Usage          = ResourceUsage.Immutable,
                BindFlags      = BindFlags.ShaderResource,
                CpuAccessFlags = CpuAccessFlags.None,
                OptionFlags    = ResourceOptionFlags.None,
                ArraySize      = 1
            };

            var ds        = new DataStream(randomValues, true, false);
            var randomTex = new Texture1D(_dxDevice, texDesc, ds);

            ds.Close();

            //
            // Create the resource view.
            //
            var viewDesc = new ShaderResourceViewDescription
            {
                Format          = texDesc.Format,
                Dimension       = ShaderResourceViewDimension.Texture1D,
                MipLevels       = texDesc.MipLevels,
                MostDetailedMip = 0
            };

            _randomTexRV = new ShaderResourceView(_dxDevice, randomTex, viewDesc);

            randomTex.Dispose();
        }
        /// <summary>
        /// Creates a <see cref="Texture1D"/> from an <see cref="Image{Rgba32}"/>.
        /// </summary>
        /// <param name="graphicsDevice">The <see cref="GraphicsDevice"/> the resource will use.</param>
        /// <param name="image">The image to create the <see cref="Texture1D"/> with.</param>
        /// <param name="generateMipmaps">Whether to generate mipmaps for the <see cref="Texture1D"/>.</param>
        public static Texture1D FromImage(GraphicsDevice graphicsDevice, Image <Rgba32> image, bool generateMipmaps = false)
        {
            if (graphicsDevice == null)
            {
                throw new ArgumentNullException(nameof(graphicsDevice));
            }

            if (image == null)
            {
                throw new ArgumentNullException(nameof(image));
            }

            if (!image.TryGetSinglePixelSpan(out Span <Rgba32> pixels))
            {
                throw new InvalidDataException(ImageUtils.ImageNotContiguousError);
            }

            Texture1D texture = new Texture1D(graphicsDevice, (uint)(image.Width * image.Height));

            try
            {
                texture.SetData <Rgba32>(pixels, 0, PixelFormat.Rgba);

                if (generateMipmaps)
                {
                    texture.GenerateMipmaps();
                }

                return(texture);
            }
            catch
            {
                texture.Dispose();
                throw;
            }
        }
示例#3
0
 public new void Dispose()
 {
     _perm2D.Dispose();
     _permGrad3.Dispose();
     base.Dispose();
 }
示例#4
0
        // Simple DDS loader ported from http://msdn.microsoft.com/en-us/library/windows/apps/jj651550.aspx
        static void CreateD3DResources(
            SharpDX.Direct3D11.Device d3dDevice,
            TextureDimension resDim,
            int width,
            int height,
            int depth,
            int mipCount,
            int arraySize,
            Format format,
            bool isCubeMap,
            DataBox[] initData,
            //_In_reads_(mipCount*arraySize) D3D11_SUBRESOURCE_DATA* initData,
            out SharpDX.Direct3D11.Resource texture,
            out SharpDX.Direct3D11.ShaderResourceView textureView
            //_Out_opt_ ID3D11Resource** texture,
            //_Out_opt_ ID3D11ShaderResourceView** textureView
            )
        {
            texture     = null;
            textureView = null;

            if (d3dDevice == null || initData == null)
            {
                return;
            }

            switch (resDim)
            {
            case TextureDimension.Texture1D:    // D3D11_RESOURCE_DIMENSION_TEXTURE1D:
            {
                Texture1DDescription desc = new Texture1DDescription();
                //D3D11_TEXTURE1D_DESC desc;
                desc.Width          = width;
                desc.MipLevels      = mipCount;
                desc.ArraySize      = arraySize;
                desc.Format         = format;
                desc.Usage          = ResourceUsage.Default;
                desc.BindFlags      = BindFlags.ShaderResource;   // D3D11_BIND_SHADER_RESOURCE;
                desc.CpuAccessFlags = CpuAccessFlags.None;
                desc.OptionFlags    = ResourceOptionFlags.None;

                Texture1D tex = null;
                //ID3D11Texture1D* tex = nullptr;
                tex = new Texture1D(d3dDevice, desc, initData);
                //hr = d3dDevice->CreateTexture1D(&desc, initData, &tex);

                if (tex != null)
                {
                    ShaderResourceViewDescription SRVDesc = new ShaderResourceViewDescription();
                    //D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc;
                    //memset(&SRVDesc, 0, sizeof(SRVDesc));
                    SRVDesc.Format = format;

                    if (arraySize > 1)
                    {
                        SRVDesc.Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.Texture1DArray;        // D3D_SRV_DIMENSION_TEXTURE1DARRAY;
                        SRVDesc.Texture1DArray.MipLevels = desc.MipLevels;
                        SRVDesc.Texture1DArray.ArraySize = arraySize;
                    }
                    else
                    {
                        SRVDesc.Dimension           = SharpDX.Direct3D.ShaderResourceViewDimension.Texture1D;// D3D_SRV_DIMENSION_TEXTURE1D;
                        SRVDesc.Texture1D.MipLevels = desc.MipLevels;
                    }

                    textureView = new ShaderResourceView(d3dDevice, tex, SRVDesc);
                    //hr = d3dDevice->CreateShaderResourceView(tex, &SRVDesc, textureView);

                    if (textureView == null)
                    {
                        tex.Dispose();
                        return;
                    }

                    texture = tex;
                }
            }
            break;

            case TextureDimension.TextureCube:
            case TextureDimension.Texture2D:    // D3D11_RESOURCE_DIMENSION_TEXTURE2D:
            {
                Texture2DDescription desc = new Texture2DDescription();
                desc.Width     = width;
                desc.Height    = height;
                desc.MipLevels = mipCount;
                desc.ArraySize = arraySize;
                desc.Format    = format;
                desc.SampleDescription.Count   = 1;
                desc.SampleDescription.Quality = 0;
                desc.Usage          = ResourceUsage.Default;
                desc.BindFlags      = BindFlags.ShaderResource;
                desc.CpuAccessFlags = CpuAccessFlags.None;
                desc.OptionFlags    = (isCubeMap) ? ResourceOptionFlags.TextureCube : ResourceOptionFlags.None;

                Texture2D tex = null;
                tex           = new Texture2D(d3dDevice, desc, initData);
                tex.DebugName = "Test";
                //hr = d3dDevice->CreateTexture2D(&desc, initData, &tex);

                if (tex != null)
                {
                    ShaderResourceViewDescription SRVDesc = new ShaderResourceViewDescription();
                    SRVDesc.Format = format;

                    if (isCubeMap)
                    {
                        if (arraySize > 6)
                        {
                            SRVDesc.Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.TextureCubeArray;
                            SRVDesc.TextureCubeArray.MipLevels = desc.MipLevels;

                            // Earlier we set arraySize to (NumCubes * 6)
                            SRVDesc.TextureCubeArray.CubeCount = arraySize / 6;
                        }
                        else
                        {
                            SRVDesc.Dimension             = SharpDX.Direct3D.ShaderResourceViewDimension.TextureCube;
                            SRVDesc.TextureCube.MipLevels = desc.MipLevels;
                        }
                    }
                    else if (arraySize > 1)
                    {
                        SRVDesc.Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.Texture2DArray;
                        SRVDesc.Texture2DArray.MipLevels = desc.MipLevels;
                        SRVDesc.Texture2DArray.ArraySize = arraySize;
                    }
                    else
                    {
                        SRVDesc.Dimension           = SharpDX.Direct3D.ShaderResourceViewDimension.Texture2D;
                        SRVDesc.Texture2D.MipLevels = desc.MipLevels;
                    }

                    textureView = new ShaderResourceView(d3dDevice, tex, SRVDesc);
                    //hr = d3dDevice->CreateShaderResourceView(tex, &SRVDesc, textureView);

                    texture = tex;
                }
            }
            break;

            case TextureDimension.Texture3D:
            {
                Texture3DDescription desc = new Texture3DDescription();
                desc.Width          = width;
                desc.Height         = height;
                desc.Depth          = depth;
                desc.MipLevels      = mipCount;
                desc.Format         = format;
                desc.Usage          = ResourceUsage.Default;
                desc.BindFlags      = BindFlags.ShaderResource;
                desc.CpuAccessFlags = CpuAccessFlags.None;
                desc.OptionFlags    = ResourceOptionFlags.None;

                Texture3D tex = null;
                tex = new Texture3D(d3dDevice, desc, initData);
                //hr = d3dDevice->CreateTexture3D(&desc, initData, &tex);

                if (tex != null)
                {
                    ShaderResourceViewDescription SRVDesc = new ShaderResourceViewDescription();
                    SRVDesc.Format              = format;
                    SRVDesc.Dimension           = SharpDX.Direct3D.ShaderResourceViewDimension.Texture3D;
                    SRVDesc.Texture3D.MipLevels = desc.MipLevels;

                    textureView = new ShaderResourceView(d3dDevice, tex, SRVDesc);
                    texture     = tex;
                }
            }
            break;
            }
        }
示例#5
0
        private static Result CreateD3DResources(Device d3dDevice,
                                                 ResourceDimension resourceDimension,
                                                 int width,
                                                 int height,
                                                 int depth,
                                                 int mipCount,
                                                 int arraySize,
                                                 DXGI.Format format,
                                                 ResourceUsage usage,
                                                 BindFlags bindFlags,
                                                 CpuAccessFlags cpuAccessFlags,
                                                 ResourceOptionFlags miscFlags,
                                                 bool forceSRGB,
                                                 bool isCubeMap,
                                                 DataBox[] initData,
                                                 out Resource texture,
                                                 out ShaderResourceView textureView)
        {
            texture     = null;
            textureView = null;
            if (d3dDevice == null)
            {
                return(Result.InvalidArg);
            }

            if (forceSRGB)
            {
                format = format.MakeSRgb();
            }

            ShaderResourceViewDescription SRVDesc = new ShaderResourceViewDescription {
                Format = format
            };

            switch (resourceDimension)
            {
            case ResourceDimension.Texture1D: {
                Texture1DDescription desc = new Texture1DDescription {
                    Width          = width,
                    MipLevels      = mipCount,
                    ArraySize      = arraySize,
                    Format         = format,
                    Usage          = usage,
                    BindFlags      = bindFlags,
                    CpuAccessFlags = cpuAccessFlags,
                    OptionFlags    = miscFlags & ~ResourceOptionFlags.TextureCube
                };

                Texture1D tex = new Texture1D(d3dDevice, desc, initData);

                if (tex != null)
                {
                    if (arraySize > 1)
                    {
                        SRVDesc.Dimension = ShaderResourceViewDimension.Texture1DArray;
                        SRVDesc.Texture1DArray.MipLevels = (mipCount == 0) ? -1 : desc.MipLevels;
                        SRVDesc.Texture1DArray.ArraySize = arraySize;
                    }
                    else
                    {
                        SRVDesc.Dimension           = ShaderResourceViewDimension.Texture1D;
                        SRVDesc.Texture1D.MipLevels = (mipCount == 0) ? -1 : desc.MipLevels;
                    }

                    textureView = new ShaderResourceView(d3dDevice, tex, SRVDesc);

                    if (textureView == null)
                    {
                        tex.Dispose();
                        texture = null;
                        return(Result.Fail);
                    }
                    texture = tex;
                }
                else
                {
                    return(Result.Fail);
                }
            }
            break;

            case ResourceDimension.Texture2D: {
                Texture2DDescription desc = new Texture2DDescription {
                    Width             = width,
                    Height            = height,
                    MipLevels         = mipCount,
                    ArraySize         = arraySize,
                    Format            = format,
                    SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
                    Usage             = usage,
                    BindFlags         = bindFlags,
                    CpuAccessFlags    = cpuAccessFlags,
                };
                if (isCubeMap)
                {
                    desc.OptionFlags = miscFlags | ResourceOptionFlags.TextureCube;
                }
                else
                {
                    desc.OptionFlags = miscFlags & ~ResourceOptionFlags.TextureCube;
                }

                Texture2D tex = new Texture2D(d3dDevice, desc, initData);

                if (tex != null)
                {
                    if (isCubeMap)
                    {
                        if (arraySize > 6)
                        {
                            SRVDesc.Dimension = ShaderResourceViewDimension.TextureCubeArray;
                            SRVDesc.TextureCubeArray.MipLevels = (mipCount == 0) ? -1 : desc.MipLevels;
                            // Earlier we set arraySize to (NumCubes * 6)
                            SRVDesc.TextureCubeArray.CubeCount = arraySize / 6;
                        }
                        else
                        {
                            SRVDesc.Dimension             = ShaderResourceViewDimension.TextureCube;
                            SRVDesc.TextureCube.MipLevels = (mipCount == 0) ? -1 : desc.MipLevels;
                        }
                    }
                    else if (arraySize > 1)
                    {
                        SRVDesc.Dimension = ShaderResourceViewDimension.Texture2DArray;
                        SRVDesc.Texture2DArray.MipLevels = (mipCount == 0) ? -1 : desc.MipLevels;
                        SRVDesc.Texture2DArray.ArraySize = arraySize;
                    }
                    else
                    {
                        SRVDesc.Dimension           = ShaderResourceViewDimension.Texture2D;
                        SRVDesc.Texture2D.MipLevels = (mipCount == 0) ? -1 : desc.MipLevels;
                    }

                    textureView = new ShaderResourceView(d3dDevice, tex, SRVDesc);

                    if (textureView == null)
                    {
                        tex.Dispose();
                        texture = null;
                        return(Result.Fail);
                    }
                    texture = tex;
                }
                else
                {
                    return(Result.Fail);
                }
            }
            break;

            case ResourceDimension.Texture3D: {
                Texture3DDescription desc = new Texture3DDescription {
                    Width          = width,
                    Height         = height,
                    Depth          = depth,
                    MipLevels      = mipCount,
                    Format         = format,
                    Usage          = usage,
                    BindFlags      = bindFlags,
                    CpuAccessFlags = cpuAccessFlags,
                    OptionFlags    = miscFlags & ~ResourceOptionFlags.TextureCube
                };

                Texture3D tex = new Texture3D(d3dDevice, desc, initData);

                if (tex != null)
                {
                    SRVDesc.Dimension           = ShaderResourceViewDimension.Texture3D;
                    SRVDesc.Texture3D.MipLevels = (mipCount == 0) ? -1 : desc.MipLevels;

                    textureView = new ShaderResourceView(d3dDevice, tex, SRVDesc);

                    if (textureView == null)
                    {
                        tex.Dispose();
                        texture = null;
                        return(Result.Fail);
                    }
                    texture = tex;
                }
                else
                {
                    return(Result.Fail);
                }
            }
            break;
            }

            return(Result.Ok);
        }