示例#1
0
    private static void CreateD3DResources(
        Device d3dDevice,
        ResourceDimension resDim,
        int width,
        int height,
        int depth,
        int mipCount,
        int arraySize,
        Format format,
        ResourceUsage usage,
        BindFlags bindFlags,
        CpuAccessFlags cpuAccessFlags,
        ResourceOptionFlags miscFlags,
        bool forceSRGB,
        bool isCubeMap,
        DataBox[] initData,
        out Resource texture,
        out ShaderResourceView textureView)
    {
        if (d3dDevice == null)
        {
            throw new SharpDXException(Result.InvalidPointer);
        }

        if (forceSRGB)
        {
            format = MakeSRGB(format);
        }

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

            using (Texture1D tex = new Texture1D(d3dDevice, desc, initData)) {
                ShaderResourceViewDescription SRVDesc = default(ShaderResourceViewDescription);
                SRVDesc.Format = format;

                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);
                texture     = tex.QueryInterface <Texture1D>();
            }
        }
        break;

        case ResourceDimension.Texture2D: {
            Texture2DDescription desc;
            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          = usage;
            desc.BindFlags      = bindFlags;
            desc.CpuAccessFlags = cpuAccessFlags;
            if (isCubeMap)
            {
                desc.OptionFlags = miscFlags | ResourceOptionFlags.TextureCube;
            }
            else
            {
                desc.OptionFlags = miscFlags & ~ResourceOptionFlags.TextureCube;
            }

            using (Texture2D tex = new Texture2D(d3dDevice, desc, initData)) {
                ShaderResourceViewDescription SRVDesc = default(ShaderResourceViewDescription);
                SRVDesc.Format = format;

                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);
                texture     = tex.QueryInterface <Texture2D>();
            }
        }
        break;

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

            using (Texture3D tex = new Texture3D(d3dDevice, desc, initData)) {
                ShaderResourceViewDescription SRVDesc = default(ShaderResourceViewDescription);
                SRVDesc.Format = format;

                SRVDesc.Dimension           = ShaderResourceViewDimension.Texture3D;
                SRVDesc.Texture3D.MipLevels = (mipCount == 0) ? -1 : desc.MipLevels;

                textureView = new ShaderResourceView(d3dDevice, tex, SRVDesc);
                texture     = tex.QueryInterface <Texture3D>();
            }
        }
        break;

        default:
            throw new SharpDXException(Result.Fail);
        }
    }