예제 #1
0
        public DX11SliceRenderTarget(DX11RenderContext context, DX11Texture2D texture, int sliceindex)
        {
            this.isowner = false;
            this.context = context;
            this.parent = texture;
            this.desc = texture.Description;

            RenderTargetViewDescription rtd = new RenderTargetViewDescription()
            {
                ArraySize = 1,
                Dimension = RenderTargetViewDimension.Texture2DArray,
                Format = texture.Format,
                MipSlice = 0,
                FirstArraySlice = sliceindex,
            };

            this.RTV = new RenderTargetView(context.Device, this.parent.Resource, rtd);

            ShaderResourceViewDescription srvd = new ShaderResourceViewDescription()
            {
                ArraySize = 1,
                Dimension = ShaderResourceViewDimension.Texture2DArray,
                Format = texture.Format,
                FirstArraySlice = sliceindex,
                MipLevels = texture.Resource.Description.MipLevels,
                MostDetailedMip = 0
            };

            this.SRV = new ShaderResourceView(context.Device, this.parent.Resource, srvd);
        }
예제 #2
0
        /// <summary>
        /// Constructor
        /// Creates the texture we will render to based on the supplied width and height
        /// </summary>
        /// <param name="device">The device we will create the texture with</param>
        /// <param name="texWidth"></param>
        /// <param name="texHeight"></param>
        public RenderTexture(Device device, int texWidth, int texHeight)
        {
            Texture2DDescription textureDescription = new Texture2DDescription()
                {
                    Width = texWidth,
                    Height = texHeight,
                    MipLevels = 1,
                    ArraySize = 1,
                    Format = SlimDX.DXGI.Format.R32G32B32A32_Float,
                    SampleDescription = new SlimDX.DXGI.SampleDescription(1, 0),
                    BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource,
                    CpuAccessFlags = CpuAccessFlags.None,
                    OptionFlags = ResourceOptionFlags.None,
                    Usage = ResourceUsage.Default,
                };
            Texture = new Texture2D(device, textureDescription);
            RenderTargetViewDescription renderTargetViewDescription = new RenderTargetViewDescription()
            {
                Format = textureDescription.Format,
                Dimension = RenderTargetViewDimension.Texture2D,
                MipSlice = 0,
            };

            renderTargetView = new RenderTargetView(device, Texture, renderTargetViewDescription);

            ShaderResourceViewDescription shaderResourceViewDescription = new ShaderResourceViewDescription()
            {
                Format = textureDescription.Format,
                Dimension = ShaderResourceViewDimension.Texture2D,
                MostDetailedMip = 0,
                MipLevels = 1
            };

            shaderResourceView = new ShaderResourceView(device, Texture, shaderResourceViewDescription);
        }
예제 #3
0
        public DX11MipSliceRenderTarget(DX11RenderContext context, DX11Texture3D texture, int mipindex,int w, int h,int d)
        {
            this.context = context;

            RenderTargetViewDescription rtd = new RenderTargetViewDescription()
            {
                Dimension = RenderTargetViewDimension.Texture3D,
                Format = texture.Format,
                MipSlice = mipindex,
                DepthSliceCount = d           
            };

            ShaderResourceViewDescription srvd = new ShaderResourceViewDescription();
            srvd.Dimension = ShaderResourceViewDimension.Texture3D;
            srvd.MipLevels = 1;
            srvd.MostDetailedMip = mipindex;
            srvd.Format = texture.Format;

            this.RTV = new RenderTargetView(context.Device, texture.Resource, rtd);
            this.SRV = new ShaderResourceView(context.Device, texture.Resource, srvd);

            this.Width = w;
            this.Height = h;
            this.Depth = d;
        }
예제 #4
0
        public DX11MipSliceRenderTarget2D(DX11RenderContext context, DX11Texture2D texture, int mipindex, int w, int h)
        {
            this.context = context;
            this.Resource = texture.Resource;

            RenderTargetViewDescription rtd = new RenderTargetViewDescription()
            {
                Dimension = RenderTargetViewDimension.Texture2D,
                Format = texture.Format,
                MipSlice = mipindex
            };

            UnorderedAccessViewDescription uavd = new UnorderedAccessViewDescription()
            {
                Dimension = UnorderedAccessViewDimension.Texture2D,
                Format = texture.Format,
                MipSlice = mipindex,
            };

            ShaderResourceViewDescription srvd = new ShaderResourceViewDescription();
            srvd.Dimension = ShaderResourceViewDimension.Texture2D;
            srvd.MipLevels = 1;
            srvd.MostDetailedMip = mipindex;
            srvd.Format = texture.Format;

            this.SRV = new ShaderResourceView(context.Device, texture.Resource, srvd);
        }
예제 #5
0
        public DX11RenderTexture3D(DX11RenderContext context, int w, int h, int d, Format format)
            : base(context)
        {
            Texture3DDescription desc = new Texture3DDescription()
            {
                BindFlags = BindFlags.UnorderedAccess | BindFlags.ShaderResource | BindFlags.RenderTarget,
                CpuAccessFlags = CpuAccessFlags.None,
                Depth = d,
                Format = format,
                Height = h,
                MipLevels = 1,
                OptionFlags = ResourceOptionFlags.None,
                Usage = ResourceUsage.Default,
                Width = w
            };

            RenderTargetViewDescription rtvd = new RenderTargetViewDescription();
            rtvd.Dimension = RenderTargetViewDimension.Texture3D;
            rtvd.MipSlice = 0;
            rtvd.FirstDepthSlice = 0;
            rtvd.DepthSliceCount = d;

            this.Resource = new Texture3D(context.Device, desc);
            this.SRV = new ShaderResourceView(context.Device, this.Resource);
            this.UAV = new UnorderedAccessView(context.Device, this.Resource);
            this.RTV = new RenderTargetView(context.Device, this.Resource, rtvd);

            this.Width = desc.Width;
            this.Height = desc.Height;
            this.Format = desc.Format;
            this.Depth = desc.Depth;
        }
예제 #6
0
        public DX11RenderTextureArray(DX11RenderContext context, int w, int h, int elemcnt, Format format)
        {
            this.context = context;

            var texBufferDesc = new Texture2DDescription
            {
                ArraySize = elemcnt,
                BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource,
                CpuAccessFlags = CpuAccessFlags.None,
                Format = format,
                Height = h,
                Width = w,
                OptionFlags = ResourceOptionFlags.None,
                SampleDescription = new SampleDescription(1,0),
                Usage = ResourceUsage.Default,
            };

            this.Resource = new Texture2D(context.Device, texBufferDesc);

            RenderTargetViewDescription rtd = new RenderTargetViewDescription()
            {
                ArraySize = elemcnt,
                FirstArraySlice = 0,
                Dimension = RenderTargetViewDimension.Texture2DArray,
                Format = format
            };

            ShaderResourceViewDescription srvd = new ShaderResourceViewDescription()
            {
                ArraySize = elemcnt,
                FirstArraySlice = 0,
                Dimension = ShaderResourceViewDimension.Texture2DArray,
                Format = format,
                MipLevels = 1,
                MostDetailedMip = 0
            };

            this.SRV = new ShaderResourceView(context.Device, this.Resource, srvd);
            this.RTV = new RenderTargetView(context.Device, this.Resource, rtd);

            this.SRVArray = new ShaderResourceView[elemcnt];

            ShaderResourceViewDescription srvad = new ShaderResourceViewDescription()
            {
                ArraySize = 1,
                Dimension = ShaderResourceViewDimension.Texture2DArray,
                Format = format,
                MipLevels = 1,
                MostDetailedMip = 0
            };

            for (int i = 0; i < elemcnt; i++)
            {
                srvad.FirstArraySlice = i;
                this.SRVArray[i] = new ShaderResourceView(context.Device, this.Resource, srvad);
            }

            this.desc = texBufferDesc;
        }
        private void CreateRenderTargetView()
        {
            var renderTargetViewDesc = new RenderTargetViewDescription();
            renderTargetViewDesc.ArraySize = layerCount;
            renderTargetViewDesc.Dimension = RenderTargetViewDimension.Texture2DArray;
            renderTargetViewDesc.FirstArraySlice = 0;
            renderTargetViewDesc.Format = format;
            renderTargetViewDesc.MipSlice = 0;

            renderTargetViewAsArray = new RenderTargetView(device, texture, renderTargetViewDesc);
        }
예제 #8
0
        public DX11RenderTextureArray(DX11RenderContext context, int w, int h, int elemcnt, Format format, bool buildslices = true, int miplevels = 0)
        {
            this.context = context;

            var texBufferDesc = new Texture2DDescription
            {
                ArraySize = elemcnt,
                BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource,
                CpuAccessFlags = CpuAccessFlags.None,
                Format = format,
                Height = h,
                Width = w,
                OptionFlags = miplevels == 0 ? ResourceOptionFlags.GenerateMipMaps : ResourceOptionFlags.None,
                SampleDescription = new SampleDescription(1,0),
                Usage = ResourceUsage.Default,
                MipLevels= miplevels
            };

            this.Resource = new Texture2D(context.Device, texBufferDesc);

            RenderTargetViewDescription rtd = new RenderTargetViewDescription()
            {
                ArraySize = elemcnt,
                FirstArraySlice = 0,
                Dimension = RenderTargetViewDimension.Texture2DArray,
                Format = format
            };

            ShaderResourceViewDescription srvd = new ShaderResourceViewDescription()
            {
                ArraySize = elemcnt,
                FirstArraySlice = 0,
                Dimension = ShaderResourceViewDimension.Texture2DArray,
                Format = format,
                MipLevels = this.Resource.Description.MipLevels,
                MostDetailedMip = 0
            };

            this.SRV = new ShaderResourceView(context.Device, this.Resource, srvd);
            this.RTV = new RenderTargetView(context.Device, this.Resource, rtd);

            this.desc = texBufferDesc;

            this.SliceRTV = new DX11SliceRenderTarget[this.ElemCnt];

            if (buildslices)
            {
                for (int i = 0; i < this.ElemCnt; i++)
                {
                    this.SliceRTV[i] = new DX11SliceRenderTarget(this.context, this, i);
                }
            }
        }
예제 #9
0
        public bool Initialize(Device device, SystemConfiguration configuration)
        {
            try
            {
                // Initialize and set up the render target description.
                var textureDesc = new Texture2DDescription()
                {
                    Width = configuration.Width,
                    Height = configuration.Height,
                    MipLevels = 1,
                    ArraySize = 1,
                    Format = Format.R32G32B32A32_Float,
                    SampleDescription = new SampleDescription(1, 0),
                    Usage = ResourceUsage.Default,
                    BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource,
                    CpuAccessFlags = CpuAccessFlags.None,
                    OptionFlags = ResourceOptionFlags.None
                };

                // Create the render target texture.
                RenderTargetTexture = new Texture2D(device, textureDesc);

                // Initialize and setup the render target view
                var renderTargetViewDesc = new RenderTargetViewDescription()
                {
                    Format = textureDesc.Format,
                    Dimension = RenderTargetViewDimension.Texture2D,
                };
                renderTargetViewDesc.Texture2D.MipSlice = 0;

                // Create the render target view.
                RenderTargetView = new RenderTargetView(device, RenderTargetTexture, renderTargetViewDesc);

                // Initialize and setup the shader resource view
                var shaderResourceViewDesc = new ShaderResourceViewDescription()
                {
                    Format = textureDesc.Format,
                    Dimension = ShaderResourceViewDimension.Texture2D,
                };
                shaderResourceViewDesc.Texture2D.MipLevels = 1;
                shaderResourceViewDesc.Texture2D.MostDetailedMip = 0;

                // Create the render target view.
                ShaderResourceView = new ShaderResourceView(device, RenderTargetTexture, shaderResourceViewDesc);

                return true;
            }
            catch
            {
                return false;
            }
        }
 private void CreateRenderTargetViews()
 {
     var renderTargetViewDesc = new RenderTargetViewDescription();
     renderTargetViewDesc.Format = texture.Description.Format;
     renderTargetViewDesc.Dimension = RenderTargetViewDimension.Texture2DArray;
     renderTargetViewDesc.ArraySize = 1;
     renderTargetViewDesc.MipSlice = 0;
     for (int i = 0; i < deferredShadingConfiguration.LayerCount; ++i)
     {
         renderTargetViewDesc.FirstArraySlice = i;
         var renderTargetView = new RenderTargetView(device, texture, renderTargetViewDesc);
         renderTargetViews.Add(renderTargetView);
     }
 }
예제 #11
0
 public void OnDeviceInit()
 {
     {
         ShaderResourceViewDescription desc = new ShaderResourceViewDescription();
         desc.Format = m_format;
         desc.Dimension = ShaderResourceViewDimension.Texture2D;
         desc.Texture2D.MipLevels = 1;
         desc.Texture2D.MostDetailedMip = 0;
         m_srv = new ShaderResourceView(MyRender11.Device, m_owner.Resource, desc);
         m_srv.DebugName = m_owner.Name;
     }
     {
         RenderTargetViewDescription desc = new RenderTargetViewDescription();
         desc.Format = m_format;
         desc.Dimension = RenderTargetViewDimension.Texture2D;
         desc.Texture2D.MipSlice = 0;
         m_rtv = new RenderTargetView(MyRender11.Device, m_owner.Resource, desc);
         m_rtv.DebugName = m_owner.Name;
     }
 }
예제 #12
0
        public DX11MipSliceRenderTarget3D(DX11RenderContext context, DX11Texture3D texture, int mipindex, int w, int h, int d)
            : base(context)
        {
            this.Resource = texture.Resource;

            RenderTargetViewDescription rtd = new RenderTargetViewDescription()
            {
                Dimension = RenderTargetViewDimension.Texture3D,
                Format = texture.Format,
                MipSlice = mipindex,
                DepthSliceCount = d
            };

            UnorderedAccessViewDescription uavd = new UnorderedAccessViewDescription()
            {
                Dimension = UnorderedAccessViewDimension.Texture3D,
                Format = texture.Format,
                MipSlice = mipindex,
                FirstDepthSlice = 0,
                DepthSliceCount = d
            };

            ShaderResourceViewDescription srvd = new ShaderResourceViewDescription();
            srvd.Dimension = ShaderResourceViewDimension.Texture3D;
            srvd.MipLevels = 1;
            srvd.MostDetailedMip = mipindex;
            srvd.Format = texture.Format;
            srvd.ArraySize = d;
            srvd.FirstArraySlice = 0;

            this.RTV = new RenderTargetView(context.Device, texture.Resource, rtd);
            this.SRV = new ShaderResourceView(context.Device, texture.Resource, srvd);
            this.UAV = new UnorderedAccessView(context.Device, texture.Resource, uavd);

            this.Width = w;
            this.Height = h;
            this.Depth = d;
        }
예제 #13
0
        public RenderTexture(Game game, int width, int height, int mrtCount = 1, string debugName = null)
        {
            this.game = game;

            if (mrtCount < 1) mrtCount = 1;
            this.debugName = debugName ?? "RenderTexture " + Debug.NextObjectId;
            var format = Format.R32G32B32A32_Float;
            {
                var desc = new Texture2DDescription();
                desc.Format = format;
                desc.Width = width;
                desc.Height = height;
                desc.BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource;
                desc.Usage = ResourceUsage.Default;
                desc.ArraySize = 1;
                desc.CpuAccessFlags = CpuAccessFlags.None;
                desc.MipLevels = 1;
                desc.SampleDescription.Count = 1;
                desc.SampleDescription.Quality = 0;
                desc.OptionFlags = ResourceOptionFlags.None;

                textures = new Texture2D[mrtCount];
                for (int i = 0; i < mrtCount; ++i)
                {
                    textures[i] = new Texture2D(game.Device, desc);
                    textures[i].DebugName = DebugName + "[" + i + "]";
                }
            }
            {
                var desc = new RenderTargetViewDescription();
                desc.Format = format;
                desc.Dimension = RenderTargetViewDimension.Texture2D;
                desc.Texture2D.MipSlice = 0;

                renderTargetViews = new RenderTargetView[mrtCount];
                for (int i = 0; i < mrtCount; ++i)
                {
                    renderTargetViews[i] = new RenderTargetView(game.Device, textures[i], desc);
                    renderTargetViews[i].DebugName = DebugName + "[" + i + "]";
                }
            }
            {
                shaderResourceViews = new ShaderResourceView[mrtCount];
                for (int i = 0; i < mrtCount; ++i)
                {
                    shaderResourceViews[i] = new ShaderResourceView(game.Device, textures[i]);
                    shaderResourceViews[i].DebugName = DebugName + "[" + i + "]";
                }
            }
            {
                clearColors = new Color4[mrtCount];
                for (int i = 0; i < mrtCount; ++i)
                {
                    clearColors[i] = Color4.Black;
                }
            }
            {
                var desc = new Texture2DDescription();
                desc.Format = Format.D24_UNorm_S8_UInt;
                desc.ArraySize = 1;
                desc.MipLevels = 1;
                desc.Width = width;
                desc.Height = height;
                desc.SampleDescription.Count = 1;
                desc.SampleDescription.Quality = 0;
                desc.Usage = ResourceUsage.Default;
                desc.BindFlags = BindFlags.DepthStencil;
                desc.CpuAccessFlags = CpuAccessFlags.None;
                desc.OptionFlags = ResourceOptionFlags.None;
                depthStencilTexture = new Texture2D(game.Device, desc);
                depthStencilTexture.DebugName = DebugName + "(DS)";
            }
            {
                depthStencilView = new DepthStencilView(game.Device, depthStencilTexture);
                depthStencilView.DebugName = DebugName;
            }
            vp = new SharpDX.Viewport(0, 0, width, height);

            game.AddObject(this);
        }
예제 #14
0
        /// <summary>
        /// Creates render target
        /// </summary>
        /// <param name="rs"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <param name="format"></param>
        public FeedbackBuffer(GraphicsDevice device, int width, int height) : base(device)
        {
            Log.Debug("FeedbackBuffer: w:{0} h:{1}", width, height);

            feedbackData    = new VTAddress[width * height];
            feedbackDataRaw = new int[width * height];
            linearSize      = width * height;

            Width  = width;
            Height = height;
            Depth  = 1;

            //
            //	Create Texture2D :
            //
            var texDesc = new Texture2DDescription();

            texDesc.Width             = width;
            texDesc.Height            = height;
            texDesc.ArraySize         = 1;
            texDesc.BindFlags         = BindFlags.RenderTarget | BindFlags.ShaderResource;
            texDesc.CpuAccessFlags    = CpuAccessFlags.None;
            texDesc.Format            = DXGI.Format.R10G10B10A2_UNorm;
            texDesc.MipLevels         = 1;
            texDesc.OptionFlags       = ResourceOptionFlags.None;
            texDesc.SampleDescription = new DXGI.SampleDescription(1, 0);
            texDesc.Usage             = ResourceUsage.Default;

            tex2D = new D3D.Texture2D(device.Device, texDesc);

            //
            //	Create staging Texture2D :
            //
            var texDescStaging = new Texture2DDescription();

            texDescStaging.Width             = width;
            texDescStaging.Height            = height;
            texDescStaging.ArraySize         = 1;
            texDescStaging.BindFlags         = BindFlags.None;
            texDescStaging.CpuAccessFlags    = CpuAccessFlags.Read;
            texDescStaging.Format            = DXGI.Format.R10G10B10A2_UNorm;
            texDescStaging.MipLevels         = 1;
            texDescStaging.OptionFlags       = ResourceOptionFlags.None;
            texDescStaging.SampleDescription = new DXGI.SampleDescription(1, 0);
            texDescStaging.Usage             = ResourceUsage.Staging;

            tex2Dstaging  = new D3D.Texture2D(device.Device, texDescStaging);
            tex2Dstaging1 = new D3D.Texture2D(device.Device, texDescStaging);
            tex2Dstaging2 = new D3D.Texture2D(device.Device, texDescStaging);

            //
            //	Create SRV :
            //
            var srvDesc = new ShaderResourceViewDescription();

            srvDesc.Texture2D.MipLevels       = 1;
            srvDesc.Texture2D.MostDetailedMip = 0;
            srvDesc.Dimension = ShaderResourceViewDimension.Texture2D;
            srvDesc.Format    = DXGI.Format.R10G10B10A2_UNorm;

            SRV = new ShaderResourceView(device.Device, tex2D, srvDesc);

            //
            //	Create RTV :
            //

            width  = Width;
            height = Height;

            var rtvDesc = new RenderTargetViewDescription();

            rtvDesc.Texture2D.MipSlice = 0;
            rtvDesc.Dimension          = RenderTargetViewDimension.Texture2D;
            rtvDesc.Format             = DXGI.Format.R10G10B10A2_UNorm;

            var rtv = new RenderTargetView(device.Device, tex2D, rtvDesc);

            surface = new RenderTargetSurface(rtv, null, tex2D, 0, ColorFormat.Unknown, width, height, 1);
        }
예제 #15
0
        private void CreateRenderTargets()
        {
            Texture2D backBuffer = Texture2D.FromSwapChain<Texture2D>(SwapChain, 0);
            sceneView = new RenderTargetView(Device, backBuffer);

            Texture2DDescription depthBufferDesc = new Texture2DDescription
            {
                ArraySize = 1,
                BindFlags = BindFlags.DepthStencil | BindFlags.ShaderResource,
                CpuAccessFlags = CpuAccessFlags.None,
                Format = Format.R32_Typeless,
                Width = WindowWidth,
                Height = WindowHeight,
                MipLevels = 1,
                OptionFlags = ResourceOptionFlags.None,
                SampleDescription = new SampleDescription(1, 0),
                Usage = ResourceUsage.Default
            };
            Texture2D depthBuffer = new Texture2D(Device, depthBufferDesc);

            DepthStencilViewDescription depthStencilDesc = new DepthStencilViewDescription
            {
                ArraySize = 0,
                Format = Format.D32_Float,
                Dimension = DepthStencilViewDimension.Texture2D,
                MipSlice = 0,
                Flags = 0,
                FirstArraySlice = 0
            };
            depthView = new DepthStencilView(Device, depthBuffer, depthStencilDesc);
            ShaderResourceViewDescription depthResViewDesc = new ShaderResourceViewDescription
            {
                ArraySize = 0,
                Format = Format.R32_Float,
                Dimension = ShaderResourceViewDimension.Texture2D,
                MipLevels = 1,
                Flags = 0,
                FirstArraySlice = 0
            };
            depthResView = new ShaderResourceView(Device, depthBuffer, depthResViewDesc);

            Texture2DDescription densityBufferDesc = new Texture2DDescription
            {
                ArraySize = 1,
                BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource,
                CpuAccessFlags = CpuAccessFlags.None,
                Format = Format.R8G8B8A8_UNorm,
                Width = WindowWidth,
                Height = WindowHeight,
                MipLevels = 1,
                OptionFlags = ResourceOptionFlags.None,
                SampleDescription = new SampleDescription(1, 0),
                Usage = ResourceUsage.Default
            };
            Texture2D densityBuffer = new Texture2D(Device, densityBufferDesc);

            RenderTargetViewDescription densityViewDesc = new RenderTargetViewDescription
            {
                ArraySize = 0,
                Format = Format.R8G8B8A8_UNorm,
                Dimension = RenderTargetViewDimension.Texture2D,
                MipSlice = 0,
                FirstArraySlice = 0
            };
            densityView = new RenderTargetView(Device, densityBuffer, densityViewDesc);
            ShaderResourceViewDescription densityResViewDesc = new ShaderResourceViewDescription
            {
                ArraySize = 0,
                Format = Format.R8G8B8A8_UNorm,
                Dimension = ShaderResourceViewDimension.Texture2D,
                MipLevels = 1,
                Flags = 0,
                FirstArraySlice = 0
            };
            densityResView = new ShaderResourceView(Device, densityBuffer, densityResViewDesc);
        }
예제 #16
0
        /// <summary>
        /// テクスチャーを作成する
        /// </summary>
        /// <param name="app"></param>
        /// <param name="name"></param>
        /// <param name="desc"></param>
        /// <returns></returns>
        public static MCBaseTexture CreateTexture2D(Application app, string name, Texture2DDescription desc)
        {
            int       hr            = -1;
            bool      isCreateDepth = false;
            MCTexture tx            = new MCTexture(app, name);
            var       d             = new Texture123DDesc();

            if (tx == null)
            {
                throw new CreatedException();
            }


            if ((desc.BindFlags & BindFlags.DepthStencil) != 0)
            {
                desc.BindFlags &= ~BindFlags.DepthStencil;
                isCreateDepth   = true;
            }
            d.D2 = desc;
            if (tx.CreateTexture2D(0, d) != 0)
            {
                return(null);
            }

            // 1.レンダーターゲット
            if ((desc.BindFlags & BindFlags.RenderTarget) != 0)
            {
                RenderTargetViewDescription renderD = new RenderTargetViewDescription();

                renderD.Format             = desc.Format;
                renderD.Dimension          = RenderTargetViewDimension.Texture2D;
                renderD.Texture2D.MipSlice = 0;

                hr = tx.CreateRenderTargetView(0, renderD);
                if (hr == -1)
                {
                    return(null);
                }
            }
            // 2.シェーダーターゲット
            if ((desc.BindFlags & BindFlags.ShaderResource) != 0)
            {
                ShaderResourceViewDescription shaderD = new ShaderResourceViewDescription();

                shaderD.Format    = desc.Format;
                shaderD.Dimension = ShaderResourceViewDimension.Texture2D;
                shaderD.Texture2D.MostDetailedMip = 0;
                shaderD.Texture2D.MipLevels       = 1;

                hr = tx.CreateShaderResourceView(0, shaderD);
                if (hr == -1)
                {
                    return(null);
                }
            }

            if (isCreateDepth)
            {
                hr = tx.CreateDepthTexture();
                if (hr == -1)
                {
                    return(null);
                }
            }
            if (!app.ImageMgr.RegisterTexture(name, tx))
            {
                return(null);
            }

            return(tx);
        }
예제 #17
0
        protected override void CreateDeviceDependentResources()
        {
            RemoveAndDispose(ref EnvMap);
            RemoveAndDispose(ref EnvMapSRV);
            RemoveAndDispose(ref EnvMapRTV);
            RemoveAndDispose(ref EnvMapDSV);
            RemoveAndDispose(ref PerEnvMapBuffer);

            EnvMapRTVs.ToList().ForEach((rtv) => RemoveAndDispose(ref rtv));
            EnvMapDSVs.ToList().ForEach((dsv) => RemoveAndDispose(ref dsv));
            contextList.ToList().ForEach((ctx) => RemoveAndDispose(ref ctx));

            var device = this.DeviceManager.Direct3DDevice;

            // Create the cube map TextureCube (array of 6 textures)
            var textureDesc = new Texture2DDescription()
            {
                Format            = Format.R8G8B8A8_UNorm,
                Height            = Size,
                Width             = Size,
                ArraySize         = 6, // 6-sides of the cube
                BindFlags         = BindFlags.ShaderResource | BindFlags.RenderTarget,
                OptionFlags       = ResourceOptionFlags.GenerateMipMaps | ResourceOptionFlags.TextureCube,
                SampleDescription = new SampleDescription(1, 0),
                MipLevels         = 0,
                Usage             = ResourceUsage.Default,
                CpuAccessFlags    = CpuAccessFlags.None,
            };

            EnvMap = ToDispose(new Texture2D(device, textureDesc));

            // Create the SRV for the texture cube
            var descSRV = new ShaderResourceViewDescription();

            descSRV.Format    = textureDesc.Format;
            descSRV.Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.TextureCube;
            descSRV.TextureCube.MostDetailedMip = 0;
            descSRV.TextureCube.MipLevels       = -1;
            EnvMapSRV = ToDispose(new ShaderResourceView(device, EnvMap, descSRV));

            // Create the RTVs
            var descRTV = new RenderTargetViewDescription();

            descRTV.Format    = textureDesc.Format;
            descRTV.Dimension = RenderTargetViewDimension.Texture2DArray;
            descRTV.Texture2DArray.MipSlice = 0;
            // 1. Single RTV for single pass rendering
            descRTV.Texture2DArray.FirstArraySlice = 0;
            descRTV.Texture2DArray.ArraySize       = 6;
            EnvMapRTV = ToDispose(new RenderTargetView(device, EnvMap, descRTV));
            // 2. RTV for each of the 6 sides of the texture cube
            descRTV.Texture2DArray.ArraySize = 1;
            for (int i = 0; i < 6; i++)
            {
                descRTV.Texture2DArray.FirstArraySlice = i;
                EnvMapRTVs[i] = ToDispose(new RenderTargetView(device, EnvMap, descRTV));
            }

            // Create DSVs
            using (var depth = new Texture2D(device, new Texture2DDescription
            {
                Format = Format.D32_Float,
                BindFlags = BindFlags.DepthStencil,
                Height = Size,
                Width = Size,
                Usage = ResourceUsage.Default,
                SampleDescription = new SampleDescription(1, 0),
                CpuAccessFlags = CpuAccessFlags.None,
                MipLevels = 1,
                OptionFlags = ResourceOptionFlags.TextureCube,
                ArraySize = 6 // 6-sides of the cube
            }))
            {
                var descDSV = new DepthStencilViewDescription();
                descDSV.Format    = depth.Description.Format;
                descDSV.Dimension = DepthStencilViewDimension.Texture2DArray;
                descDSV.Flags     = DepthStencilViewFlags.None;
                descDSV.Texture2DArray.MipSlice = 0;
                // 1. Single DSV for single pass rendering
                descDSV.Texture2DArray.FirstArraySlice = 0;
                descDSV.Texture2DArray.ArraySize       = 6;
                EnvMapDSV = ToDispose(new DepthStencilView(device, depth, descDSV));
                // 2. Create DSV for each face
                descDSV.Texture2DArray.ArraySize = 1;
                for (var i = 0; i < 6; i++)
                {
                    descDSV.Texture2DArray.FirstArraySlice = i;
                    EnvMapDSVs[i] = ToDispose(new DepthStencilView(device, depth, descDSV));
                }
            }

            // Create the viewport
            Viewport = new Viewport(0, 0, Size, Size);

            // Initialize context List for threaded rendering
            // See UpdateCubeThreaded
            if (Threads == 1)
            {
                contextList = null;
            }
            else
            {
                contextList = new DeviceContext[Threads];
                for (var i = 0; i < Threads; i++)
                {
                    contextList[i] = ToDispose(new DeviceContext(device));
                }
            }

            // Create the per environment map buffer (to store the 6 ViewProjection matrices)
            PerEnvMapBuffer           = ToDispose(new Buffer(device, Utilities.SizeOf <Matrix>() * 6, ResourceUsage.Default, BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0));
            PerEnvMapBuffer.DebugName = "PerEnvMapBuffer";
            EnvMap.Dispose();
        }
예제 #18
0
        internal MyRtvView(MyBindableResource from, Format fmt)
        {
            m_owner = from;

            var desc = new RenderTargetViewDescription
            {
                Format = fmt,
                Dimension = RenderTargetViewDimension.Texture2D,
                Texture2D = new RenderTargetViewDescription.Texture2DResource { MipSlice = 0 }
            };

            m_rtv = new RenderTargetView(MyRender11.Device, m_owner.m_resource, desc);
        }
 /// <summary>
 /// Creates the view.
 /// </summary>
 /// <param name="desc">The desc.</param>
 public void CreateView(RenderTargetViewDescription desc)
 {
     RemoveAndDispose(ref renderTargetView);
     renderTargetView = Collect(new RenderTargetView(device, resource, desc));
 }
예제 #20
0
        public DX11CubeRenderTarget(DxDevice device, int size, SampleDescription sd, Format format, bool genMipMaps, int mmLevels)
        {
            this.device = device;

            var texBufferDesc = new Texture2DDescription
            {
                ArraySize         = 6,
                BindFlags         = BindFlags.RenderTarget | BindFlags.ShaderResource,
                CpuAccessFlags    = CpuAccessFlags.None,
                Format            = format,
                Height            = size,
                Width             = size,
                OptionFlags       = ResourceOptionFlags.TextureCube,
                SampleDescription = sd,
                Usage             = ResourceUsage.Default,
            };

            if (genMipMaps && sd.Count == 1)
            {
                texBufferDesc.OptionFlags |= ResourceOptionFlags.GenerateMipMaps;
                texBufferDesc.MipLevels    = mmLevels;
            }
            else
            {
                //Make sure we enforce 1 here, as we dont generate
                texBufferDesc.MipLevels = 1;
            }

            this.Texture      = new Texture2D(device.Device, texBufferDesc);
            this.resourceDesc = this.Texture.Description;

            //Create faces SRV/RTV
            this.Slices = new DX11SliceRenderTarget[6];

            ShaderResourceViewDescription svd = new ShaderResourceViewDescription()
            {
                Format      = format,
                Dimension   = ShaderResourceViewDimension.TextureCube,
                TextureCube = new ShaderResourceViewDescription.TextureCubeResource()
                {
                    MipLevels       = 1,
                    MostDetailedMip = 0,
                }
            };

            RenderTargetViewDescription rtvd = new RenderTargetViewDescription()
            {
                Dimension      = RenderTargetViewDimension.Texture2DArray,
                Format         = format,
                Texture2DArray = new RenderTargetViewDescription.Texture2DArrayResource()
                {
                    ArraySize       = 6,
                    FirstArraySlice = 0,
                    MipSlice        = 0
                }
            };

            this.RenderView = new RenderTargetView(device.Device, this.Texture, rtvd);

            this.ShaderView = new ShaderResourceView(device.Device, this.Texture, svd);

            for (int i = 0; i < 6; i++)
            {
                this.Slices[i] = new DX11SliceRenderTarget(device, this, i);
            }
        }
예제 #21
0
        public FramebufferD3D11(DeviceD3D11 device, FramebufferAttachment[] colorAttachments, FramebufferAttachment?depthStencilAttachment)
            : base(device, colorAttachments, depthStencilAttachment)
        {
            if (colorAttachments.Length > 0)
            {
                RenderTargetViews = new ID3D11RenderTargetView[colorAttachments.Length];
                for (var i = 0; i < colorAttachments.Length; i++)
                {
                    var  attachment  = colorAttachments[i];
                    var  texture     = attachment.Texture;
                    var  arraySize   = texture.ArrayLayers - attachment.Slice;
                    bool isTextureMs = (int)texture.Samples > 1;

                    var d3dTexture = (TextureD3D11)texture;
                    var viewDesc   = new RenderTargetViewDescription
                    {
                        Format = d3dTexture.DXGIFormat
                    };

                    switch (texture.TextureType)
                    {
                    case TextureType.Texture1D:
                        if (arraySize > 1)
                        {
                            viewDesc.ViewDimension                  = RenderTargetViewDimension.Texture1DArray;
                            viewDesc.Texture1DArray.MipSlice        = attachment.MipLevel;
                            viewDesc.Texture1DArray.FirstArraySlice = attachment.Slice;
                            viewDesc.Texture1DArray.ArraySize       = arraySize;
                        }
                        else
                        {
                            viewDesc.ViewDimension      = RenderTargetViewDimension.Texture1D;
                            viewDesc.Texture1D.MipSlice = attachment.MipLevel;
                        }
                        break;

                    case TextureType.Texture2D:
                        if (arraySize > 1)
                        {
                            if (isTextureMs)
                            {
                                viewDesc.ViewDimension = RenderTargetViewDimension.Texture2DMultisampledArray;
                                viewDesc.Texture2DMSArray.FirstArraySlice = attachment.Slice;
                                viewDesc.Texture2DMSArray.ArraySize       = arraySize;
                            }
                            else
                            {
                                viewDesc.ViewDimension                  = RenderTargetViewDimension.Texture2DArray;
                                viewDesc.Texture2DArray.MipSlice        = attachment.MipLevel;
                                viewDesc.Texture2DArray.FirstArraySlice = attachment.Slice;
                                viewDesc.Texture2DArray.ArraySize       = arraySize;
                            }
                        }
                        else
                        {
                            if (isTextureMs)
                            {
                                viewDesc.ViewDimension = RenderTargetViewDimension.Texture2DMultisampled;
                            }
                            else
                            {
                                viewDesc.ViewDimension      = RenderTargetViewDimension.Texture2D;
                                viewDesc.Texture2D.MipSlice = attachment.MipLevel;
                            }
                        }
                        break;

                    case TextureType.Texture3D:
                        // TODO: Add RenderPassAttachment.DepthPlane
                        viewDesc.ViewDimension         = RenderTargetViewDimension.Texture3D;
                        viewDesc.Texture3D.MipSlice    = attachment.MipLevel;
                        viewDesc.Texture3D.FirstWSlice = attachment.Slice;
                        viewDesc.Texture3D.WSize       = texture.Depth;
                        break;

                    case TextureType.TextureCube:
                        if (isTextureMs)
                        {
                            viewDesc.ViewDimension = RenderTargetViewDimension.Texture2DMultisampledArray;
                            viewDesc.Texture2DMSArray.FirstArraySlice = attachment.Slice * 6;
                            viewDesc.Texture2DMSArray.ArraySize       = arraySize * 6;
                        }
                        else
                        {
                            viewDesc.ViewDimension                  = RenderTargetViewDimension.Texture2DArray;
                            viewDesc.Texture2DArray.MipSlice        = attachment.MipLevel;
                            viewDesc.Texture2DArray.FirstArraySlice = attachment.Slice * 6;
                            viewDesc.Texture2DArray.ArraySize       = arraySize * 6;
                        }
                        break;
                    }

                    RenderTargetViews[i] = device.Device.CreateRenderTargetView(d3dTexture.Resource, viewDesc);
                }
            }
            else
            {
                RenderTargetViews = new ID3D11RenderTargetView[0];
            }

            if (depthStencilAttachment != null)
            {
                var  attachment  = depthStencilAttachment.Value;
                var  texture     = attachment.Texture;
                var  d3dTexture  = (TextureD3D11)texture;
                var  arraySize   = texture.ArrayLayers - attachment.Slice;
                bool isTextureMs = (int)texture.Samples > 1;

                var viewDesc = new DepthStencilViewDescription
                {
                    Format = d3dTexture.DXGIFormat,
                    Flags  = DepthStencilViewFlags.None
                };

                switch (texture.TextureType)
                {
                case TextureType.Texture1D:
                    if (arraySize > 1)
                    {
                        viewDesc.ViewDimension                  = DepthStencilViewDimension.Texture1DArray;
                        viewDesc.Texture1DArray.MipSlice        = attachment.MipLevel;
                        viewDesc.Texture1DArray.FirstArraySlice = attachment.Slice;
                        viewDesc.Texture1DArray.ArraySize       = arraySize;
                    }
                    else
                    {
                        viewDesc.ViewDimension      = DepthStencilViewDimension.Texture1D;
                        viewDesc.Texture1D.MipSlice = attachment.MipLevel;
                    }
                    break;

                case TextureType.Texture2D:
                    if (arraySize > 1)
                    {
                        if (isTextureMs)
                        {
                            viewDesc.ViewDimension = DepthStencilViewDimension.Texture2DMultisampledArray;
                            viewDesc.Texture2DMSArray.FirstArraySlice = attachment.Slice;
                            viewDesc.Texture2DMSArray.ArraySize       = arraySize;
                        }
                        else
                        {
                            viewDesc.ViewDimension                  = DepthStencilViewDimension.Texture2DArray;
                            viewDesc.Texture2DArray.MipSlice        = attachment.MipLevel;
                            viewDesc.Texture2DArray.FirstArraySlice = attachment.Slice;
                            viewDesc.Texture2DArray.ArraySize       = arraySize;
                        }
                    }
                    else
                    {
                        if (isTextureMs)
                        {
                            viewDesc.ViewDimension = DepthStencilViewDimension.Texture2DMultisampled;
                        }
                        else
                        {
                            viewDesc.ViewDimension      = DepthStencilViewDimension.Texture2D;
                            viewDesc.Texture2D.MipSlice = attachment.MipLevel;
                        }
                    }

                    break;

                case TextureType.TextureCube:
                    if (isTextureMs)
                    {
                        viewDesc.ViewDimension = DepthStencilViewDimension.Texture2DMultisampledArray;
                        viewDesc.Texture2DMSArray.FirstArraySlice = attachment.Slice * 6;
                        viewDesc.Texture2DMSArray.ArraySize       = arraySize * 6;
                    }
                    else
                    {
                        viewDesc.ViewDimension                  = DepthStencilViewDimension.Texture2DArray;
                        viewDesc.Texture2DArray.MipSlice        = attachment.MipLevel * 6;
                        viewDesc.Texture2DArray.FirstArraySlice = attachment.Slice * 6;
                        viewDesc.Texture2DArray.ArraySize       = arraySize * 6;
                    }
                    break;

                case TextureType.Texture3D:
                    viewDesc.ViewDimension                  = DepthStencilViewDimension.Texture2DArray;
                    viewDesc.Texture2DArray.MipSlice        = attachment.MipLevel;
                    viewDesc.Texture2DArray.FirstArraySlice = attachment.Slice;
                    viewDesc.Texture2DArray.ArraySize       = texture.Depth;
                    break;

                default:
                    viewDesc.ViewDimension = DepthStencilViewDimension.Unknown;
                    Log.Error("Invalid texture type");
                    break;
                }

                DepthStencilView = device.Device.CreateDepthStencilView(d3dTexture.Resource, viewDesc);
            }
        }
        // Puvlix Methods
        public bool Initialize(SharpDX.Direct3D11.Device device, DSystemConfiguration configuration)
        {
            try
            {
                // Initialize and set up the render target description.
                Texture2DDescription textureDesc = new Texture2DDescription()
                {
                    // Shadow Map Texture size as a 1024x1024 Square
                    Width             = 1024,
                    Height            = 1024,
                    MipLevels         = 1,
                    ArraySize         = 1,
                    Format            = Format.R32G32B32A32_Float,
                    SampleDescription = new SampleDescription(1, 0),
                    Usage             = ResourceUsage.Default,
                    BindFlags         = BindFlags.RenderTarget | BindFlags.ShaderResource,
                    CpuAccessFlags    = CpuAccessFlags.None,
                    OptionFlags       = ResourceOptionFlags.None
                };

                // Create the render target texture.
                RenderTargetTexture = new Texture2D(device, textureDesc);

                // Setup the description of the render target view.
                RenderTargetViewDescription renderTargetViewDesc = new RenderTargetViewDescription()
                {
                    Format    = textureDesc.Format,
                    Dimension = RenderTargetViewDimension.Texture2D,
                };
                renderTargetViewDesc.Texture2D.MipSlice = 0;

                // Create the render target view.
                RenderTargetView = new RenderTargetView(device, RenderTargetTexture, renderTargetViewDesc);

                // Setup the description of the shader resource view.
                ShaderResourceViewDescription shaderResourceViewDesc = new ShaderResourceViewDescription()
                {
                    Format    = textureDesc.Format,
                    Dimension = ShaderResourceViewDimension.Texture2D,
                };
                shaderResourceViewDesc.Texture2D.MipLevels       = 1;
                shaderResourceViewDesc.Texture2D.MostDetailedMip = 0;

                // Create the render target view.
                ShaderResourceView = new ShaderResourceView(device, RenderTargetTexture, shaderResourceViewDesc);

                // Initialize and Set up the description of the depth buffer.
                Texture2DDescription depthStencilDesc = new Texture2DDescription()
                {
                    Width             = 1024,
                    Height            = 1024,
                    MipLevels         = 1,
                    ArraySize         = 1,
                    Format            = Format.D24_UNorm_S8_UInt,
                    SampleDescription = new SampleDescription(1, 0),
                    Usage             = ResourceUsage.Default,
                    BindFlags         = BindFlags.DepthStencil,
                    CpuAccessFlags    = CpuAccessFlags.None,
                    OptionFlags       = ResourceOptionFlags.None
                };

                // Create the texture for the depth buffer using the filled out description.
                DepthStencilBuffer = new Texture2D(device, depthStencilDesc);

                // Initailze the depth stencil view description.
                DepthStencilViewDescription deothStencilViewDesc = new DepthStencilViewDescription()
                {
                    Format    = Format.D24_UNorm_S8_UInt,
                    Dimension = DepthStencilViewDimension.Texture2D
                };
                deothStencilViewDesc.Texture2D.MipSlice = 0;

                // Create the depth stencil view.
                DepthStencilView = new DepthStencilView(device, DepthStencilBuffer, deothStencilViewDesc);

                // Setup the viewport for rendering.
                ViewPort = new ViewportF()
                {
                    Width    = 1024.0f,
                    Height   = 1024.0f,
                    MinDepth = 0.0f,
                    MaxDepth = 1.0f,
                    X        = 0.0f,
                    Y        = 0.0f
                };

                return(true);
            }
            catch
            {
                return(false);
            }
        }
예제 #23
0
파일: Program.cs 프로젝트: virus-404/dx11
        private void BuildDynamicCubeMapViews()
        {
            // create the render target cube map texture
            var texDesc = new Texture2DDescription()
            {
                Width             = CubeMapSize,
                Height            = CubeMapSize,
                MipLevels         = 0,
                ArraySize         = 6,
                SampleDescription = new SampleDescription(1, 0),
                Format            = Format.R8G8B8A8_UNorm,
                Usage             = ResourceUsage.Default,
                BindFlags         = BindFlags.ShaderResource | BindFlags.RenderTarget,
                CpuAccessFlags    = CpuAccessFlags.None,
                OptionFlags       = ResourceOptionFlags.GenerateMipMaps | ResourceOptionFlags.TextureCube
            };
            var cubeTex = new Texture2D(Device, texDesc);

            cubeTex.DebugName = "dynamic cubemap texture";
            // create the render target view array
            var rtvDesc = new RenderTargetViewDescription()
            {
                Format    = texDesc.Format,
                Dimension = RenderTargetViewDimension.Texture2DArray,
                ArraySize = 1,
                MipSlice  = 0
            };

            for (int i = 0; i < 6; i++)
            {
                rtvDesc.FirstArraySlice = i;
                _dynamicCubeMapRTV[i]   = new RenderTargetView(Device, cubeTex, rtvDesc);
            }
            // Create the shader resource view that we will bind to our effect for the cubemap
            var srvDesc = new ShaderResourceViewDescription()
            {
                Format          = texDesc.Format,
                Dimension       = ShaderResourceViewDimension.TextureCube,
                MostDetailedMip = 0,
                MipLevels       = -1
            };

            _dynamicCubeMapSRV = new ShaderResourceView(Device, cubeTex, srvDesc);
            // release the texture, now that it is saved to the views
            Util.ReleaseCom(ref cubeTex);
            // create the depth/stencil texture
            var depthTexDesc = new Texture2DDescription()
            {
                Width             = CubeMapSize,
                Height            = CubeMapSize,
                MipLevels         = 1,
                ArraySize         = 1,
                SampleDescription = new SampleDescription(1, 0),
                Format            = Format.D32_Float,
                Usage             = ResourceUsage.Default,
                BindFlags         = BindFlags.DepthStencil,
                CpuAccessFlags    = CpuAccessFlags.None,
                OptionFlags       = ResourceOptionFlags.None
            };
            var depthTex = new Texture2D(Device, depthTexDesc);

            depthTex.DebugName = "dynamic cubemap depthmap";
            var dsvDesc = new DepthStencilViewDescription()
            {
                Format    = depthTexDesc.Format,
                Flags     = DepthStencilViewFlags.None,
                Dimension = DepthStencilViewDimension.Texture2D,
                MipSlice  = 0,
            };

            _dynamicCubeMapDSV = new DepthStencilView(Device, depthTex, dsvDesc);

            Util.ReleaseCom(ref depthTex);
            // create the viewport for rendering the cubemap faces
            _cubeMapViewPort = new Viewport(0, 0, CubeMapSize, CubeMapSize, 0, 1.0f);
        }
예제 #24
0
        private void GenerateIfRequired()
        {
            if (_renderTargetViews != null)
            {
                return;
            }

            // Create a view interface on the rendertarget to use on bind.
            if (ArraySize > 1)
            {
                _renderTargetViews = new RenderTargetView[ArraySize];
                for (var i = 0; i < ArraySize; i++)
                {
                    var renderTargetViewDescription = new RenderTargetViewDescription();
                    if (GetTextureSampleDescription().Count > 1)
                    {
                        renderTargetViewDescription.Dimension = RenderTargetViewDimension.Texture2DMultisampledArray;
                        renderTargetViewDescription.Texture2DMSArray.ArraySize       = 1;
                        renderTargetViewDescription.Texture2DMSArray.FirstArraySlice = i;
                    }
                    else
                    {
                        renderTargetViewDescription.Dimension = RenderTargetViewDimension.Texture2DArray;
                        renderTargetViewDescription.Texture2DArray.ArraySize       = 1;
                        renderTargetViewDescription.Texture2DArray.FirstArraySlice = i;
                        renderTargetViewDescription.Texture2DArray.MipSlice        = 0;
                    }
                    _renderTargetViews[i] = new RenderTargetView(
                        GraphicsDevice._d3dDevice, GetTexture(),
                        renderTargetViewDescription);
                }
            }
            else
            {
                _renderTargetViews = new[] { new RenderTargetView(GraphicsDevice._d3dDevice, GetTexture()) };
            }

            // If we don't need a depth buffer then we're done.
            if (DepthStencilFormat == DepthFormat.None)
            {
                return;
            }

            // The depth stencil view's multisampling configuration must strictly
            // match the texture's multisampling configuration.  Ignore whatever parameters
            // were provided and use the texture's configuration so that things are
            // guarenteed to work.
            var multisampleDesc = GetTextureSampleDescription();

            // Create a descriptor for the depth/stencil buffer.
            // Allocate a 2-D surface as the depth/stencil buffer.
            // Create a DepthStencil view on this surface to use on bind.
            using (var depthBuffer = new SharpDX.Direct3D11.Texture2D(GraphicsDevice._d3dDevice, new Texture2DDescription
            {
                Format = SharpDXHelper.ToFormat(DepthStencilFormat),
                ArraySize = 1,
                MipLevels = 1,
                Width = width,
                Height = height,
                SampleDescription = multisampleDesc,
                BindFlags = BindFlags.DepthStencil,
            }))
            {
                // Create the view for binding to the device.
                _depthStencilView = new DepthStencilView(GraphicsDevice._d3dDevice, depthBuffer,
                                                         new DepthStencilViewDescription()
                {
                    Format    = SharpDXHelper.ToFormat(DepthStencilFormat),
                    Dimension = GetTextureSampleDescription().Count > 1 ? DepthStencilViewDimension.Texture2DMultisampled : DepthStencilViewDimension.Texture2D
                });
            }
        }
        protected override void CreateDeviceDependentResources()
        {
            RemoveAndDispose(ref vertexShader);
            RemoveAndDispose(ref lightBuffer);
            RemoveAndDispose(ref RTV);
            RemoveAndDispose(ref SRV);
            RemoveAndDispose(ref rsCullBack);
            RemoveAndDispose(ref rsCullFront);
            RemoveAndDispose(ref rsWireframe);
            RemoveAndDispose(ref blendStateAdd);
            RemoveAndDispose(ref depthLessThan);
            RemoveAndDispose(ref depthGreaterThan);
            RemoveAndDispose(ref depthDisabled);
            RemoveAndDispose(ref perLightBuffer);

            RemoveAndDispose(ref psAmbientLight);
            RemoveAndDispose(ref psDirectionalLight);
            RemoveAndDispose(ref psPointLight);
            RemoveAndDispose(ref psSpotLight);
            RemoveAndDispose(ref psDebugLight);
            RemoveAndDispose(ref perLightBuffer);

            // Retrieve our SharpDX.Direct3D11.Device1 instance
            var device = this.DeviceManager.Direct3DDevice;

            int width, height;
            SampleDescription sampleDesc;

            // Retrieve DSV from GBuffer and extract width/height
            // then create a new read-only DSV
            using (var depthTexture = gbuffer.DSV.ResourceAs <Texture2D>())
            {
                width      = depthTexture.Description.Width;
                height     = depthTexture.Description.Height;
                sampleDesc = depthTexture.Description.SampleDescription;

                // Initialize read-only DSV
                var dsvDesc = gbuffer.DSV.Description;
                dsvDesc.Flags = DepthStencilViewFlags.ReadOnlyDepth | DepthStencilViewFlags.ReadOnlyStencil;
                DSVReadonly   = ToDispose(new DepthStencilView(device, depthTexture, dsvDesc));
            }
            // Check if GBuffer is multi-sampled
            bool isMSAA = sampleDesc.Count > 1;

            // Initialize the light render target
            var texDesc = new Texture2DDescription();

            texDesc.BindFlags         = BindFlags.ShaderResource | BindFlags.RenderTarget;
            texDesc.ArraySize         = 1;
            texDesc.CpuAccessFlags    = CpuAccessFlags.None;
            texDesc.Usage             = ResourceUsage.Default;
            texDesc.Width             = width;
            texDesc.Height            = height;
            texDesc.MipLevels         = 1; // No mip levels
            texDesc.SampleDescription = sampleDesc;
            texDesc.Format            = Format.R8G8B8A8_UNorm;

            lightBuffer = ToDispose(new Texture2D(device, texDesc));

            // Render Target View description
            var rtvDesc = new RenderTargetViewDescription();

            rtvDesc.Format             = Format.R8G8B8A8_UNorm;
            rtvDesc.Dimension          = isMSAA ? RenderTargetViewDimension.Texture2DMultisampled : RenderTargetViewDimension.Texture2D;
            rtvDesc.Texture2D.MipSlice = 0;
            RTV = ToDispose(new RenderTargetView(device, lightBuffer, rtvDesc));

            // SRV description for render targets
            var srvDesc = new ShaderResourceViewDescription();

            srvDesc.Format                    = Format.R8G8B8A8_UNorm;
            srvDesc.Dimension                 = isMSAA ? SharpDX.Direct3D.ShaderResourceViewDimension.Texture2DMultisampled : SharpDX.Direct3D.ShaderResourceViewDimension.Texture2D;
            srvDesc.Texture2D.MipLevels       = -1;
            srvDesc.Texture2D.MostDetailedMip = 0;
            SRV = ToDispose(new ShaderResourceView(device, lightBuffer, srvDesc));

            // Initialize additive blend state (assuming single render target)
            BlendStateDescription bsDesc = new BlendStateDescription();

            bsDesc.RenderTarget[0].IsBlendEnabled        = true;
            bsDesc.RenderTarget[0].AlphaBlendOperation   = BlendOperation.Add;
            bsDesc.RenderTarget[0].SourceAlphaBlend      = BlendOption.One;
            bsDesc.RenderTarget[0].DestinationAlphaBlend = BlendOption.One;
            bsDesc.RenderTarget[0].BlendOperation        = BlendOperation.Add;
            bsDesc.RenderTarget[0].SourceBlend           = BlendOption.One;
            bsDesc.RenderTarget[0].DestinationBlend      = BlendOption.One;
            bsDesc.RenderTarget[0].RenderTargetWriteMask = ColorWriteMaskFlags.All;
            blendStateAdd = ToDispose(new BlendState(device, bsDesc));

            // Initialize rasterizer states
            RasterizerStateDescription rsDesc = new RasterizerStateDescription();

            rsDesc.FillMode = FillMode.Solid;
            rsDesc.CullMode = CullMode.Back;
            rsCullBack      = ToDispose(new RasterizerState(device, rsDesc));
            rsDesc.CullMode = CullMode.Front;
            rsCullFront     = ToDispose(new RasterizerState(device, rsDesc));
            rsDesc.CullMode = CullMode.Front;
            rsDesc.FillMode = FillMode.Wireframe;
            rsWireframe     = ToDispose(new RasterizerState(device, rsDesc));

            // Initialize depth state
            var dsDesc = new DepthStencilStateDescription();

            dsDesc.IsStencilEnabled = false;
            dsDesc.IsDepthEnabled   = true;

            // Less-than depth comparison
            dsDesc.DepthComparison = Comparison.Less;
            depthLessThan          = ToDispose(new DepthStencilState(device, dsDesc));
            // Greater-than depth comparison
            dsDesc.DepthComparison = Comparison.Greater;
            depthGreaterThan       = ToDispose(new DepthStencilState(device, dsDesc));
            // Depth/stencil testing disabled
            dsDesc.IsDepthEnabled = false;
            depthDisabled         = ToDispose(new DepthStencilState(device, dsDesc));

            // Buffer to light parameters
            perLightBuffer = ToDispose(new Buffer(device, Utilities.SizeOf <PerLight>(), ResourceUsage.Default, BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0));

            if (isMSAA)
            {
                // Compile and create the vertex shader
                using (var bytecode = HLSLCompiler.CompileFromFile(@"Shaders\LightsMS.hlsl", "VSLight", "vs_5_0"))
                    vertexShader = ToDispose(new VertexShader(device, bytecode));
                // Compile pixel shaders
                using (var bytecode = HLSLCompiler.CompileFromFile(@"Shaders\LightsMS.hlsl", "PSAmbientLight", "ps_5_0"))
                    psAmbientLight = ToDispose(new PixelShader(device, bytecode));
                using (var bytecode = HLSLCompiler.CompileFromFile(@"Shaders\LightsMS.hlsl", "PSDirectionalLight", "ps_5_0"))
                    psDirectionalLight = ToDispose(new PixelShader(device, bytecode));
                using (var bytecode = HLSLCompiler.CompileFromFile(@"Shaders\LightsMS.hlsl", "PSPointLight", "ps_5_0"))
                    psPointLight = ToDispose(new PixelShader(device, bytecode));
                using (var bytecode = HLSLCompiler.CompileFromFile(@"Shaders\LightsMS.hlsl", "PSSpotLight", "ps_5_0"))
                    psSpotLight = ToDispose(new PixelShader(device, bytecode));
                using (var bytecode = HLSLCompiler.CompileFromFile(@"Shaders\LightsMS.hlsl", "PSDebugLight", "ps_5_0"))
                    psDebugLight = ToDispose(new PixelShader(device, bytecode));
            }
            else
            {
                // Compile and create the vertex shader
                using (var bytecode = HLSLCompiler.CompileFromFile(@"Shaders\Lights.hlsl", "VSLight", "vs_5_0"))
                    vertexShader = ToDispose(new VertexShader(device, bytecode));
                // Compile pixel shaders
                using (var bytecode = HLSLCompiler.CompileFromFile(@"Shaders\Lights.hlsl", "PSAmbientLight", "ps_5_0"))
                    psAmbientLight = ToDispose(new PixelShader(device, bytecode));
                using (var bytecode = HLSLCompiler.CompileFromFile(@"Shaders\Lights.hlsl", "PSDirectionalLight", "ps_5_0"))
                    psDirectionalLight = ToDispose(new PixelShader(device, bytecode));
                using (var bytecode = HLSLCompiler.CompileFromFile(@"Shaders\Lights.hlsl", "PSPointLight", "ps_5_0"))
                    psPointLight = ToDispose(new PixelShader(device, bytecode));
                using (var bytecode = HLSLCompiler.CompileFromFile(@"Shaders\Lights.hlsl", "PSSpotLight", "ps_5_0"))
                    psSpotLight = ToDispose(new PixelShader(device, bytecode));
                using (var bytecode = HLSLCompiler.CompileFromFile(@"Shaders\Lights.hlsl", "PSDebugLight", "ps_5_0"))
                    psDebugLight = ToDispose(new PixelShader(device, bytecode));
            }
        }
예제 #26
0
        /// <summary>
        /// Creates render target
        /// </summary>
        /// <param name="?"></param>
        /// <param name="format"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <param name="samples"></param>
        /// <param name="mips"></param>
        /// <param name="debugName"></param>
        void Create(ColorFormat format, int size, int samples, bool mips, string debugName)
        {
            bool msaa = samples > 1;

            CheckSamplesCount(samples);

            if (mips && samples > 1)
            {
                throw new ArgumentException("Render target should be multisampler either mipmapped");
            }

            SampleCount = samples;

            Format      = format;
            SampleCount = samples;
            Width       = size;
            Height      = size;
            Depth       = 1;
            MipCount    = mips ? ShaderResource.CalculateMipLevels(Width, Height) : 1;

            var texDesc = new Texture2DDescription();

            texDesc.Width             = Width;
            texDesc.Height            = Height;
            texDesc.ArraySize         = 6;
            texDesc.BindFlags         = BindFlags.RenderTarget | BindFlags.ShaderResource;
            texDesc.CpuAccessFlags    = CpuAccessFlags.None;
            texDesc.Format            = Converter.Convert(format);
            texDesc.MipLevels         = mips ? MipCount : 1;
            texDesc.OptionFlags       = ResourceOptionFlags.TextureCube | (mips ? ResourceOptionFlags.GenerateMipMaps : ResourceOptionFlags.None);
            texDesc.SampleDescription = new DXGI.SampleDescription(samples, 0);
            texDesc.Usage             = ResourceUsage.Default;


            texCube = new D3D.Texture2D(device.Device, texDesc);
            SRV     = new ShaderResourceView(device.Device, texCube);



            //
            //	Create surfaces :
            //
            surfaces = new RenderTargetSurface[MipCount, 6];

            for (int mip = 0; mip < MipCount; mip++)
            {
                int width  = GetMipSize(Width, mip);
                int height = GetMipSize(Height, mip);

                for (int face = 0; face < 6; face++)
                {
                    var rtvDesc = new RenderTargetViewDescription();
                    rtvDesc.Texture2DArray.MipSlice        = mip;
                    rtvDesc.Texture2DArray.FirstArraySlice = face;
                    rtvDesc.Texture2DArray.ArraySize       = 1;
                    rtvDesc.Dimension = msaa ? RenderTargetViewDimension.Texture2DMultisampledArray : RenderTargetViewDimension.Texture2DArray;
                    rtvDesc.Format    = Converter.Convert(format);

                    var rtv = new RenderTargetView(device.Device, texCube, rtvDesc);

                    int subResId = Resource.CalculateSubResourceIndex(mip, face, MipCount);

                    surfaces[mip, face] = new RenderTargetSurface(rtv, null, texCube, subResId, format, Width, Height, samples);
                }
            }
        }
예제 #27
0
        void CrateCubeMapResourses()
        {
            var textureDesc = new Texture2DDescription()
            {
                Format            = Format.R8G8B8A8_UNorm,
                Height            = this.Size,
                Width             = this.Size,
                ArraySize         = 6,
                BindFlags         = BindFlags.ShaderResource | BindFlags.RenderTarget,
                OptionFlags       = ResourceOptionFlags.GenerateMipMaps | ResourceOptionFlags.TextureCube,
                SampleDescription = new SampleDescription(1, 0),
                MipLevels         = 0,
                Usage             = ResourceUsage.Default,
                CpuAccessFlags    = CpuAccessFlags.None,
            };


            EnvMap  = new Texture2D(_dx11Device, textureDesc);
            EnvMap1 = new Texture2D(_dx11Device, textureDesc);

            var descSRV = new ShaderResourceViewDescription();

            descSRV.Format    = textureDesc.Format;
            descSRV.Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.TextureCube;
            descSRV.TextureCube.MostDetailedMip = 0;
            descSRV.TextureCube.MipLevels       = -1;

            EnvMapSRV  = new ShaderResourceView(_dx11Device, EnvMap, descSRV);
            EnvMapSRV1 = new ShaderResourceView(_dx11Device, EnvMap1, descSRV);

            var descRTV = new RenderTargetViewDescription();

            descRTV.Format    = textureDesc.Format;
            descRTV.Dimension = RenderTargetViewDimension.Texture2DArray;
            descRTV.Texture2DArray.MipSlice        = 0;
            descRTV.Texture2DArray.FirstArraySlice = 0;
            descRTV.Texture2DArray.ArraySize       = 6;

            EnvMapRTV  = new RenderTargetView(_dx11Device, EnvMap, descRTV);
            EnvMapRTV1 = new RenderTargetView(_dx11Device, EnvMap1, descRTV);

            using (var depth = new Texture2D(_dx11Device, new Texture2DDescription
            {
                Format = Format.D32_Float,
                BindFlags = BindFlags.DepthStencil,
                Height = Size,
                Width = Size,
                Usage = ResourceUsage.Default,
                SampleDescription = new SampleDescription(1, 0),
                CpuAccessFlags = CpuAccessFlags.None,
                MipLevels = 1,
                OptionFlags = ResourceOptionFlags.TextureCube,
                ArraySize = 6
            }))
            {
                var descDSV = new DepthStencilViewDescription();
                descDSV.Format    = depth.Description.Format;
                descDSV.Dimension = DepthStencilViewDimension.Texture2DArray;
                descDSV.Flags     = DepthStencilViewFlags.None;
                descDSV.Texture2DArray.MipSlice        = 0;
                descDSV.Texture2DArray.FirstArraySlice = 0;
                descDSV.Texture2DArray.ArraySize       = 6;

                EnvMapDSV = new DepthStencilView(_dx11Device, depth, descDSV);
            }

            Viewport = new Viewport(0, 0, Size, Size);
        }
예제 #28
0
        public void CreateRenderTargetView(DescriptorHeap target, uint descriptorHeapSlot, Resource resource, ref RenderTargetViewDescription description)
        {
            Assert.Debug(target.Desc.Type == DescriptorHeap.Descriptor.ResourceDescriptorType.RenderTarget, "Can create render target views only on render target descriptor heaps.");
            Assert.Debug(target.Desc.NumResourceDescriptors >= descriptorHeapSlot, "Descriptor heap does not have enought slots.");

            target.SetAssociatedResource(descriptorHeapSlot, resource);
            CreateRenderTargetViewImpl(target, descriptorHeapSlot, resource, ref description);
        }
예제 #29
0
        void CreateDeviceResources()
        {
            uint width = (uint) host.ActualWidth;
            uint height = (uint) host.ActualHeight;

            // If we don't have a device, need to create one now and all
            // accompanying D3D resources.
            CreateDevice();

            DXGIFactory dxgiFactory = DXGIFactory.CreateFactory();

            SwapChainDescription swapDesc = new SwapChainDescription();
            swapDesc.BufferDescription.Width = width;
            swapDesc.BufferDescription.Height = height;
            swapDesc.BufferDescription.Format = Format.R8G8B8A8_UNORM;
            swapDesc.BufferDescription.RefreshRate.Numerator = 60;
            swapDesc.BufferDescription.RefreshRate.Denominator = 1;
            swapDesc.SampleDescription.Count = 1;
            swapDesc.SampleDescription.Quality = 0;
            swapDesc.BufferUsage = UsageOption.RenderTargetOutput;
            swapDesc.BufferCount = 1;
            swapDesc.OutputWindowHandle = host.Handle;
            swapDesc.Windowed = true;

            swapChain = dxgiFactory.CreateSwapChain(
                device, swapDesc);

            // Create rasterizer state object
            RasterizerDescription rsDesc = new RasterizerDescription();
            rsDesc.AntialiasedLineEnable = false;
            rsDesc.CullMode = CullMode.None;
            rsDesc.DepthBias = 0;
            rsDesc.DepthBiasClamp = 0;
            rsDesc.DepthClipEnable = true;
            rsDesc.FillMode = D3D10.FillMode.Solid;
            rsDesc.FrontCounterClockwise = false; // Must be FALSE for 10on9
            rsDesc.MultisampleEnable = false;
            rsDesc.ScissorEnable = false;
            rsDesc.SlopeScaledDepthBias = 0;

            rasterizerState = device.CreateRasterizerState(
                rsDesc);

            device.RS.SetState(
                rasterizerState
                );

            // If we don't have a D2D render target, need to create all of the resources
            // required to render to one here.
            // Ensure that nobody is holding onto one of the old resources
            device.OM.SetRenderTargets(new RenderTargetView[] {null});

            InitializeDepthStencil(width, height);

            // Create views on the RT buffers and set them on the device
            RenderTargetViewDescription renderDesc = new RenderTargetViewDescription();
            renderDesc.Format = Format.R8G8B8A8_UNORM;
            renderDesc.ViewDimension = RenderTargetViewDimension.Texture2D;
            renderDesc.Texture2D.MipSlice = 0;

            using (D3DResource spBackBufferResource = swapChain.GetBuffer<D3DResource>(0))
            {
                renderTargetView = device.CreateRenderTargetView(
                    spBackBufferResource,
                    renderDesc);
            }

            device.OM.SetRenderTargets(new RenderTargetView[] {renderTargetView}, depthStencilView);

            SetViewport(width, height);


            // Create a D2D render target which can draw into the surface in the swap chain
            RenderTargetProperties props =
                new RenderTargetProperties(
                    RenderTargetType.Default, new PixelFormat(Format.Unknown, AlphaMode.Premultiplied),
                    96, 96, RenderTargetUsage.None, FeatureLevel.Default);

            // Allocate a offscreen D3D surface for D2D to render our 2D content into
            Texture2DDescription tex2DDescription;
            tex2DDescription.ArraySize = 1;
            tex2DDescription.BindFlags = BindFlag.RenderTarget | BindFlag.ShaderResource;
            tex2DDescription.CpuAccessFlags = CpuAccessFlag.Unspecified;
            tex2DDescription.Format = Format.R8G8B8A8_UNORM;
            tex2DDescription.Height = 4096;
            tex2DDescription.Width = 512;
            tex2DDescription.MipLevels = 1;
            tex2DDescription.MiscFlags = 0;
            tex2DDescription.SampleDescription.Count = 1;
            tex2DDescription.SampleDescription.Quality = 0;
            tex2DDescription.Usage = Usage.Default;

            offscreenTexture = device.CreateTexture2D(tex2DDescription);

            using (Surface dxgiSurface = offscreenTexture.GetDXGISurface())
            {
                // Create a D2D render target which can draw into our offscreen D3D surface
                renderTarget = d2DFactory.CreateDxgiSurfaceRenderTarget(
                    dxgiSurface,
                    props);
            }

            PixelFormat alphaOnlyFormat = new PixelFormat(Format.A8_UNORM, AlphaMode.Premultiplied);

            opacityRenderTarget = renderTarget.CreateCompatibleRenderTarget(CompatibleRenderTargetOptions.None,
                                                                            alphaOnlyFormat);

            // Load pixel shader
            // Open precompiled vertex shader
            // This file was compiled using DirectX's SDK Shader compilation tool: 
            // fxc.exe /T fx_4_0 /Fo SciFiText.fxo SciFiText.fx
            shader = LoadResourceShader(device, "SciFiTextDemo.SciFiText.fxo");

            // Obtain the technique
            technique = shader.GetTechniqueByName("Render");

            // Obtain the variables
            worldMatrixVariable = shader.GetVariableByName("World").AsMatrix();
            viewMatrixVariable = shader.GetVariableByName("View").AsMatrix();
            projectionMarixVariable = shader.GetVariableByName("Projection").AsMatrix();
            diffuseVariable = shader.GetVariableByName("txDiffuse").AsShaderResource();

            // Create the input layout
            PassDescription passDesc = new PassDescription();
            passDesc = technique.GetPassByIndex(0).Description;

            vertexLayout = device.CreateInputLayout(
                inputLayoutDescriptions,
                passDesc.InputAssemblerInputSignature,
                passDesc.InputAssemblerInputSignatureSize
                );

            // Set the input layout
            device.IA.SetInputLayout(
                vertexLayout
                );

            IntPtr verticesDataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(VertexArray.VerticesInstance));
            Marshal.StructureToPtr(VertexArray.VerticesInstance, verticesDataPtr, true);

            BufferDescription bd = new BufferDescription();
            bd.Usage = Usage.Default;
            bd.ByteWidth = (uint) Marshal.SizeOf(VertexArray.VerticesInstance);
            bd.BindFlags = BindFlag.VertexBuffer;
            bd.CpuAccessFlags = CpuAccessFlag.Unspecified;
            bd.MiscFlags = ResourceMiscFlag.Undefined;

            SubresourceData InitData = new SubresourceData()
                                           {
                                               SysMem = verticesDataPtr
                                           };


            vertexBuffer = device.CreateBuffer(
                bd,
                InitData
                );

            Marshal.FreeHGlobal(verticesDataPtr);

            // Set vertex buffer
            uint stride = (uint) Marshal.SizeOf(typeof (SimpleVertex));
            uint offset = 0;

            device.IA.SetVertexBuffers(
                0,
                new D3DBuffer[] {vertexBuffer},
                new uint[] {stride},
                new uint[] {offset}
                );

            IntPtr indicesDataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(VertexArray.IndicesInstance));
            Marshal.StructureToPtr(VertexArray.IndicesInstance, indicesDataPtr, true);

            bd.Usage = Usage.Default;
            bd.ByteWidth = (uint) Marshal.SizeOf(VertexArray.IndicesInstance);
            bd.BindFlags = BindFlag.IndexBuffer;
            bd.CpuAccessFlags = 0;
            bd.MiscFlags = 0;

            InitData.SysMem = indicesDataPtr;

            facesIndexBuffer = device.CreateBuffer(
                bd,
                InitData
                );

            Marshal.FreeHGlobal(indicesDataPtr);

            // Set primitive topology
            device.IA.SetPrimitiveTopology(PrimitiveTopology.TriangleList);

            // Convert the D2D texture into a Shader Resource View
            textureResourceView = device.CreateShaderResourceView(
                offscreenTexture);

            // Initialize the world matrices
            worldMatrix = Matrix4x4F.Identity;

            // Initialize the view matrix
            Vector3F Eye = new Vector3F(0.0f, 0.0f, 13.0f);
            Vector3F At = new Vector3F(0.0f, -3.5f, 45.0f);
            Vector3F Up = new Vector3F(0.0f, 1.0f, 0.0f);

            viewMatrix = Camera.MatrixLookAtLH(Eye, At, Up);

            // Initialize the projection matrix
            projectionMatrix = Camera.MatrixPerspectiveFovLH(
                (float) Math.PI*0.1f,
                width/(float) height,
                0.1f,
                100.0f);

            // Update Variables that never change
            viewMatrixVariable.Matrix = viewMatrix;

            projectionMarixVariable.Matrix = projectionMatrix;

            GradientStop[] gradientStops =
                {
                    new GradientStop(0.0f, new ColorF(Colors.Yellow)),
                    new GradientStop(1.0f, new ColorF(Colors.Black))
                };

            GradientStopCollection spGradientStopCollection = renderTarget.CreateGradientStopCollection(
                gradientStops,
                Gamma.Gamma_22,
                ExtendMode.Clamp);

            // Create a linear gradient brush for text
            textBrush = renderTarget.CreateLinearGradientBrush(
                new LinearGradientBrushProperties(new Point2F(0, 0), new Point2F(0, -2048)),
                spGradientStopCollection
                );
        }
예제 #30
0
 protected abstract void CreateRenderTargetViewImpl(DescriptorHeap target, uint descriptorHeapSlot, Resource resource, ref RenderTargetViewDescription description);
예제 #31
0
        private void CreateSliceViews(Device device, Format format)
        {
            RenderTargetViewDescription rtd = new RenderTargetViewDescription()
            {
                ArraySize = 1,
                Dimension = RenderTargetViewDimension.Texture2DArray,
                Format = format
            };

            ShaderResourceViewDescription srvd = new ShaderResourceViewDescription()
            {
                ArraySize = 1,
                Dimension = ShaderResourceViewDimension.Texture2DArray,
                Format = format,
                MipLevels = 1,
                MostDetailedMip = 0
            };

            for (int i = 0; i < 6; i++)
            {
                rtd.FirstArraySlice = i;
                srvd.FirstArraySlice = i;

                this.FaceRTVs[i] = new RenderTargetView(device, this.Resource, rtd);
                this.FaceSRVs[i] = new ShaderResourceView(device, this.Resource, srvd);
            }
        }
예제 #32
0
        public void CreateDeviceDependentResources()
        {
            var device = Resources.D3DDevice;

            MeshColor = ToDispose(new Texture2D(device, new Texture2DDescription()
            {
                Width             = Resolution,
                Height            = Resolution,
                ArraySize         = 1,
                CpuAccessFlags    = CpuAccessFlags.Read,
                BindFlags         = BindFlags.RenderTarget | BindFlags.ShaderResource,
                Format            = SharpDX.DXGI.Format.R8G8B8A8_UNorm,
                Usage             = ResourceUsage.Default,
                OptionFlags       = ResourceOptionFlags.None,
                MipLevels         = 1,
                SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0)
            }));

            MeshQualityAndTime = ToDispose(new Texture2D(device, new Texture2DDescription()
            {
                Width             = Resolution,
                Height            = Resolution,
                ArraySize         = 1,
                CpuAccessFlags    = CpuAccessFlags.None,
                BindFlags         = BindFlags.RenderTarget | BindFlags.ShaderResource,
                Format            = SharpDX.DXGI.Format.R16G16_Float,
                Usage             = ResourceUsage.Default,
                OptionFlags       = ResourceOptionFlags.None,
                MipLevels         = 1,
                SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0)
            }));

            var colorRenderTargetViewDescription = new RenderTargetViewDescription()
            {
                Format    = MeshColor.Description.Format,
                Dimension = RenderTargetViewDimension.Texture2D
            };

            colorRenderTargetViewDescription.Texture2D.MipSlice = 0;
            RenderColorView = ToDispose(new RenderTargetView(device, MeshColor, colorRenderTargetViewDescription));

            var qualityAndTimeRenderTargetViewDescription = new RenderTargetViewDescription()
            {
                Format    = MeshQualityAndTime.Description.Format,
                Dimension = RenderTargetViewDimension.Texture2D
            };

            qualityAndTimeRenderTargetViewDescription.Texture2D.MipSlice = 0;
            RenderQualityAndTimeView = ToDispose(new RenderTargetView(device, MeshQualityAndTime, qualityAndTimeRenderTargetViewDescription));

            var colorShaderResourceViewDescription = new ShaderResourceViewDescription()
            {
                Format    = MeshColor.Description.Format,
                Dimension = ShaderResourceViewDimension.Texture2D
            };

            colorShaderResourceViewDescription.Texture2D.MipLevels       = -1;
            colorShaderResourceViewDescription.Texture2D.MostDetailedMip = 0;
            ColorResourceView = ToDispose(new ShaderResourceView(device, MeshColor, colorShaderResourceViewDescription));

            var qualityAndTimeShaderResourceViewDescription = new ShaderResourceViewDescription()
            {
                Format    = MeshQualityAndTime.Description.Format,
                Dimension = ShaderResourceViewDimension.Texture2D
            };

            qualityAndTimeShaderResourceViewDescription.Texture2D.MipLevels       = -1;
            qualityAndTimeShaderResourceViewDescription.Texture2D.MostDetailedMip = 0;
            QualityAndTimeResourceView = ToDispose(new ShaderResourceView(device, MeshQualityAndTime, qualityAndTimeShaderResourceViewDescription));
        }
예제 #33
0
        protected override void CreateDeviceDependentResources()
        {
            RemoveAndDispose(ref DSSRV);
            RemoveAndDispose(ref DSV);
            RemoveAndDispose(ref DS0);

            RTs.ForEach(rt => RemoveAndDispose(ref rt));
            SRVs.ForEach(srv => RemoveAndDispose(ref srv));
            RTVs.ForEach(rtv => RemoveAndDispose(ref rtv));
            RTs.Clear();
            SRVs.Clear();
            RTVs.Clear();

            var device = DeviceManager.Direct3DDevice;

            bool isMSAA = sampleDescription.Count > 1;

            // Render Target texture description
            var texDesc = new Texture2DDescription();

            texDesc.BindFlags         = BindFlags.ShaderResource | BindFlags.RenderTarget;
            texDesc.ArraySize         = 1;
            texDesc.CpuAccessFlags    = CpuAccessFlags.None;
            texDesc.Usage             = ResourceUsage.Default;
            texDesc.Width             = width;
            texDesc.Height            = height;
            texDesc.MipLevels         = 1; // No mip levels
            texDesc.SampleDescription = sampleDescription;

            // Render Target View description
            var rtvDesc = new RenderTargetViewDescription();

            rtvDesc.Dimension          = isMSAA ? RenderTargetViewDimension.Texture2DMultisampled : RenderTargetViewDimension.Texture2D;
            rtvDesc.Texture2D.MipSlice = 0;

            // SRV description for render targets
            var srvDesc = new ShaderResourceViewDescription();

            srvDesc.Dimension                 = isMSAA ? SharpDX.Direct3D.ShaderResourceViewDimension.Texture2DMultisampled : SharpDX.Direct3D.ShaderResourceViewDimension.Texture2D;
            srvDesc.Texture2D.MipLevels       = -1;
            srvDesc.Texture2D.MostDetailedMip = 0;

            // Create Render Targets (with SRV and RTV)
            foreach (var format in RTFormats)
            {
                texDesc.Format = format;
                srvDesc.Format = format;
                rtvDesc.Format = format;

                RTs.Add(ToDispose(new Texture2D(device, texDesc)));
                SRVs.Add(ToDispose(new ShaderResourceView(device, RTs.Last(), srvDesc)));
                RTVs.Add(ToDispose(new RenderTargetView(device, RTs.Last(), rtvDesc)));

                RTs.Last().DebugName  = String.Format("RT{0}_{1}", RTs.Count, format);
                SRVs.Last().DebugName = String.Format("SRV{0}_{1}", RTs.Count, format);
                RTVs.Last().DebugName = String.Format("RTV{0}_{1}", RTs.Count, format);
            }

            // Create Depth/Stencil
            texDesc.BindFlags = BindFlags.ShaderResource | BindFlags.DepthStencil;
            texDesc.Format    = SharpDX.DXGI.Format.R32G8X24_Typeless; // typeless so we can use as shader resource
            DS0           = ToDispose(new Texture2D(device, texDesc));
            DS0.DebugName = "DS0";

            srvDesc.Format  = SharpDX.DXGI.Format.R32_Float_X8X24_Typeless;
            DSSRV           = ToDispose(new ShaderResourceView(device, DS0, srvDesc));
            DSSRV.DebugName = "DSSRV-DepthStencil";

            // Depth Stencil View
            var dsvDesc = new DepthStencilViewDescription();

            dsvDesc.Flags              = DepthStencilViewFlags.None;
            dsvDesc.Dimension          = isMSAA ? DepthStencilViewDimension.Texture2DMultisampled : DepthStencilViewDimension.Texture2D;
            dsvDesc.Format             = SharpDX.DXGI.Format.D32_Float_S8X24_UInt;
            dsvDesc.Texture2D.MipSlice = 0;

            DSV           = ToDispose(new DepthStencilView(device, DS0, dsvDesc));
            DSV.DebugName = "DSV0";
        }
예제 #34
0
        /// <summary>Gets the render target view.</summary>
        /// <param name="viewType">Type of the view.</param>
        /// <param name="arrayOrDepthSlice">The array original depth slice.</param>
        /// <param name="mipIndex">Index of the mip.</param>
        /// <returns>TextureView.</returns>
        /// <exception cref="System.NotSupportedException">ViewSlice.MipBand is not supported for render targets</exception>
        internal override TextureView GetRenderTargetView(ViewType viewType, int arrayOrDepthSlice, int mipIndex)
        {
            if ((this.Description.BindFlags & BindFlags.RenderTarget) == 0)
            {
                return(null);
            }

            if (viewType == ViewType.MipBand)
            {
                throw new NotSupportedException("ViewSlice.MipBand is not supported for render targets");
            }

            int arrayCount;
            int mipCount;

            GetViewSliceBounds(viewType, ref arrayOrDepthSlice, ref mipIndex, out arrayCount, out mipCount);

            var rtvIndex = GetViewIndex(viewType, arrayOrDepthSlice, mipIndex);

            lock (this.renderTargetViews)
            {
                var rtv = this.renderTargetViews[rtvIndex];

                // Creates the shader resource view
                if (rtv == null)
                {
                    // Create the render target view
                    var rtvDescription = new RenderTargetViewDescription()
                    {
                        Format = this.Description.Format
                    };

                    if (this.Description.ArraySize > 1)
                    {
                        rtvDescription.Dimension = this.Description.SampleDescription.Count > 1 ? RenderTargetViewDimension.Texture2DMultisampledArray : RenderTargetViewDimension.Texture2DArray;
                        if (this.Description.SampleDescription.Count > 1)
                        {
                            rtvDescription.Texture2DMSArray.ArraySize       = arrayCount;
                            rtvDescription.Texture2DMSArray.FirstArraySlice = arrayOrDepthSlice;
                        }
                        else
                        {
                            rtvDescription.Texture2DArray.ArraySize       = arrayCount;
                            rtvDescription.Texture2DArray.FirstArraySlice = arrayOrDepthSlice;
                            rtvDescription.Texture2DArray.MipSlice        = mipIndex;
                        }
                    }
                    else
                    {
                        rtvDescription.Dimension = this.Description.SampleDescription.Count > 1 ? RenderTargetViewDimension.Texture2DMultisampled : RenderTargetViewDimension.Texture2D;
                        if (this.Description.SampleDescription.Count <= 1)
                        {
                            rtvDescription.Texture2D.MipSlice = mipIndex;
                        }
                    }

                    rtv = new TextureView(this, new RenderTargetView(GraphicsDevice, Resource, rtvDescription));
                    this.renderTargetViews[rtvIndex] = ToDispose(rtv);
                }

                return(rtv);
            }
        }
예제 #35
0
        private void LoadArraySlices(bool rtvFlag, bool srvFlag, bool dsvFlag)
        {
            var arraySize = NativeTexture.Description.ArraySize;
            var cubemap   = NativeTexture.Description.OptionFlags.HasFlag(ResourceOptionFlags.TextureCube);

            if (cubemap)
            {
                if (rtvFlag)
                {
                    RtvArraySlices.Add(new RenderTargetView(Renderer.Device, _nativeTexture));
                }
                if (srvFlag)
                {
                    SrvArraySlices.Add(new ShaderResourceView(Renderer.Device, _nativeTexture));
                }
                if (dsvFlag)
                {
                    throw new ArgumentException();
                }
                return;
            }

            if (rtvFlag)
            {
                var format = NativeTexture.Description.Format;

                switch (format)
                {
                case Format.R32_Typeless:
                    format = Format.R32_Float;
                    break;

                case Format.R24G8_Typeless:
                case Format.R24_UNorm_X8_Typeless:
                    format = Format.R24_UNorm_X8_Typeless;
                    break;
                }

                for (int i = 0; i < arraySize; i++)
                {
                    var rtvDesc = new RenderTargetViewDescription {
                        Format = format
                    };

                    if (arraySize == 1)
                    {
                        rtvDesc.Dimension          = RenderTargetViewDimension.Texture2D;
                        rtvDesc.Texture2D.MipSlice = 0;
                    }
                    else
                    {
                        rtvDesc.Dimension = RenderTargetViewDimension.Texture2DArray;
                        rtvDesc.Texture2DArray.ArraySize       = 1;
                        rtvDesc.Texture2DArray.FirstArraySlice = i;
                        rtvDesc.Texture2DArray.MipSlice        = 0;
                    }

                    var rtv = new RenderTargetView(Renderer.Device, NativeTexture, rtvDesc)
                    {
                        Tag = this, DebugName = Name
                    };

                    RtvArraySlices.Add(rtv);
                }
            }

            if (srvFlag)
            {
                var format = NativeTexture.Description.Format;

                switch (format)
                {
                case Format.R32_Typeless:
                    format = Format.R32_Float;
                    break;

                case Format.R24_UNorm_X8_Typeless:
                case Format.R24G8_Typeless:
                    format = Format.R24_UNorm_X8_Typeless;
                    break;
                }

                for (int i = 0; i < arraySize; i++)
                {
                    var srvDesc = new ShaderResourceViewDescription {
                        Format = format
                    };

                    if (arraySize == 1)
                    {
                        srvDesc.Dimension                 = ShaderResourceViewDimension.Texture2D;
                        srvDesc.Texture2D.MipLevels       = -1;
                        srvDesc.Texture2D.MostDetailedMip = 0;
                    }
                    else
                    {
                        srvDesc.Dimension = ShaderResourceViewDimension.Texture2DArray;
                        srvDesc.Texture2DArray.ArraySize       = 1;
                        srvDesc.Texture2DArray.FirstArraySlice = i;
                        srvDesc.Texture2DArray.MipLevels       = -1;
                        srvDesc.Texture2DArray.MostDetailedMip = 0;
                    }

                    var srv = new ShaderResourceView(Renderer.Device, NativeTexture, srvDesc)
                    {
                        Tag = this, DebugName = Name
                    };

                    SrvArraySlices.Add(srv);
                }
            }

            if (dsvFlag)
            {
                for (int i = 0; i < arraySize; i++)
                {
                    var format = NativeTexture.Description.Format;

                    switch (format)
                    {
                    case Format.R32_Typeless:
                        format = Format.D32_Float;
                        break;

                    case Format.R24G8_Typeless:
                    case Format.R24_UNorm_X8_Typeless:
                        format = Format.D24_UNorm_S8_UInt;
                        break;
                    }

                    var dsvDesc = new DepthStencilViewDescription {
                        Format = format
                    };

                    if (arraySize == 1)
                    {
                        dsvDesc.Dimension          = DepthStencilViewDimension.Texture2D;
                        dsvDesc.Texture2D.MipSlice = 0;
                    }
                    else
                    {
                        dsvDesc.Dimension = DepthStencilViewDimension.Texture2DArray;
                        dsvDesc.Texture2DArray.ArraySize       = 1;
                        dsvDesc.Texture2DArray.FirstArraySlice = i;
                        dsvDesc.Texture2DArray.MipSlice        = 0;
                    }

                    var dsv = new DepthStencilView(Renderer.Device, NativeTexture, dsvDesc)
                    {
                        Tag = this, DebugName = Name
                    };

                    DsvArraySlices.Add(dsv);
                }
            }
        }
예제 #36
0
        /// <summary>
        /// Initializes a new instance of the <see cref="RenderTargetCube"/> class.
        /// </summary>
        /// <param name="graphicsDevice">The graphics device.</param>
        /// <param name="size">The width and height of a texture cube face in pixels.</param>
        /// <param name="mipMap"><see langword="true"/> to generate a full mipmap chain; otherwise <see langword="false"/>.</param>
        /// <param name="preferredFormat">The preferred format of the surface.</param>
        /// <param name="preferredDepthFormat">The preferred format of the depth-stencil buffer.</param>
        /// <param name="preferredMultiSampleCount">The preferred number of multisample locations.</param>
        /// <param name="usage">The usage mode of the render target.</param>
        public RenderTargetCube(GraphicsDevice graphicsDevice, int size, bool mipMap, SurfaceFormat preferredFormat, DepthFormat preferredDepthFormat, int preferredMultiSampleCount, RenderTargetUsage usage)
            : base(graphicsDevice, size, mipMap, preferredFormat, true)
        {
            DepthStencilFormat = preferredDepthFormat;
            MultiSampleCount   = preferredMultiSampleCount;
            RenderTargetUsage  = usage;

#if DIRECTX
            // Create one render target view per cube map face.
            _renderTargetViews = new RenderTargetView[6];
            for (int i = 0; i < _renderTargetViews.Length; i++)
            {
                var renderTargetViewDescription = new RenderTargetViewDescription
                {
                    Dimension      = RenderTargetViewDimension.Texture2DArray,
                    Format         = SharpDXHelper.ToFormat(preferredFormat),
                    Texture2DArray =
                    {
                        ArraySize       = 1,
                        FirstArraySlice = i,
                        MipSlice        = 0
                    }
                };

                _renderTargetViews[i] = new RenderTargetView(graphicsDevice._d3dDevice, GetTexture(), renderTargetViewDescription);
            }

            // If we don't need a depth buffer then we're done.
            if (preferredDepthFormat == DepthFormat.None)
            {
                return;
            }

            var sampleDescription = new SampleDescription(1, 0);
            if (preferredMultiSampleCount > 1)
            {
                sampleDescription.Count   = preferredMultiSampleCount;
                sampleDescription.Quality = (int)StandardMultisampleQualityLevels.StandardMultisamplePattern;
            }

            var depthStencilDescription = new Texture2DDescription
            {
                Format            = SharpDXHelper.ToFormat(preferredDepthFormat),
                ArraySize         = 1,
                MipLevels         = 1,
                Width             = size,
                Height            = size,
                SampleDescription = sampleDescription,
                BindFlags         = BindFlags.DepthStencil,
            };

            using (var depthBuffer = new SharpDX.Direct3D11.Texture2D(graphicsDevice._d3dDevice, depthStencilDescription))
            {
                var depthStencilViewDescription = new DepthStencilViewDescription
                {
                    Dimension = DepthStencilViewDimension.Texture2D,
                    Format    = SharpDXHelper.ToFormat(preferredDepthFormat),
                };
                _depthStencilView = new DepthStencilView(graphicsDevice._d3dDevice, depthBuffer, depthStencilViewDescription);
            }
#else
            throw new NotImplementedException();
#endif
        }
예제 #37
0
        private void EnsureOutputBuffers()
        {
            if (SharedTexture == null ||
                SharedTexture.Description.Width != ClientWidth ||
                SharedTexture.Description.Height != ClientHeight)
            {
                if (SharedTexture != null)
                {
                    SharedTexture.Dispose();
                    SharedTexture = null;
                }

                var colordesc = new Texture2DDescription
                {
                    BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource,
                    Format = Format.B8G8R8A8_UNorm,
                    Width = ClientWidth,
                    Height = ClientHeight,
                    MipLevels = 1,
                    SampleDescription = new SampleDescription(1, 0),
                    Usage = ResourceUsage.Default,
                    OptionFlags = ResourceOptionFlags.Shared, // needed for D3DImage
                    CpuAccessFlags = CpuAccessFlags.None,
                    ArraySize = 1
                };

                if (_dxRenderView != null)
                {
                    _dxRenderView.Dispose();
                    _dxRenderView = null;
                }

                SharedTexture = new Texture2D(_dxDevice, colordesc);

                var descRtv = new RenderTargetViewDescription();
                if (colordesc.SampleDescription.Count > 1)
                    descRtv.Dimension = RenderTargetViewDimension.Texture2DMultisampled;
                else
                    descRtv.Dimension = RenderTargetViewDimension.Texture2D;

                _dxRenderView = new RenderTargetView(_dxDevice, SharedTexture, descRtv);
            }

            if (DepthTexture == null ||
                DepthTexture.Description.Width != ClientWidth ||
                DepthTexture.Description.Height != ClientHeight)
            {
                if (DepthTexture != null)
                {
                    DepthTexture.Dispose();
                    DepthTexture = null;
                }

                var depthDesc = new Texture2DDescription
                                    {
                                        BindFlags = BindFlags.DepthStencil,
                                        Format = Format.D32_Float_S8X24_UInt,
                                        Width = ClientWidth,
                                        Height = ClientHeight,
                                        MipLevels = 1,
                                        SampleDescription = new SampleDescription(1, 0), // not using multisampling
                                        Usage = ResourceUsage.Default,
                                        OptionFlags = ResourceOptionFlags.None,
                                        CpuAccessFlags = CpuAccessFlags.None,
                                        ArraySize = 1
                                    };

                // create depth texture
                DepthTexture = new Texture2D(_dxDevice, depthDesc);

                if (_dxDepthStencilView != null)
                {
                    _dxDepthStencilView.Dispose();
                    _dxDepthStencilView = null;
                }

                var descDsv = new DepthStencilViewDescription();
                descDsv.Format = depthDesc.Format;
                if (depthDesc.SampleDescription.Count > 1)
                {
                    descDsv.Dimension = DepthStencilViewDimension.Texture2DMultisampled;
                }
                else
                {
                    descDsv.Dimension = DepthStencilViewDimension.Texture2D;
                }
                descDsv.MipSlice = 0;

                // create depth/stencil view
                _dxDepthStencilView = new DepthStencilView(_dxDevice, DepthTexture, descDsv);
            }
        }
예제 #38
0
        public D3D11Framebuffer(Device device, ref FramebufferDescription description)
            : base(description.DepthTarget, description.ColorTargets)
        {
            if (description.DepthTarget != null)
            {
                D3D11Texture d3dDepthTarget         = Util.AssertSubtype <Texture, D3D11Texture>(description.DepthTarget.Value.Target);
                DepthStencilViewDescription dsvDesc = new DepthStencilViewDescription()
                {
                    Format = D3D11Formats.GetDepthFormat(d3dDepthTarget.Format),
                };
                if (d3dDepthTarget.ArrayLayers == 1)
                {
                    if (d3dDepthTarget.SampleCount == TextureSampleCount.Count1)
                    {
                        dsvDesc.Dimension = DepthStencilViewDimension.Texture2D;
                    }
                    else
                    {
                        dsvDesc.Dimension = DepthStencilViewDimension.Texture2DMultisampled;
                    }
                }
                else
                {
                    if (d3dDepthTarget.SampleCount == TextureSampleCount.Count1)
                    {
                        dsvDesc.Dimension = DepthStencilViewDimension.Texture2DArray;
                        dsvDesc.Texture2DArray.FirstArraySlice = (int)description.DepthTarget.Value.ArrayLayer;
                        dsvDesc.Texture2DArray.ArraySize       = 1;
                    }
                    else
                    {
                        dsvDesc.Dimension = DepthStencilViewDimension.Texture2DMultisampledArray;
                        dsvDesc.Texture2DMSArray.FirstArraySlice = (int)description.DepthTarget.Value.ArrayLayer;
                        dsvDesc.Texture2DMSArray.ArraySize       = 1;
                    }
                }

                DepthStencilView = new DepthStencilView(device, d3dDepthTarget.DeviceTexture, dsvDesc);
            }

            if (description.ColorTargets != null && description.ColorTargets.Length > 0)
            {
                RenderTargetViews = new RenderTargetView[description.ColorTargets.Length];
                for (int i = 0; i < RenderTargetViews.Length; i++)
                {
                    D3D11Texture d3dColorTarget         = Util.AssertSubtype <Texture, D3D11Texture>(description.ColorTargets[i].Target);
                    RenderTargetViewDescription rtvDesc = new RenderTargetViewDescription
                    {
                        Format = D3D11Formats.ToDxgiFormat(d3dColorTarget.Format, false),
                    };
                    if (d3dColorTarget.ArrayLayers == 1)
                    {
                        if (d3dColorTarget.SampleCount == TextureSampleCount.Count1)
                        {
                            rtvDesc.Dimension = RenderTargetViewDimension.Texture2D;
                        }
                        else
                        {
                            rtvDesc.Dimension = RenderTargetViewDimension.Texture2DMultisampled;
                        }
                    }
                    else
                    {
                        if (d3dColorTarget.SampleCount == TextureSampleCount.Count1)
                        {
                            rtvDesc.Dimension      = RenderTargetViewDimension.Texture2DArray;
                            rtvDesc.Texture2DArray = new RenderTargetViewDescription.Texture2DArrayResource
                            {
                                ArraySize       = 1,
                                FirstArraySlice = (int)description.ColorTargets[i].ArrayLayer
                            };
                        }
                        else
                        {
                            rtvDesc.Dimension        = RenderTargetViewDimension.Texture2DMultisampledArray;
                            rtvDesc.Texture2DMSArray = new RenderTargetViewDescription.Texture2DMultisampledArrayResource
                            {
                                ArraySize       = 1,
                                FirstArraySlice = (int)description.ColorTargets[i].ArrayLayer
                            };
                        }
                    }
                    RenderTargetViews[i] = new RenderTargetView(device, d3dColorTarget.DeviceTexture, rtvDesc);
                }
            }
            else
            {
                RenderTargetViews = Array.Empty <RenderTargetView>();
            }
        }
예제 #39
0
        public bool Initialize(Device device, int _width, int _height)
        {
            try
            {
                // Initialize and set up the render target description.
                var textureDesc = new Texture2DDescription()
                {
                    Width = _width,
                    Height = _height,
                    MipLevels = 1,
                    ArraySize = 1,
                    Format = Format.R32G32B32A32_Float,
                    SampleDescription = new SampleDescription(1, 0),
                    Usage = ResourceUsage.Default,
                    BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource,
                    CpuAccessFlags = CpuAccessFlags.None,
                    OptionFlags = ResourceOptionFlags.None
                };
                /*
                var exttextureDesc = new Texture2DDescription()
                {
                    Width = _width,
                    Height = _height,
                    MipLevels = 1,
                    ArraySize = 1,
                    Format = Format.R8G8B8A8_UNorm,
                    SampleDescription = new SampleDescription(1, 0),
                    Usage = ResourceUsage.Staging,
                    BindFlags = BindFlags.None,
                    CpuAccessFlags = CpuAccessFlags.Write | CpuAccessFlags.Read,
                    OptionFlags = ResourceOptionFlags.Shared,

                };
                 * */

                // Create the render target texture.
                texRenderTargetTexture = new Texture2D(device, textureDesc);
                //extRenderTargetTexture = new Texture2D(device, exttextureDesc);

                // Initialize and setup the render target view
                var renderTargetViewDesc = new RenderTargetViewDescription()
                {
                    Format = textureDesc.Format,
                    Dimension = RenderTargetViewDimension.Texture2D,
                };
                renderTargetViewDesc.Texture2D.MipSlice = 0;

                // Create the render target view.
                texRenderTargetView = new RenderTargetView(device, texRenderTargetTexture, renderTargetViewDesc);
                texRenderTargetView.DebugName = "text";

                // Initialize and setup the shader resource view
                var shaderResourceViewDesc = new ShaderResourceViewDescription()
                {
                    Format = textureDesc.Format,
                    Dimension = ShaderResourceViewDimension.Texture2D,
                };
                shaderResourceViewDesc.Texture2D.MipLevels = 1;
                shaderResourceViewDesc.Texture2D.MostDetailedMip = 0;

                // Create the shader resource view.
                ShaderResourceView = new ShaderResourceView(device, texRenderTargetTexture, shaderResourceViewDesc);
                return true;
            }
            catch(Exception ex)
            {
                return false;
            }
        }
예제 #40
0
        /// <summary>
        /// Initializes a new instance of the <see cref="RenderTargetCube"/> class.
        /// </summary>
        /// <param name="graphicsDevice">The graphics device.</param>
        /// <param name="size">The width and height of a texture cube face in pixels.</param>
        /// <param name="mipMap"><see langword="true"/> to generate a full mipmap chain; otherwise <see langword="false"/>.</param>
        /// <param name="preferredFormat">The preferred format of the surface.</param>
        /// <param name="preferredDepthFormat">The preferred format of the depth-stencil buffer.</param>
        /// <param name="preferredMultiSampleCount">The preferred number of multisample locations.</param>
        /// <param name="usage">The usage mode of the render target.</param>
        public RenderTargetCube(GraphicsDevice graphicsDevice, int size, bool mipMap, SurfaceFormat preferredFormat, DepthFormat preferredDepthFormat, int preferredMultiSampleCount, RenderTargetUsage usage)
            : base(graphicsDevice, size, mipMap, preferredFormat, true)
        {
            DepthStencilFormat = preferredDepthFormat;
            MultiSampleCount = preferredMultiSampleCount;
            RenderTargetUsage = usage;

#if DIRECTX
            // Create one render target view per cube map face.
            _renderTargetViews = new RenderTargetView[6];
            for (int i = 0; i < _renderTargetViews.Length; i++)
            {
                var renderTargetViewDescription = new RenderTargetViewDescription
                {
                    Dimension = RenderTargetViewDimension.Texture2DArray,
                    Format = SharpDXHelper.ToFormat(preferredFormat),
                    Texture2DArray =
                    {
                        ArraySize = 1,
                        FirstArraySlice = i,
                        MipSlice = 0
                    }
                };

                _renderTargetViews[i] = new RenderTargetView(graphicsDevice._d3dDevice, _texture, renderTargetViewDescription);
            }

            // If we don't need a depth buffer then we're done.
            if (preferredDepthFormat == DepthFormat.None)
                return;

            var sampleDescription = new SampleDescription(1, 0);
            if (preferredMultiSampleCount > 1)
            {
                sampleDescription.Count = preferredMultiSampleCount;
                sampleDescription.Quality = (int)StandardMultisampleQualityLevels.StandardMultisamplePattern;
            }

            var depthStencilDescription = new Texture2DDescription
            {
                Format = SharpDXHelper.ToFormat(preferredDepthFormat),
                ArraySize = 1,
                MipLevels = 1,
                Width = size,
                Height = size,
                SampleDescription = sampleDescription,
                BindFlags = BindFlags.DepthStencil,
            };

            using (var depthBuffer = new SharpDX.Direct3D11.Texture2D(graphicsDevice._d3dDevice, depthStencilDescription))
            {
                var depthStencilViewDescription = new DepthStencilViewDescription
                {
                    Dimension = DepthStencilViewDimension.Texture2D,
                    Format = SharpDXHelper.ToFormat(preferredDepthFormat),
                };
                _depthStencilView = new DepthStencilView(graphicsDevice._d3dDevice, depthBuffer, depthStencilViewDescription);
            }
#else
            throw new NotImplementedException();
#endif            
        }
        protected override void CreateDeviceDependentResources()
        {
            RemoveAndDispose(ref DSSRV);
            RemoveAndDispose(ref DSV);
            RemoveAndDispose(ref DS0);

            RTs.ForEach(rt => RemoveAndDispose(ref rt));
            SRVs.ForEach(srv => RemoveAndDispose(ref srv));
            RTVs.ForEach(rtv => RemoveAndDispose(ref rtv));
            RTs.Clear();
            SRVs.Clear();
            RTVs.Clear();

            var device = DeviceManager.Direct3DDevice;

            bool isMSAA = sampleDescription.Count > 1;

            // Render Target texture description
            var texDesc = new Texture2DDescription();
            texDesc.BindFlags = BindFlags.ShaderResource | BindFlags.RenderTarget;
            texDesc.ArraySize = 1;
            texDesc.CpuAccessFlags = CpuAccessFlags.None;
            texDesc.Usage = ResourceUsage.Default;
            texDesc.Width = width;
            texDesc.Height = height;
            texDesc.MipLevels = 1; // No mip levels
            texDesc.SampleDescription = sampleDescription;

            // Render Target View description
            var rtvDesc = new RenderTargetViewDescription();
            rtvDesc.Dimension = isMSAA ? RenderTargetViewDimension.Texture2DMultisampled : RenderTargetViewDimension.Texture2D;
            rtvDesc.Texture2D.MipSlice = 0;

            // SRV description for render targets
            var srvDesc = new ShaderResourceViewDescription();
            srvDesc.Dimension = isMSAA ? SharpDX.Direct3D.ShaderResourceViewDimension.Texture2DMultisampled : SharpDX.Direct3D.ShaderResourceViewDimension.Texture2D;
            srvDesc.Texture2D.MipLevels = -1;
            srvDesc.Texture2D.MostDetailedMip = 0;

            // Create Render Targets (with SRV and RTV)
            foreach (var format in RTFormats)
            {
                texDesc.Format = format;
                srvDesc.Format = format;
                rtvDesc.Format = format;

                RTs.Add(ToDispose(new Texture2D(device, texDesc)));
                SRVs.Add(ToDispose(new ShaderResourceView(device, RTs.Last(), srvDesc)));
                RTVs.Add(ToDispose(new RenderTargetView(device, RTs.Last(), rtvDesc)));

                RTs.Last().DebugName = String.Format("RT{0}_{1}", RTs.Count, format);
                SRVs.Last().DebugName = String.Format("SRV{0}_{1}", RTs.Count, format);
                RTVs.Last().DebugName = String.Format("RTV{0}_{1}", RTs.Count, format);
            }

            // Create Depth/Stencil
            texDesc.BindFlags = BindFlags.ShaderResource | BindFlags.DepthStencil;
            texDesc.Format = SharpDX.DXGI.Format.R32G8X24_Typeless; // typeless so we can use as shader resource
            DS0 = ToDispose(new Texture2D(device, texDesc));
            DS0.DebugName = "DS0";

            srvDesc.Format = SharpDX.DXGI.Format.R32_Float_X8X24_Typeless;
            DSSRV = ToDispose(new ShaderResourceView(device, DS0, srvDesc));
            DSSRV.DebugName = "DSSRV-DepthStencil";

            // Depth Stencil View
            var dsvDesc = new DepthStencilViewDescription();
            dsvDesc.Flags = DepthStencilViewFlags.None;
            dsvDesc.Dimension = isMSAA ? DepthStencilViewDimension.Texture2DMultisampled : DepthStencilViewDimension.Texture2D;
            dsvDesc.Format = SharpDX.DXGI.Format.D32_Float_S8X24_UInt;
            dsvDesc.Texture2D.MipSlice = 0;

            DSV = ToDispose(new DepthStencilView(device, DS0, dsvDesc));
            DSV.DebugName = "DSV0";
        }
예제 #42
0
        public void Initialize()
        {
            LoadSky(0);

            Texture2DDescription descTex = new Texture2DDescription();
            descTex.ArraySize = 6;
            descTex.Width = Size;
            descTex.Height = Size;
            descTex.Usage = ResourceUsage.Default;
            descTex.CpuAccessFlags = CpuAccessFlags.None;
            descTex.Format = SharpDX.DXGI.Format.R8G8B8A8_UNorm;
            descTex.SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0);
            descTex.MipLevels = MipLevel;
            descTex.BindFlags = BindFlags.ShaderResource | BindFlags.RenderTarget;
            descTex.OptionFlags = ResourceOptionFlags.GenerateMipMaps | ResourceOptionFlags.TextureCube;

            //Create the texture and shader view
            CubeTexture = new Texture2D(ModelViewer.Program.device, descTex);
            CubeSRV = new ShaderResourceView(ModelViewer.Program.device, CubeTexture);

            RenderTargetViewDescription RTVD = new RenderTargetViewDescription();
            RTVD.Format = descTex.Format;
            RTVD.Dimension = RenderTargetViewDimension.Texture2DArray;
            RTVD.Texture2DArray.FirstArraySlice = 0;
            RTVD.Texture2DArray.ArraySize = 1;
            RTVD.Texture2DArray.MipSlice = 0;

            CubeRenderTarget = new RenderTargetView[6];

            for (int i = 0; i < 6; i++)
            {
                RTVD.Texture2DArray.FirstArraySlice = i;
                CubeRenderTarget[i] = new RenderTargetView(ModelViewer.Program.device, CubeTexture, RTVD);
            }

            SamplerStateDescription a = new SamplerStateDescription();
            a.AddressU = TextureAddressMode.Clamp;
            a.AddressV = TextureAddressMode.Clamp;
            a.AddressW = TextureAddressMode.Clamp;
            a.Filter = Filter.MinMagMipLinear;
            SSWrapMipLinear = new SamplerState(ModelViewer.Program.device, a);

            MContains = new MeshContainer();
            MContains.BytesPerVertex = 20;
            MContains.FaceCount = 12;
            MContains.VertexsCount = 24;

            Vector3 vExtents = new Vector3(500, 500, 500);

            var vertices = new DataStream(MContains.BytesPerVertex * MContains.VertexsCount, true, true);

            //Back
            vertices.Write(new Vector3(-vExtents.X, -vExtents.Y, vExtents.Z));
            vertices.Write(new Vector2(1, 1));
            vertices.Write(new Vector3(-vExtents.X, vExtents.Y, vExtents.Z));
            vertices.Write(new Vector2(1, 0));
            vertices.Write(new Vector3(vExtents.X, vExtents.Y, vExtents.Z));
            vertices.Write(new Vector2(0, 0));
            vertices.Write(new Vector3(vExtents.X, -vExtents.Y, vExtents.Z));
            vertices.Write(new Vector2(0, 1));
            //Front
            vertices.Write(new Vector3(vExtents.X, -vExtents.Y, -vExtents.Z));
            vertices.Write(new Vector2(1, 1));
            vertices.Write(new Vector3(vExtents.X, vExtents.Y, -vExtents.Z));
            vertices.Write(new Vector2(1, 0));
            vertices.Write(new Vector3(-vExtents.X, vExtents.Y, -vExtents.Z));
            vertices.Write(new Vector2(0, 0));
            vertices.Write(new Vector3(-vExtents.X, -vExtents.Y, -vExtents.Z));
            vertices.Write(new Vector2(0, 1));
            //Bottom
            vertices.Write(new Vector3(-vExtents.X, -vExtents.Y, -vExtents.Z));
            vertices.Write(new Vector2(0, 0));
            vertices.Write(new Vector3(-vExtents.X, -vExtents.Y, vExtents.Z));
            vertices.Write(new Vector2(0, 1));
            vertices.Write(new Vector3(vExtents.X, -vExtents.Y, vExtents.Z));
            vertices.Write(new Vector2(1, 1));
            vertices.Write(new Vector3(vExtents.X, -vExtents.Y, -vExtents.Z));
            vertices.Write(new Vector2(1, 0));
            //Top
            vertices.Write(new Vector3(vExtents.X, vExtents.Y, -vExtents.Z));
            vertices.Write(new Vector2(1, 1));
            vertices.Write(new Vector3(vExtents.X, vExtents.Y, vExtents.Z));
            vertices.Write(new Vector2(1, 0));
            vertices.Write(new Vector3(-vExtents.X, vExtents.Y, vExtents.Z));
            vertices.Write(new Vector2(0, 0));
            vertices.Write(new Vector3(-vExtents.X, vExtents.Y, -vExtents.Z));
            vertices.Write(new Vector2(0, 1));
            //Left
            vertices.Write(new Vector3(-vExtents.X, vExtents.Y, -vExtents.Z));
            vertices.Write(new Vector2(1, 0));
            vertices.Write(new Vector3(-vExtents.X, vExtents.Y, vExtents.Z));
            vertices.Write(new Vector2(0, 0));
            vertices.Write(new Vector3(-vExtents.X, -vExtents.Y, vExtents.Z));
            vertices.Write(new Vector2(0, 1));
            vertices.Write(new Vector3(-vExtents.X, -vExtents.Y, -vExtents.Z));
            vertices.Write(new Vector2(1, 1));
            //Right
            vertices.Write(new Vector3(vExtents.X, -vExtents.Y, -vExtents.Z));
            vertices.Write(new Vector2(0, 1));
            vertices.Write(new Vector3(vExtents.X, -vExtents.Y, vExtents.Z));
            vertices.Write(new Vector2(1, 1));
            vertices.Write(new Vector3(vExtents.X, vExtents.Y, vExtents.Z));
            vertices.Write(new Vector2(1, 0));
            vertices.Write(new Vector3(vExtents.X, vExtents.Y, -vExtents.Z));
            vertices.Write(new Vector2(0, 0));

            vertices.Position = 0;
            InputElement[] elements11 = new[] {
                new InputElement("POSITION", 0, SharpDX.DXGI.Format.R32G32B32_Float, 0, 0) ,
                new InputElement("TEXCOORD", 0, SharpDX.DXGI.Format.R32G32_Float, 12, 0)};

            MContains.Vertexs = new Buffer(ModelViewer.Program.device, vertices, MContains.BytesPerVertex * MContains.VertexsCount, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);

            var indices = new DataStream(4 * MContains.FaceCount * 3, true, true);
            for (int x = 0; x < 6; x++)
            {
                indices.Write((int)(x * 4 + 0));
                indices.Write((int)(x * 4 + 1));
                indices.Write((int)(x * 4 + 2));

                indices.Write((int)(x * 4 + 2));
                indices.Write((int)(x * 4 + 3));
                indices.Write((int)(x * 4 + 0));
            }
            indices.Position = 0;

            MContains.Indices = new Buffer(ModelViewer.Program.device, indices, 4 * MContains.FaceCount * 3, ResourceUsage.Default, BindFlags.IndexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
            MContains.binding = new VertexBufferBinding(MContains.Vertexs, MContains.BytesPerVertex, 0);

            EEEM = ContentManager.LoadEffect("Content/Shaders/SkyBox", elements11);

            // Подготовка константного буффера
            BufferDescription bd = new BufferDescription();
            bd.SizeInBytes = Marshal.SizeOf(typeof(SkyShaderConstants));
            bd.Usage = ResourceUsage.Dynamic;
            bd.BindFlags = BindFlags.ConstantBuffer;
            bd.CpuAccessFlags = CpuAccessFlags.Write;
            bd.OptionFlags = ResourceOptionFlags.None;
            bd.StructureByteStride = 0;

            SkyConstantsBuffer = new Buffer(ModelViewer.Program.device, bd);
            SSC = new SkyShaderConstants();
        }
예제 #43
0
        // has 6 rtv subresources and mipLevels * 6 srv/uav subresources
        internal static RwTexId CreateCubemap(int resolution, Format resourceFormat, string debugName = null)
        {
            int mipLevels = 1;
            while ((resolution >> mipLevels) > 0)
            {
                ++mipLevels;
            }

            var desc = new Texture2DDescription
            {
                ArraySize = 6,
                BindFlags = BindFlags.ShaderResource | BindFlags.RenderTarget | BindFlags.UnorderedAccess,
                CpuAccessFlags = CpuAccessFlags.None,
                Format = resourceFormat,
                MipLevels = mipLevels,
                Usage = ResourceUsage.Default,
                Width = resolution,
                Height = resolution,
                OptionFlags = ResourceOptionFlags.TextureCube,
                SampleDescription = new SampleDescription(1, 0)
            };

            var handle = new RwTexId { Index = Textures.Allocate() };
            Textures.Data[handle.Index] = new MyRwTextureInfo { Description2D = desc };
            Textures.Data[handle.Index].Resource = new Texture2D(MyRender11.Device, desc);

            var res = Textures.Data[handle.Index].Resource;
            Srvs[handle] = new MySrvInfo { Description = null, View = new ShaderResourceView(MyRender11.Device, Textures.Data[handle.Index].Resource) };
            Index.Add(handle);

            var srvDesc = new ShaderResourceViewDescription();
            srvDesc.Dimension = ShaderResourceViewDimension.Texture2DArray;
            srvDesc.Format = resourceFormat;
            srvDesc.Texture2DArray.MipLevels = 1;
            srvDesc.Texture2DArray.ArraySize = 1;

            var uavDesc = new UnorderedAccessViewDescription();
            uavDesc.Dimension = UnorderedAccessViewDimension.Texture2DArray;
            uavDesc.Format = resourceFormat;
            uavDesc.Texture2DArray.ArraySize = 1;

            for (int m = 0; m < mipLevels; ++m)
            {
                for (int i = 0; i < 6; i++)
                {
                    var subresource = i * mipLevels + m;

                    srvDesc.Texture2DArray.FirstArraySlice = i;
                    srvDesc.Texture2DArray.MostDetailedMip = m;

                    SubresourceSrvs[new MySubresourceId { Id = handle, Subresource = subresource }] = new MySrvInfo
                    {
                        Description = srvDesc,
                        View = new ShaderResourceView(MyRender11.Device, res, srvDesc)
                    };

                    uavDesc.Texture2DArray.FirstArraySlice = i;
                    uavDesc.Texture2DArray.MipSlice = m;

                    SubresourceUavs[new MySubresourceId { Id = handle, Subresource = subresource }] = new MyUavInfo
                    {
                        Description = uavDesc,
                        View = new UnorderedAccessView(MyRender11.Device, res, uavDesc)
                    };
                }
            }

            var rtvDesc = new RenderTargetViewDescription();
            rtvDesc.Dimension = RenderTargetViewDimension.Texture2DArray;
            rtvDesc.Format = resourceFormat;
            for (int i = 0; i < 6; i++)
            {
                rtvDesc.Texture2DArray.MipSlice = 0;

                rtvDesc.Texture2DArray.FirstArraySlice = i;
                rtvDesc.Texture2DArray.ArraySize = 1;

                SubresourceRtvs[new MySubresourceId { Id = handle, Subresource = i }] = new MyRtvInfo
                {
                    Description = rtvDesc,
                    View = new RenderTargetView(MyRender11.Device, res, rtvDesc)
                };
            }
                

            return handle;
        }
예제 #44
0
        protected virtual void CreateSizeDependentResources(object sender, RenderEventArgs renderBase)
        {
            var d3dDevice  = deviceManager.DeviceDirect3D;
            var d3dContext = deviceManager.ContextDirect3D;
            var d2dContext = deviceManager.ContextDirect2D;

            d2dContext.Target = null;
            RemoveAndDispose(ref renderTargetView);
            RemoveAndDispose(ref depthStencilView);
            RemoveAndDispose(ref bitmapTarget);
            RemoveAndDispose(ref backBuffer);

            // If the swap chain already exists, resize it.
            if (swapChain != null)
            {
                swapChain.ResizeBuffers(2, Width, Height, SharpDX.DXGI.Format.B8G8R8A8_UNorm, SharpDX.DXGI.SwapChainFlags.None);
            }

            // Otherwise, create a new one.
            else
            {
                // SwapChain description
                var desc = CreateSwapChainDescription();

                // Once the desired swap chain description is configured, it must be created on the
                // same adapter as our D3D Device

                // First, retrieve the underlying DXGI Device from the D3D Device. Creates the swap
                // chain
                using (var dxgiDevice2 = d3dDevice.QueryInterface <SharpDX.DXGI.Device2>())
                    using (var dxgiAdapter = dxgiDevice2.Adapter)
                        using (var dxgiFactory2 = dxgiAdapter.GetParent <SharpDX.DXGI.Factory2>())
                        {
                            swapChain = ToDispose(CreateSwapChain(dxgiFactory2, d3dDevice, desc));
                            swapChain.ResizeBuffers(2, deviceManager.Settings.ScreenWidth,
                                                    deviceManager.Settings.ScreenHeight, desc.Format, desc.Flags);

                            // Ensure that DXGI does not queue more than one frame at a time. This both
                            // reduces latency and ensures that the application will only render after each
                            // VSync, minimizing power consumption.
                            dxgiDevice2.MaximumFrameLatency = 1;
                        }
            }

            // Obtain the backbuffer for this window which will be the final 3D rendertarget.
            backBuffer = ToDispose(SharpDX.Direct3D11.Texture2D.FromSwapChain <SharpDX.Direct3D11.Texture2D>(swapChain, 0));
            {
                RenderTargetViewDescription rtvDescription = new RenderTargetViewDescription()
                {
                    Dimension      = RenderTargetViewDimension.Texture2DArray,
                    Format         = SharpDX.DXGI.Format.B8G8R8A8_UNorm,
                    Texture2DArray = new RenderTargetViewDescription.Texture2DArrayResource()
                    {
                        MipSlice = 0, FirstArraySlice = 0, ArraySize = 1
                    }
                };

                // Create a view interface on the rendertarget to use on bind.
                renderTargetView = ToDispose(new SharpDX.Direct3D11.RenderTargetView(d3dDevice, BackBuffer, rtvDescription));

                if (IsStereoEnabled)
                {
                    RenderTargetViewDescription rtvDescriptionRight = new RenderTargetViewDescription()
                    {
                        Dimension      = RenderTargetViewDimension.Texture2DArray,
                        Format         = SharpDX.DXGI.Format.B8G8R8A8_UNorm,
                        Texture2DArray = new RenderTargetViewDescription.Texture2DArrayResource()
                        {
                            MipSlice = 0, FirstArraySlice = 1, ArraySize = 1
                        }
                    };

                    renderTargetViewRight = ToDispose(new SharpDX.Direct3D11.RenderTargetView(d3dDevice, BackBuffer, rtvDescriptionRight));
                }

                // Cache the rendertarget dimensions in our helper class for convenient use.
                var backBufferDesc = BackBuffer.Description;
                RenderTargetBounds = new Rectangle(0, 0, backBufferDesc.Width, backBufferDesc.Height);
            }

            // Create a descriptor for the depth/stencil buffer. Allocate a 2-D surface as the
            // depth/stencil buffer. Create a DepthStencil view on this surface to use on bind.
            using (var depthBuffer = new SharpDX.Direct3D11.Texture2D(d3dDevice, new SharpDX.Direct3D11.Texture2DDescription()
            {
                Format = SharpDX.DXGI.Format.D24_UNorm_S8_UInt,
                ArraySize = 1,
                MipLevels = 1,
                Width = (int)RenderTargetSize.Width,
                Height = (int)RenderTargetSize.Height,
                SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
                BindFlags = SharpDX.Direct3D11.BindFlags.DepthStencil,
            }))
                depthStencilView = ToDispose(new SharpDX.Direct3D11.DepthStencilView(d3dDevice, depthBuffer,
                                                                                     new SharpDX.Direct3D11.DepthStencilViewDescription()
                {
                    Dimension = SharpDX.Direct3D11.DepthStencilViewDimension.Texture2D
                }));

            // Create a viewport descriptor of the full window size.
            var viewport = new SharpDX.ViewportF((float)RenderTargetBounds.X, (float)RenderTargetBounds.Y, (float)RenderTargetBounds.Width, (float)RenderTargetBounds.Height, 0.0f, 1.0f);

            // Set the current viewport using the descriptor.
            d3dContext.Rasterizer.SetViewport(viewport);

            // Now we set up the Direct2D render target bitmap linked to the swapchain. Whenever we
            // render to this bitmap, it will be directly rendered to the swapchain associated with
            // the window.
            var bitmapProperties = new SharpDX.Direct2D1.BitmapProperties1(
                new SharpDX.Direct2D1.PixelFormat(SharpDX.DXGI.Format.B8G8R8A8_UNorm, SharpDX.Direct2D1.AlphaMode.Premultiplied),
                deviceManager.Dpi,
                deviceManager.Dpi,
                SharpDX.Direct2D1.BitmapOptions.Target | SharpDX.Direct2D1.BitmapOptions.CannotDraw);

            // Direct2D needs the dxgi version of the backbuffer surface pointer. Get a D2D surface
            // from the DXGI back buffer to use as the D2D render target.
            if (IsStereoEnabled)
            {
                using (var dxgiBackBuffer = swapChain.GetBackBuffer <SharpDX.DXGI.Resource1>(0))
                {
                    using (var dxgiSurface = new Surface2(dxgiBackBuffer, 0))
                        bitmapTarget = ToDispose(new SharpDX.Direct2D1.Bitmap1(d2dContext, dxgiSurface, bitmapProperties));
                    using (var dxgiSurface = new Surface2(dxgiBackBuffer, 1))
                        bitmapTargetRight = ToDispose(new SharpDX.Direct2D1.Bitmap1(d2dContext, dxgiSurface, bitmapProperties));
                }
            }
            else
            {
                using (var dxgiBackBuffer = swapChain.GetBackBuffer <SharpDX.DXGI.Surface2>(0))
                    bitmapTarget = ToDispose(new SharpDX.Direct2D1.Bitmap1(d2dContext, dxgiBackBuffer, bitmapProperties));
            }
            // So now we can set the Direct2D render target.
            d2dContext.Target = BitmapTarget;

            // Set D2D text anti-alias mode to Grayscale to ensure proper rendering of text on
            // intermediate surfaces.
            d2dContext.TextAntialiasMode = SharpDX.Direct2D1.TextAntialiasMode.Grayscale;
        }
예제 #45
0
        public DynamicCubemap(int cubemapsize)
        {
            CubeMapSize = cubemapsize;

            // On commence par initialiser la description de la texture qui sera mise
            // à jour par cette classe
            TextureDescription = new Texture2DDescription()
            {
                Width             = CubeMapSize,
                Height            = CubeMapSize,
                MipLevels         = 0,
                ArraySize         = 6,          // Comme on cherche à créer une cubemap, ArraySize est à 6
                Format            = Format.R32G32B32A32_Float,
                Usage             = ResourceUsage.Default,
                BindFlags         = BindFlags.ShaderResource | BindFlags.RenderTarget,
                CpuAccessFlags    = CpuAccessFlags.None,
                OptionFlags       = ResourceOptionFlags.GenerateMipMaps | ResourceOptionFlags.TextureCube,
                SampleDescription = new SampleDescription
                {
                    Count   = 1,
                    Quality = 0
                }
            };

            //Création de la texture
            Texture = new Texture2D
                      (
                ApplicationDX11.Instance.Device,
                TextureDescription
                      );

            // Création d'un renderTargetDescription qui sera utilisé
            // par tout les autres RenderTargetView
            RenderTargetViewDescription rtvDesc = new RenderTargetViewDescription()
            {
                Format         = TextureDescription.Format,
                Dimension      = RenderTargetViewDimension.Texture2DArray,
                Texture2DArray = new RenderTargetViewDescription.Texture2DArrayResource()
                {
                    MipSlice  = 0,
                    ArraySize = 1,
                }
            };

            // Initialisation des 6 renderTargetView
            for (int i = 0; i < 6; i++)
            {
                // On utilise FirstArraySlice pour préciser sur quel "Slice", ou Texture,
                // on se trouve
                rtvDesc.Texture2DArray.FirstArraySlice = i;
                RenderTargetViews.Add(new RenderTargetView(ApplicationDX11.Instance.Device, Texture, rtvDesc));
            }

            // Initialisation du ShaderResourceView
            ShaderResourceViewDescription SRVDescription = new ShaderResourceViewDescription()
            {
                Format    = TextureDescription.Format,
                Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.TextureCube,
                Texture2D = new ShaderResourceViewDescription.Texture2DResource()
                {
                    MipLevels       = 1,
                    MostDetailedMip = 0
                }
            };

            SRV = new ShaderResourceView(ApplicationDX11.Instance.Device, Texture, SRVDescription);

            // Création des renderTarget

            foreach (RenderTargetView view in RenderTargetViews)
            {
                RenderTargets.Add(new RenderTarget(view, CubeMapSize, CubeMapSize));
            }

            // Création de la transformation

            Transform = new Transform();

            // Création des caméras

            for (int i = 0; i < 6; i++)
            {
                Entity entity = new Entity();
                Camera cam    = entity.AddComponent <Camera>();

                cam.Initialize(new FrustumProjection(3.141592f / 2.0f, 1.0f, 0.1f, 1000.0f));
                cam.SetViewport(0, 0, CubeMapSize, cubemapsize);
                Cameras.Add(cam);
            }

            // Right Camera

            Cameras[0].m_transform.LookAt(new Vector3(1.0f, 0.0f, 0.0F), Transform.position_);

            // Left Camera

            Cameras[1].m_transform.LookAt(new Vector3(-1.0f, 0.0f, 0.0F), Transform.position_);

            // Up Camera

            Cameras[2].m_transform.LookAt(Vector3.Up + new Vector3(0.0f, 0.0f, 0.00001f), Transform.position_);

            // Down Camera

            Cameras[3].m_transform.LookAt(Vector3.Down + new Vector3(0.0f, 0.0f, 0.00001f), Transform.position_);

            // Forward Camera

            Cameras[4].m_transform.LookAt(Vector3.ForwardLH, Transform.position_);

            // Backward Camera

            Cameras[5].m_transform.LookAt(Vector3.BackwardLH, Transform.position_);

            ApplicationDX11.Instance.Cubemaps.Add(this);
        }
예제 #46
0
 /// <summary>
 ///   Creates a <see cref = "T:SharpDX.Direct3D11.RenderTargetView" /> for accessing resource data.
 /// </summary>
 /// <param name = "device">The device to use when creating this <see cref = "T:SharpDX.Direct3D11.RenderTargetView" />.</param>
 /// <param name = "resource">The resource that represents the render-target surface. This surface must have been created with the <see cref = "T:SharpDX.Direct3D11.BindFlags">RenderTarget</see> flag.</param>
 /// <param name = "description">A structure describing the <see cref = "T:SharpDX.Direct3D11.RenderTargetView" /> to be created.</param>
 /// <unmanaged>ID3D11Device::CreateRenderTargetView</unmanaged>
 public RenderTargetView(Device device, Resource resource, RenderTargetViewDescription description)
     : base(IntPtr.Zero)
 {
     device.CreateRenderTargetView(resource, description, this);
 }
        private void UpdateEyeProperties()
        {
            var cameraResources = this.deviceResources.cameraResourcesDictionary.Values.FirstOrDefault();
            if (cameraResources != null)
            {
                int newWidth = (int)cameraResources.RenderTargetSize.Width;
                int newHeight = (int)cameraResources.RenderTargetSize.Height;

                var adapter = this.Adapter as Adapter.Adapter;

                if (newWidth != adapter.Width || newHeight != adapter.Height)
                {
                    adapter.SetSize(newWidth, newHeight);
                    RenderTargetManager renderTargetManager = this.Adapter.Graphics.RenderTargetManager as RenderTargetManager;

                    DepthTexture depthTexture = renderTargetManager.CreateDepthTexture(newWidth, newHeight);

                    this.eyeTextures = new VREyeTexture[cameraResources.IsRenderingStereoscopic ? 2 : 1];

                    for (int i = 0; i < this.eyeTextures.Length; i++)
                    {
                        RenderTargetViewDescription rtViewDescription = new RenderTargetViewDescription()
                        {
                            Format = cameraResources.BackBufferTexture2D.Description.Format,
                            Dimension = RenderTargetViewDimension.Texture2DArray,
                            Texture2DArray = new RenderTargetViewDescription.Texture2DArrayResource()
                            {
                                FirstArraySlice = i,
                                ArraySize = 1,
                                MipSlice = 0
                            }
                        };

                        var renderTarget = renderTargetManager.CreateRenderTarget(cameraResources.BackBufferTexture2D, rtViewDescription);
                        renderTarget.DepthTexture = depthTexture;

                        VREyeTexture eyeTexture = new VREyeTexture()
                        {
                            Viewport = new Viewport(0, 0, 1, 1),
                            NearPlane = 0.01f,
                            FarPlane = 1000,
                            RenderTarget = renderTarget
                        };

                        this.eyeTextures[i] = eyeTexture;
                    }

                    var dxRT = renderTargetManager.TargetFromHandle<DXRenderTarget>(this.EyeTextures[0].RenderTarget.TextureHandle);
                    adapter.GraphicsDevice.BackBuffer = dxRT.TargetView;
                }
            }
        }
예제 #48
0
        // ReSharper disable once FunctionComplexityOverflow
        public void Resize(int width, int height, bool bgra)
        {
            if (Texture != null)
                Texture.Dispose();

            if (Native != null)
                Native.Dispose();

            var texDesc = new Texture2DDescription
            {
                ArraySize = 1,
                BindFlags = BindFlags.RenderTarget,
                CpuAccessFlags = CpuAccessFlags.None,
                Format = bgra ? SharpDX.DXGI.Format.B8G8R8A8_UNorm : SharpDX.DXGI.Format.R8G8B8A8_UNorm,
                Height = height,
                MipLevels = 1,
                OptionFlags = ResourceOptionFlags.None,
                SampleDescription = mContext.Multisampling,
                Usage = ResourceUsage.Default,
                Width = width
            };

            Texture = new Texture2D(mContext.Device, texDesc);

            var rtvd = new RenderTargetViewDescription
            {
                Dimension = RenderTargetViewDimension.Texture2DMultisampled,
                Format = texDesc.Format,

                Texture2DMS = new RenderTargetViewDescription.Texture2DMultisampledResource()
            };

            Native = new RenderTargetView(mContext.Device, Texture, rtvd);

            if (mDepthTexture != null)
                mDepthTexture.Dispose();

            if (mDepthView != null)
                mDepthView.Dispose();

            texDesc = new Texture2DDescription
            {
                ArraySize = 1,
                BindFlags = BindFlags.DepthStencil,
                CpuAccessFlags = CpuAccessFlags.None,
                Format = SharpDX.DXGI.Format.D24_UNorm_S8_UInt,
                Height = height,
                MipLevels = 1,
                OptionFlags = ResourceOptionFlags.None,
                SampleDescription = mContext.Multisampling,
                Usage = ResourceUsage.Default,
                Width = width
            };

            mDepthTexture = new Texture2D(mContext.Device, texDesc);

            var dsvd = new DepthStencilViewDescription
            {
                Dimension = DepthStencilViewDimension.Texture2DMultisampled,
                Flags = DepthStencilViewFlags.None,
                Format = SharpDX.DXGI.Format.D24_UNorm_S8_UInt,
                Texture2DMS = new DepthStencilViewDescription.Texture2DMultisampledResource()
            };

            mDepthView = new DepthStencilView(mContext.Device, mDepthTexture, dsvd);
        }
예제 #49
0
        private void Update(EvaluationContext context)
        {
            var updateLive = UpdateLive.GetValue(context);

            if (_updatedOnce && !updateLive)
            {
                FilteredCubeMap.Value = _prefilteredCubeMap;
                return;
            }

            //ConstantBuffers.GetValues(ref _constantBuffers, context);
            ShaderResources.GetValues(ref _shaderResourceViews, context);
            SamplerStates.GetValues(ref _samplerStates, context);
            var vs = VertexShader.GetValue(context);
            var gs = GeometryShader.GetValue(context);

            if (CubeMap.IsConnected && CubeMap.DirtyFlag.IsDirty)
            {
                //Log.Debug("Dirty");
            }

            var cubeMapSrc = CubeMap.GetValue(context); // Needs to be checked for null!

            if (cubeMapSrc == null)
            {
                FilteredCubeMap.Value = null;
                return;
            }



            var device        = ResourceManager.Instance().Device;
            var deviceContext = device.ImmediateContext;


            // Vertex shader stage
            var vsStage = deviceContext.VertexShader;

            _prevVsConstantBuffers     = vsStage.GetConstantBuffers(0, 1);
            _prevVsShaderResourceViews = vsStage.GetShaderResources(0, _shaderResourceViews.Length);
            _prevVertexShader          = vsStage.Get();

            if (vs == null)
            {
                Log.Warning($"{nameof(_SpecularPrefilter)} requires valid vertex shader", SymbolChildId);
                return;
            }
            vsStage.Set(vs);
            vsStage.SetShaderResources(0, _shaderResourceViews.Length, _shaderResourceViews);

            // Geometry shader stage
            var gsStage = deviceContext.GeometryShader;

            _prevGsConstantBuffers     = gsStage.GetConstantBuffers(0, 1);
            _prevGsShaderResourceViews = gsStage.GetShaderResources(0, _shaderResourceViews.Length);
            _prevGeometryShader        = gsStage.Get();

            if (gs == null)
            {
                Log.Warning($"{nameof(_SpecularPrefilter)} requires valid geometry shader", SymbolChildId);
                return;
            }

            gsStage.Set(gs);
            gsStage.SetShaderResources(0, _shaderResourceViews.Length, _shaderResourceViews);

            // Pixel shader stage
            var psStage = deviceContext.PixelShader;

            _prevPixelShader           = psStage.Get();
            _prevPsConstantBuffers     = psStage.GetConstantBuffers(0, 1);
            _prevPsShaderResourceViews = psStage.GetShaderResources(0, _shaderResourceViews.Length);
            _prevPsSamplerStates       = psStage.GetSamplers(0, _samplerStates.Length);

            var ps = PixelShader.GetValue(context);

            if (ps == null)
            {
                Log.Warning($"{nameof(_SpecularPrefilter)} requires valid pixel shader", SymbolChildId);
                return;
            }
            psStage.Set(ps);
            psStage.SetShaderResources(0, _shaderResourceViews.Length, _shaderResourceViews);
            psStage.SetSamplers(0, _samplerStates);


            // if (_prefilteredCubeMap != null && !Changed)
            // {
            //     context.Image = _prefilteredCubeMap;
            //     return context;
            // }

            Vector2 cubeMapSize = new Vector2(cubeMapSrc.Description.Width, cubeMapSrc.Description.Height);
            // Log.Debug($"source size: {cubeMapSrc.Description.Width} num mips in src: {cubeMapSrc.Description.MipLevels}");

            // if ( _prefilteredCubeMap == null )
            // {
            var cubeMapDesc = new Texture2DDescription
            {
                BindFlags         = BindFlags.ShaderResource | BindFlags.RenderTarget,
                Format            = cubeMapSrc.Description.Format,
                Width             = (int)cubeMapSize.X,
                Height            = (int)cubeMapSize.Y,
                MipLevels         = cubeMapSrc.Description.MipLevels,
                SampleDescription = cubeMapSrc.Description.SampleDescription,
                Usage             = ResourceUsage.Default,
                OptionFlags       = ResourceOptionFlags.TextureCube | ResourceOptionFlags.GenerateMipMaps,
                CpuAccessFlags    = CpuAccessFlags.None,
                ArraySize         = 6
            };

            Utilities.Dispose(ref _prefilteredCubeMap);
            try
            {
                _prefilteredCubeMap = new Texture2D(device, cubeMapDesc);
            }
            catch (SharpDXException e)
            {
                Log.Debug($"can't create CubeMap target {e.Message}");
                return;
            }

            var rastDesc = new RasterizerStateDescription
            {
                FillMode           = FillMode.Solid,
                CullMode           = CullMode.None,
                IsDepthClipEnabled = false
            };

            _rasterizerState = new RasterizerState(device, rastDesc);

            // Input Assembler
            var previousTopology = device.ImmediateContext.InputAssembler.PrimitiveTopology;

            device.ImmediateContext.InputAssembler.PrimitiveTopology = SharpDX.Direct3D.PrimitiveTopology.TriangleList;

            _prevBlendState = device.ImmediateContext.OutputMerger.GetBlendState(out _prevBlendFactor, out _prevSampleMask);
            device.ImmediateContext.OutputMerger.BlendState        = DefaultRenderingStates.DisabledBlendState;
            device.ImmediateContext.OutputMerger.DepthStencilState = DefaultRenderingStates.DisabledDepthStencilState;

            _prevRenderTargetViews = device.ImmediateContext.OutputMerger.GetRenderTargets(1);
            device.ImmediateContext.OutputMerger.GetRenderTargets(out _prevDepthStencilView);

            var rtvDesc = new RenderTargetViewDescription()
            {
                Dimension      = RenderTargetViewDimension.Texture2DArray,
                Format         = cubeMapSrc.Description.Format,
                Texture2DArray = new RenderTargetViewDescription.Texture2DArrayResource()
                {
                    ArraySize       = 6,
                    FirstArraySlice = 0,
                    MipSlice        = 0
                }
            };

            int size = _prefilteredCubeMap.Description.Width;

            _prevViewports = device.ImmediateContext.Rasterizer.GetViewports <RawViewportF>();

            device.ImmediateContext.Rasterizer.State = _rasterizerState;

            int numMipLevels = _prefilteredCubeMap.Description.MipLevels;
            int mipSlice     = 0;

            while (mipSlice < numMipLevels)
            {
                // Log.Debug($"Update mipmap level {mipSlice} size: {size}");
                var viewport = new RawViewportF {
                    X = 0, Y = 0, Width = size, Height = size, MinDepth = 0, MaxDepth = 1
                };
                device.ImmediateContext.Rasterizer.SetViewports(new[] { viewport });


                Utilities.Dispose(ref _cubeMapRtv);
                rtvDesc.Texture2DArray.MipSlice = mipSlice;
                _cubeMapRtv = new RenderTargetView(device, _prefilteredCubeMap, rtvDesc);
                device.ImmediateContext.OutputMerger.SetTargets(_cubeMapRtv, null);

                var roughness = (float)mipSlice / (_prefilteredCubeMap.Description.MipLevels - 1);

                // Is this required?
                if (_settingsBuffer != null)
                {
                    Utilities.Dispose(ref _settingsBuffer);
                }

                for (int i = 0; i < _samplingParameters.Length; ++i)
                {
                    int indexToUse = -1;
                    if (Math.Abs(roughness - _samplingParameters[i].roughness) < 0.001f)
                    {
                        indexToUse = i;
                    }

                    if (indexToUse == -1 && roughness < _samplingParameters[i].roughness)
                    {
                        indexToUse = i - 1;
                    }

                    if (indexToUse != -1)
                    {
                        var param = _samplingParameters[indexToUse];
                        param.roughness = roughness;
                        ResourceManager.Instance().SetupConstBuffer(param, ref _settingsBuffer);
                        break;
                    }
                }

                var constantBuffers = new[] { _settingsBuffer };
                psStage.SetConstantBuffers(0, 1, constantBuffers);
                vsStage.SetConstantBuffers(0, 1, constantBuffers);
                gsStage.SetConstantBuffers(0, 1, constantBuffers);

                device.ImmediateContext.Draw(3, 0);
                size /= 2;
                ++mipSlice;
            }

            FilteredCubeMap.Value = _prefilteredCubeMap;
            Utilities.Dispose(ref _cubeMapRtv);

            //device.ImmediateContext.InputAssembler.PrimitiveTopology = previousTopology;
            Restore(context);
            _updatedOnce = true;
        }
        public override void Init(D3D11RenderBackend backend)
        {
            base.Init(backend);
            // Create shaders and layouts.

            AssetsLoader.GetShader <VertexShader>("ScreenQuadVS", out ShaderSignature vsSignature);
            QuadLayoyt = new InputLayout(RenderBackend.Device, vsSignature, new InputElement[] {
                new InputElement("SV_VertexID", 0, Format.R32G32B32_Float, 0, 0),
            });

            AssetsLoader.GetShader <VertexShader>("ForwardPlusPosOnlyVS", out vsSignature);
            DepthPassLayout = new InputLayout(RenderBackend.Device, vsSignature, new InputElement[] {
                new InputElement("POSITION", 0, Format.R32G32B32A32_Float, InputElement.AppendAligned, 0),
                new InputElement("COLOR", 0, Format.R32G32B32A32_Float, InputElement.AppendAligned, 0),
                new InputElement("TEXCOORD", 0, Format.R32G32B32A32_Float, InputElement.AppendAligned, 0),
                new InputElement("TEXCOORD", 1, Format.R32G32B32A32_Float, InputElement.AppendAligned, 0),
                new InputElement("NORMAL", 0, Format.R32G32B32A32_Float, InputElement.AppendAligned, 0),
                new InputElement("TANGENT", 0, Format.R32G32B32A32_Float, InputElement.AppendAligned, 0),
            });

            //Create constant buffer
            PerObjConstantBuffer = new Buffer(
                RenderBackend.Device,
                Utilities.SizeOf <CommonStructs.ConstBufferPerObjectStruct>(),
                ResourceUsage.Default,
                BindFlags.ConstantBuffer,
                CpuAccessFlags.None,
                ResourceOptionFlags.None, 0
                );

            PerFrameConstantBuffer = new Buffer(
                RenderBackend.Device,
                Utilities.SizeOf <CommonStructs.ConstBufferPerFrameStruct>(),
                ResourceUsage.Default,
                BindFlags.ConstantBuffer,
                CpuAccessFlags.None,
                ResourceOptionFlags.None, 0
                );

            m_LightBuffer = new LightBufferStruct[] { new LightBufferStruct(), new LightBufferStruct(), new LightBufferStruct() };
            LightBuffer   = new Buffer(
                RenderBackend.Device,
                Utilities.SizeOf <LightBufferStruct>() * m_LightBuffer.Length,
                ResourceUsage.Default,
                BindFlags.ConstantBuffer,
                CpuAccessFlags.None,
                ResourceOptionFlags.None, 0
                );

            ScreenParameters = new Buffer(
                RenderBackend.Device,
                Utilities.SizeOf <ScreenParametersStruct>(),
                ResourceUsage.Default,
                BindFlags.ConstantBuffer,
                CpuAccessFlags.None,
                ResourceOptionFlags.None, 0
                );

            GetContext.VertexShader.SetConstantBuffer(0, PerObjConstantBuffer);
            GetContext.VertexShader.SetConstantBuffer(1, PerFrameConstantBuffer);
            GetContext.VertexShader.SetConstantBuffer(2, LightBuffer);

            GetContext.PixelShader.SetConstantBuffer(0, PerObjConstantBuffer);
            GetContext.PixelShader.SetConstantBuffer(1, PerFrameConstantBuffer);
            GetContext.PixelShader.SetConstantBuffer(2, LightBuffer);

            Texture2DDescription textureDescription = new Texture2DDescription()
            {
                Width             = RenderBackend.DisplayRef.Width,
                Height            = RenderBackend.DisplayRef.Height,
                MipLevels         = 1,
                ArraySize         = 1,
                Format            = Format.R16G16_Float,
                SampleDescription = new SampleDescription()
                {
                    Count = 1,
                },
                Usage     = ResourceUsage.Default,
                BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource,
            };

            RenderTargetViewDescription renderTargetDescription = new RenderTargetViewDescription()
            {
                Format    = Format.R16G16_Float,
                Dimension = RenderTargetViewDimension.Texture2D,
            };

            ShaderResourceViewDescription shaderResourceDescription = new ShaderResourceViewDescription()
            {
                Format    = Format.R16G16_Float,
                Dimension = ShaderResourceViewDimension.Texture2D,
            };

            shaderResourceDescription.Texture2D.MostDetailedMip = 0;
            shaderResourceDescription.Texture2D.MipLevels       = 1;

            textureTarget            = new Texture2D(RenderBackend.Device, textureDescription);
            velocityRenderTargetView = new RenderTargetView(RenderBackend.Device, textureTarget, renderTargetDescription);
            velocitySRV = new ShaderResourceView(RenderBackend.Device, textureTarget, shaderResourceDescription);

            textureDescription.Format      = m_HDRformar;
            renderTargetDescription.Format = m_HDRformar;
            shaderResourceDescription      = new ShaderResourceViewDescription()
            {
                Format    = m_HDRformar,
                Dimension = ShaderResourceViewDimension.Texture2D,
            };
            shaderResourceDescription.Texture2D.MostDetailedMip = 0;
            shaderResourceDescription.Texture2D.MipLevels       = 1;

            hdrTextureTarget    = new Texture2D(RenderBackend.Device, textureDescription);
            hdrSRV              = new ShaderResourceView(RenderBackend.Device, hdrTextureTarget, shaderResourceDescription);
            hdrRenderTargetView = new RenderTargetView(RenderBackend.Device, hdrTextureTarget, renderTargetDescription);

            textureDescription.Width  = textureDescription.Width / 4;
            textureDescription.Height = textureDescription.Height / 4;
            downSamplingTarget        = new Texture2D(RenderBackend.Device, textureDescription);
            downSamplingSRV           = new ShaderResourceView(RenderBackend.Device, downSamplingTarget, shaderResourceDescription);
            downSamplingTargetView    = new RenderTargetView(RenderBackend.Device, downSamplingTarget, renderTargetDescription);
        }
예제 #51
0
        /// <summary>
        /// Gets a specific <see cref="RenderTargetView" /> from this texture.
        /// </summary>
        /// <param name="viewType">Type of the view slice.</param>
        /// <param name="arrayOrDepthSlice">The texture array slice index.</param>
        /// <param name="mipIndex">Index of the mip.</param>
        /// <returns>An <see cref="RenderTargetView" /></returns>
        /// <exception cref="System.NotSupportedException">ViewSlice.MipBand is not supported for render targets</exception>
        private RenderTargetView GetRenderTargetView(ViewType viewType, int arrayOrDepthSlice, int mipIndex)
        {
            if (!IsRenderTarget)
                return null;

            if (viewType == ViewType.MipBand)
                throw new NotSupportedException("ViewSlice.MipBand is not supported for render targets");

            int arrayCount;
            int mipCount;
            GetViewSliceBounds(viewType, ref arrayOrDepthSlice, ref mipIndex, out arrayCount, out mipCount);

            // Create the render target view
            var rtvDescription = new RenderTargetViewDescription() { Format = (SharpDX.DXGI.Format)ViewFormat };

            if (this.ArraySize > 1)
            {
                if (this.MultiSampleLevel > MSAALevel.None)
                {
                    if (Dimension != TextureDimension.Texture2D)
                    {
                        throw new NotSupportedException("Multisample is only supported for 2D Textures");
                    }

                    rtvDescription.Dimension = RenderTargetViewDimension.Texture2DMultisampledArray;
                    rtvDescription.Texture2DMSArray.ArraySize = arrayCount;
                    rtvDescription.Texture2DMSArray.FirstArraySlice = arrayOrDepthSlice;
                }
                else
                {
                    if (Dimension == TextureDimension.Texture3D)
                    {
                        throw new NotSupportedException("Texture Array is not supported for Texture3D");
                    }

                    rtvDescription.Dimension = Dimension == TextureDimension.Texture2D || Dimension == TextureDimension.TextureCube ? RenderTargetViewDimension.Texture2DArray : RenderTargetViewDimension.Texture1DArray;

                    // Use rtvDescription.Texture1DArray as it matches also Texture memory layout
                    rtvDescription.Texture1DArray.ArraySize = arrayCount;
                    rtvDescription.Texture1DArray.FirstArraySlice = arrayOrDepthSlice;
                    rtvDescription.Texture1DArray.MipSlice = mipIndex;
                }
            }
            else
            {
                if (IsMultiSample)
                {
                    if (Dimension != TextureDimension.Texture2D)
                    {
                        throw new NotSupportedException("Multisample is only supported for 2D RenderTarget Textures");
                    }

                    rtvDescription.Dimension = RenderTargetViewDimension.Texture2DMultisampled;
                }
                else
                {
                    switch (Dimension)
                    {
                        case TextureDimension.Texture1D:
                            rtvDescription.Dimension = RenderTargetViewDimension.Texture1D;
                            rtvDescription.Texture1D.MipSlice = mipIndex;
                            break;
                        case TextureDimension.Texture2D:
                            rtvDescription.Dimension = RenderTargetViewDimension.Texture2D;
                            rtvDescription.Texture2D.MipSlice = mipIndex;
                            break;
                        case TextureDimension.Texture3D:
                            rtvDescription.Dimension = RenderTargetViewDimension.Texture3D;
                            rtvDescription.Texture3D.DepthSliceCount = arrayCount;
                            rtvDescription.Texture3D.FirstDepthSlice = arrayOrDepthSlice;
                            rtvDescription.Texture3D.MipSlice = mipIndex;
                            break;
                        case TextureDimension.TextureCube:
                            throw new NotSupportedException("TextureCube dimension is expecting an arraysize > 1");
                    }
                }
            }

            return new RenderTargetView(GraphicsDevice.NativeDevice, NativeResource, rtvDescription);
        }
예제 #52
0
        /// <summary>
        /// Gets a specific <see cref="RenderTargetView" /> from this texture.
        /// </summary>
        /// <param name="viewType">Type of the view slice.</param>
        /// <param name="arrayOrDepthSlice">The texture array slice index.</param>
        /// <param name="mipIndex">Index of the mip.</param>
        /// <returns>An <see cref="RenderTargetView" /></returns>
        /// <exception cref="System.NotSupportedException">ViewSlice.MipBand is not supported for render targets</exception>
        private CpuDescriptorHandle GetRenderTargetView(ViewType viewType, int arrayOrDepthSlice, int mipIndex)
        {
            if (!IsRenderTarget)
            {
                return(new CpuDescriptorHandle());
            }

            if (viewType == ViewType.MipBand)
            {
                throw new NotSupportedException("ViewSlice.MipBand is not supported for render targets");
            }

            int arrayCount;
            int mipCount;

            GetViewSliceBounds(viewType, ref arrayOrDepthSlice, ref mipIndex, out arrayCount, out mipCount);

            // Create the render target view
            var rtvDescription = new RenderTargetViewDescription()
            {
                Format = (SharpDX.DXGI.Format)ViewFormat
            };

            if (this.ArraySize > 1)
            {
                if (this.MultisampleCount > MultisampleCount.None)
                {
                    if (Dimension != TextureDimension.Texture2D)
                    {
                        throw new NotSupportedException("Multisample is only supported for 2D Textures");
                    }

                    rtvDescription.Dimension = RenderTargetViewDimension.Texture2DMultisampledArray;
                    rtvDescription.Texture2DMSArray.ArraySize       = arrayCount;
                    rtvDescription.Texture2DMSArray.FirstArraySlice = arrayOrDepthSlice;
                }
                else
                {
                    if (Dimension == TextureDimension.Texture3D)
                    {
                        throw new NotSupportedException("Texture Array is not supported for Texture3D");
                    }

                    rtvDescription.Dimension = Dimension == TextureDimension.Texture2D || Dimension == TextureDimension.TextureCube ? RenderTargetViewDimension.Texture2DArray : RenderTargetViewDimension.Texture1DArray;

                    // Use rtvDescription.Texture1DArray as it matches also Texture memory layout
                    rtvDescription.Texture1DArray.ArraySize       = arrayCount;
                    rtvDescription.Texture1DArray.FirstArraySlice = arrayOrDepthSlice;
                    rtvDescription.Texture1DArray.MipSlice        = mipIndex;
                }
            }
            else
            {
                if (IsMultisample)
                {
                    if (Dimension != TextureDimension.Texture2D)
                    {
                        throw new NotSupportedException("Multisample is only supported for 2D RenderTarget Textures");
                    }

                    rtvDescription.Dimension = RenderTargetViewDimension.Texture2DMultisampled;
                }
                else
                {
                    switch (Dimension)
                    {
                    case TextureDimension.Texture1D:
                        rtvDescription.Dimension          = RenderTargetViewDimension.Texture1D;
                        rtvDescription.Texture1D.MipSlice = mipIndex;
                        break;

                    case TextureDimension.Texture2D:
                        rtvDescription.Dimension          = RenderTargetViewDimension.Texture2D;
                        rtvDescription.Texture2D.MipSlice = mipIndex;
                        break;

                    case TextureDimension.Texture3D:
                        rtvDescription.Dimension = RenderTargetViewDimension.Texture3D;
                        rtvDescription.Texture3D.DepthSliceCount = arrayCount;
                        rtvDescription.Texture3D.FirstDepthSlice = arrayOrDepthSlice;
                        rtvDescription.Texture3D.MipSlice        = mipIndex;
                        break;

                    case TextureDimension.TextureCube:
                        throw new NotSupportedException("TextureCube dimension is expecting an arraysize > 1");
                    }
                }
            }

            var descriptorHandle = GraphicsDevice.RenderTargetViewAllocator.Allocate(1);

            NativeDevice.CreateRenderTargetView(NativeResource, rtvDescription, descriptorHandle);
            return(descriptorHandle);
        }
예제 #53
0
        // Static functions
        static public TextureObject CreateCubeTexture(Device device, int width, int height, int mips, Format format, bool isDepthStencil, bool needsGpuWrite)
        {
            if (isDepthStencil && format != Format.R32_Typeless && format != Format.R24G8_Typeless)
            {
                throw new Exception("Unsupported depth format");
            }

            TextureObject newTexture = new TextureObject();

            // Variables
            newTexture.m_Width     = width;
            newTexture.m_Height    = height;
            newTexture.m_TexFormat = format;
            newTexture.m_Mips      = mips;
            newTexture.m_IsCube    = true;
            newTexture.m_ArraySize = 6;

            BindFlags bindFlags = BindFlags.ShaderResource;

            if (isDepthStencil)
            {
                bindFlags |= BindFlags.DepthStencil;
            }
            if (needsGpuWrite && !isDepthStencil)
            {
                bindFlags |= BindFlags.RenderTarget;
            }
            if (needsGpuWrite && !isDepthStencil)
            {
                bindFlags |= BindFlags.UnorderedAccess;
            }

            Texture2DDescription textureDescription = new Texture2DDescription
            {
                ArraySize         = 6,
                BindFlags         = bindFlags,
                CpuAccessFlags    = CpuAccessFlags.None,
                Format            = format,
                Height            = height,
                Width             = width,
                MipLevels         = mips,
                OptionFlags       = ResourceOptionFlags.TextureCube | ((mips > 1 && needsGpuWrite) ? ResourceOptionFlags.GenerateMipMaps : ResourceOptionFlags.None),
                SampleDescription = new SampleDescription(1, 0),
                Usage             = ResourceUsage.Default
            };

            newTexture.m_TextureObject2D = new Texture2D(device, textureDescription);

            Format srvFormat = format;

            // Special case for depth
            if (isDepthStencil)
            {
                srvFormat = (format == Format.R32_Typeless) ? Format.R32_Float : Format.R24_UNorm_X8_Typeless;
            }

            ShaderResourceViewDescription srvViewDesc = new ShaderResourceViewDescription
            {
                Format          = srvFormat,
                Dimension       = ShaderResourceViewDimension.TextureCube,
                Flags           = 0,
                FirstArraySlice = 0,
                MostDetailedMip = 0,
                MipLevels       = mips,
                ArraySize       = 6,
            };

            newTexture.m_ShaderResourceView = new ShaderResourceView(device, newTexture.m_TextureObject2D, srvViewDesc);

            newTexture.m_ArrayShaderResourceViews = new ShaderResourceView[6];
            for (int i = 0; i < 6; ++i)
            {
                srvViewDesc.ArraySize       = 1;
                srvViewDesc.FirstArraySlice = i;
                newTexture.m_ArrayShaderResourceViews[i] = new ShaderResourceView(device, newTexture.m_TextureObject2D, srvViewDesc);
            }

            if (isDepthStencil)
            {
                DepthStencilViewDescription dsViewDesc = new DepthStencilViewDescription
                {
                    ArraySize       = 6,
                    Format          = (format == Format.R32_Typeless) ? Format.D32_Float : Format.D24_UNorm_S8_UInt,
                    Dimension       = DepthStencilViewDimension.Texture2DArray,
                    MipSlice        = 0,
                    Flags           = 0,
                    FirstArraySlice = 0
                };

                newTexture.m_DepthStencilView = new DepthStencilView(device, newTexture.m_TextureObject2D, dsViewDesc);

                newTexture.m_ArrayDepthStencilViews = new DepthStencilView[6];
                for (int i = 0; i < 6; ++i)
                {
                    dsViewDesc.ArraySize                   = 1;
                    dsViewDesc.FirstArraySlice             = i;
                    newTexture.m_ArrayDepthStencilViews[i] = new DepthStencilView(device, newTexture.m_TextureObject2D, dsViewDesc);
                }
            }

            // No RTV for depth stencil, sorry
            if (needsGpuWrite && !isDepthStencil)
            {
                newTexture.m_RenderTargetView = new RenderTargetView(device, newTexture.m_TextureObject2D);

                RenderTargetViewDescription rtvDesc = new RenderTargetViewDescription
                {
                    ArraySize       = 6,
                    Dimension       = RenderTargetViewDimension.Texture2DArray,
                    FirstArraySlice = 0,
                    Format          = format,
                };

                newTexture.m_ArrayRenderTargetViews = new RenderTargetView[6 * mips];

                for (int m = 0; m < mips; ++m)
                {
                    for (int i = 0; i < 6; ++i)
                    {
                        rtvDesc.MipSlice        = m;
                        rtvDesc.ArraySize       = 1;
                        rtvDesc.FirstArraySlice = i;
                        newTexture.m_ArrayRenderTargetViews[6 * m + i] = new RenderTargetView(device, newTexture.m_TextureObject2D, rtvDesc);
                    }
                }

                UnorderedAccessViewDescription uavDesc = new UnorderedAccessViewDescription
                {
                    ArraySize       = 6,
                    Dimension       = UnorderedAccessViewDimension.Texture2DArray,
                    FirstArraySlice = 0,
                    Format          = format,
                };
                newTexture.m_UnorderedAccessView = new UnorderedAccessView(device, newTexture.m_TextureObject2D, uavDesc);

                newTexture.m_ArrayUnorderedAccessViews = new UnorderedAccessView[6 * mips];
                for (int m = 0; m < mips; ++m)
                {
                    for (int i = 0; i < 6; ++i)
                    {
                        uavDesc.ArraySize       = 1;
                        uavDesc.FirstArraySlice = i;
                        uavDesc.MipSlice        = m;
                        newTexture.m_ArrayUnorderedAccessViews[6 * m + i] = new UnorderedAccessView(device, newTexture.m_TextureObject2D, uavDesc);
                    }
                }
            }

            return(newTexture);
        }
        public override void Init(D3D11RenderBackend renderBackend)
        {
            base.Init(renderBackend);

            // Create constant buffers
            BufferDescription bufferDescription = new BufferDescription()
            {
                SizeInBytes         = Utilities.SizeOf <CommonStructs.ConstBufferPerObjectStruct>(),
                Usage               = ResourceUsage.Default,
                BindFlags           = BindFlags.ConstantBuffer,
                CpuAccessFlags      = CpuAccessFlags.None,
                OptionFlags         = ResourceOptionFlags.None,
                StructureByteStride = 0,
            };

            PerObjConstantBuffer          = new Buffer(GetDevice, bufferDescription);
            bufferDescription.SizeInBytes = Utilities.SizeOf <CommonStructs.ConstBufferPerFrameStruct>();
            PerFrameConstantBuffer        = new Buffer(GetDevice, bufferDescription);

            // Bind constant buffers
            GetContext.VertexShader.SetConstantBuffer(0, PerObjConstantBuffer);
            GetContext.VertexShader.SetConstantBuffer(1, PerFrameConstantBuffer);
            GetContext.PixelShader.SetConstantBuffer(0, PerObjConstantBuffer);
            GetContext.PixelShader.SetConstantBuffer(1, PerFrameConstantBuffer);

            InitLightsBuffers();

            Texture2DDescription textureDescription = new Texture2DDescription()
            {
                Width             = GetDisplay.Width,
                Height            = GetDisplay.Height,
                MipLevels         = 1,
                ArraySize         = 1,
                Format            = Format.R16G16_Float,
                SampleDescription = new SampleDescription()
                {
                    Count = 1,
                },
                Usage     = ResourceUsage.Default,
                BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource,
            };
            RenderTargetViewDescription renderTargetDescription = new RenderTargetViewDescription()
            {
                Format    = Format.R16G16_Float,
                Dimension = RenderTargetViewDimension.Texture2D,
            };
            ShaderResourceViewDescription shaderResourceDescription = new ShaderResourceViewDescription()
            {
                Format    = Format.R16G16_Float,
                Dimension = ShaderResourceViewDimension.Texture2D,
            };

            shaderResourceDescription.Texture2D.MostDetailedMip = 0;
            shaderResourceDescription.Texture2D.MipLevels       = 1;
            textureDescription.Format      = m_HDRformar;
            renderTargetDescription.Format = m_HDRformar;
            shaderResourceDescription      = new ShaderResourceViewDescription()
            {
                Format    = m_HDRformar,
                Dimension = ShaderResourceViewDimension.Texture2D,
            };
            shaderResourceDescription.Texture2D.MostDetailedMip = 0;
            shaderResourceDescription.Texture2D.MipLevels       = 1;

            hdrTextureTarget    = new Texture2D(GetDevice, textureDescription);
            hdrSRV              = new ShaderResourceView(GetDevice, hdrTextureTarget, shaderResourceDescription);
            hdrRenderTargetView = new RenderTargetView(GetDevice, hdrTextureTarget, renderTargetDescription);
        }
예제 #55
0
        private void GenerateIfRequired()
        {
            if (_renderTargetViews != null)
                return;

            // Create a view interface on the rendertarget to use on bind.
            if (ArraySize > 1)
            {
                _renderTargetViews = new RenderTargetView[ArraySize];
                for (var i = 0; i < ArraySize; i++)
                {
                    var renderTargetViewDescription = new RenderTargetViewDescription();
                    if (MultiSampleCount > 1)
                    {
                        renderTargetViewDescription.Dimension = RenderTargetViewDimension.Texture2DMultisampledArray;
                        renderTargetViewDescription.Texture2DMSArray.ArraySize = 1;
                        renderTargetViewDescription.Texture2DMSArray.FirstArraySlice = i;
                    }
                    else
                    {
                        renderTargetViewDescription.Dimension = RenderTargetViewDimension.Texture2DArray;
                        renderTargetViewDescription.Texture2DArray.ArraySize = 1;
                        renderTargetViewDescription.Texture2DArray.FirstArraySlice = i;
                        renderTargetViewDescription.Texture2DArray.MipSlice = 0;
                    }
                    _renderTargetViews[i] = new RenderTargetView(
                        GraphicsDevice._d3dDevice, GetTexture(),
                        renderTargetViewDescription);
                }
            }
            else
            {
                _renderTargetViews = new[] { new RenderTargetView(GraphicsDevice._d3dDevice, GetTexture()) };
            }

            // If we don't need a depth buffer then we're done.
            if (DepthStencilFormat == DepthFormat.None)
                return;

            // Setup the multisampling description.
            var multisampleDesc = new SharpDX.DXGI.SampleDescription(1, 0);
            if (MultiSampleCount > 1)
            {
                multisampleDesc.Count = MultiSampleCount;
                multisampleDesc.Quality = (int)StandardMultisampleQualityLevels.StandardMultisamplePattern;
            }

            // Create a descriptor for the depth/stencil buffer.
            // Allocate a 2-D surface as the depth/stencil buffer.
            // Create a DepthStencil view on this surface to use on bind.
            using (var depthBuffer = new SharpDX.Direct3D11.Texture2D(GraphicsDevice._d3dDevice, new Texture2DDescription
            {
                Format = SharpDXHelper.ToFormat(DepthStencilFormat),
                ArraySize = 1,
                MipLevels = 1,
                Width = width,
                Height = height,
                SampleDescription = multisampleDesc,
                BindFlags = BindFlags.DepthStencil,
            }))
            {
                // Create the view for binding to the device.
                _depthStencilView = new DepthStencilView(GraphicsDevice._d3dDevice, depthBuffer,
                    new DepthStencilViewDescription()
                    {
                        Format = SharpDXHelper.ToFormat(DepthStencilFormat),
                        Dimension = DepthStencilViewDimension.Texture2D
                    });
            }
        }
예제 #56
0
        private void CreateTextureViews(bool createUav)
        {
            Debug.Assert(handle != null);

            // default View
            var defaultDesc = new ShaderResourceViewDescription
            {
                Dimension      = ShaderResourceViewDimension.Texture2DArray,
                Format         = Format,
                Texture2DArray = new ShaderResourceViewDescription.Texture2DArrayResource
                {
                    ArraySize       = LayerMipmap.Layers,
                    FirstArraySlice = 0,
                    MipLevels       = LayerMipmap.Mipmaps,
                    MostDetailedMip = 0
                }
            };

            View = new ShaderResourceView(Device.Get().Handle, handle, defaultDesc);

            if (HasCubemap)
            {
                cubeViews = new ShaderResourceView[LayerMipmap.Mipmaps];
                for (int curMipmap = 0; curMipmap < LayerMipmap.Mipmaps; ++curMipmap)
                {
                    var cubeDesc = new ShaderResourceViewDescription
                    {
                        Dimension   = ShaderResourceViewDimension.TextureCube,
                        Format      = Format,
                        TextureCube = new ShaderResourceViewDescription.TextureCubeResource
                        {
                            MipLevels       = 1,
                            MostDetailedMip = curMipmap
                        }
                    };

                    cubeViews[curMipmap] = new ShaderResourceView(Device.Get().Handle, handle, cubeDesc);
                }
            }

            // single slice views
            views   = new ShaderResourceView[LayerMipmap.Layers * LayerMipmap.Mipmaps];
            rtViews = new RenderTargetView[LayerMipmap.Layers * LayerMipmap.Mipmaps];
            foreach (var lm in LayerMipmap.Range)
            {
                var desc = new ShaderResourceViewDescription
                {
                    Dimension      = ShaderResourceViewDimension.Texture2DArray,
                    Format         = Format,
                    Texture2DArray = new ShaderResourceViewDescription.Texture2DArrayResource
                    {
                        MipLevels       = 1,
                        MostDetailedMip = lm.Mipmap,
                        ArraySize       = 1,
                        FirstArraySlice = lm.Layer
                    }
                };

                views[GetSubresourceIndex(lm)] = new ShaderResourceView(Device.Get().Handle, handle, desc);

                var rtDesc = new RenderTargetViewDescription
                {
                    Dimension      = RenderTargetViewDimension.Texture2DArray,
                    Format         = Format,
                    Texture2DArray = new RenderTargetViewDescription.Texture2DArrayResource
                    {
                        ArraySize       = 1,
                        FirstArraySlice = lm.Layer,
                        MipSlice        = lm.Mipmap
                    }
                };

                rtViews[GetSubresourceIndex(lm)] = new RenderTargetView(Device.Get().Handle, handle, rtDesc);
            }

            if (createUav)
            {
                uaViews = new UnorderedAccessView[LayerMipmap.Mipmaps];
                for (int curMipmap = 0; curMipmap < LayerMipmap.Mipmaps; ++curMipmap)
                {
                    var desc = new UnorderedAccessViewDescription
                    {
                        Dimension      = UnorderedAccessViewDimension.Texture2DArray,
                        Format         = Format,
                        Texture2DArray = new UnorderedAccessViewDescription.Texture2DArrayResource
                        {
                            ArraySize       = LayerMipmap.Layers,
                            FirstArraySlice = 0,
                            MipSlice        = curMipmap
                        }
                    };

                    uaViews[curMipmap] = new UnorderedAccessView(Device.Get().Handle, handle, desc);
                }
            }
        }
예제 #57
0
        internal override RenderTargetView GetRenderTargetView(ViewType viewType, int arrayOrDepthSlice, int mipIndex)
        {
            if ((this.Description.BindFlags & BindFlags.RenderTarget) == 0)
                return null;

            if (viewType == ViewType.MipBand)
                throw new NotSupportedException("ViewSlice.MipBand is not supported for render targets");

            int arrayCount;
            int mipCount;
            GetViewSliceBounds(viewType, ref arrayOrDepthSlice, ref mipIndex, out arrayCount, out mipCount);

            var rtvIndex = GetViewIndex(viewType, arrayOrDepthSlice, mipIndex);

            lock (this.renderTargetViews)
            {
                var rtv = this.renderTargetViews[rtvIndex];

                // Creates the shader resource view
                if (rtv == null)
                {
                    // Create the render target view
                    var rtvDescription = new RenderTargetViewDescription {
                        Format = this.Description.Format,
                        Dimension = RenderTargetViewDimension.Texture2DArray,
                        Texture2DArray = {
                            ArraySize = arrayCount,
                            FirstArraySlice = arrayOrDepthSlice,
                            MipSlice = mipIndex
                        }
                    };

                    rtv = new RenderTargetView(GraphicsDevice, Resource, rtvDescription);
                    this.renderTargetViews[rtvIndex] = ToDispose(rtv);
                }

                // Associate this instance
                rtv.Tag = this;

                return rtv;
            }
        }
예제 #58
0
        public void AfterEngineInit()
        {
            // Basics.
            {
                var deviceDesc = new Device.Descriptor {
                    DebugDevice = true
                };
                renderDevice = new ClearSight.RendererDX12.Device(ref deviceDesc,
                                                                  ClearSight.RendererDX12.Device.FeatureLevel.Level_11_0);

                var descCQ = new CommandQueue.Descriptor()
                {
                    Type = CommandListType.Graphics
                };
                commandQueue = renderDevice.Create(ref descCQ);

                var wih           = new WindowInteropHelper(window);
                var swapChainDesc = new SwapChain.Descriptor()
                {
                    AssociatedGraphicsQueue = commandQueue,

                    MaxFramesInFlight = 3,
                    BufferCount       = 3,

                    Width  = (uint)window.Width,
                    Height = (uint)window.Height,
                    Format = Format.R8G8B8A8_UNorm,

                    SampleCount   = 1,
                    SampleQuality = 0,

                    WindowHandle = wih.Handle,
                    Fullscreen   = false
                };
                swapChain = renderDevice.Create(ref swapChainDesc);

                var commandListDesc = new CommandList.Descriptor()
                {
                    Type             = CommandListType.Graphics,
                    AllocationPolicy = new CommandListInFlightFrameAllocationPolicy(CommandListType.Graphics, swapChain)
                };
                commandList = renderDevice.Create(ref commandListDesc);
            }

            // Render targets.
            {
                var descHeapDesc = new DescriptorHeap.Descriptor()
                {
                    Type = DescriptorHeap.Descriptor.ResourceDescriptorType.RenderTarget,
                    NumResourceDescriptors = swapChain.Desc.BufferCount
                };
                descHeapRenderTargets = renderDevice.Create(ref descHeapDesc);

                var rtvViewDesc = new RenderTargetViewDescription()
                {
                    Format    = swapChain.Desc.Format,
                    Dimension = Dimension.Texture2D,
                    Texture   = new TextureSubresourceDesc(mipSlice: 0)
                };
                for (uint i = 0; i < swapChain.Desc.BufferCount; ++i)
                {
                    renderDevice.CreateRenderTargetView(descHeapRenderTargets, i, swapChain.BackbufferResources[i], ref rtvViewDesc);
                }
            }
        }
예제 #59
0
        // Static functions
        static public TextureObject CreateCubeTexture(Device device, int width, int height, int mips, Format format, bool isDepthStencil, bool needsGpuWrite)
        {
            if (isDepthStencil && format != Format.R32_Typeless && format != Format.R24G8_Typeless)
            {
                throw new Exception("Unsupported depth format");
            }

            TextureObject newTexture = new TextureObject();

            // Variables
            newTexture.m_Width = width;
            newTexture.m_Height = height;
            newTexture.m_TexFormat = format;
            newTexture.m_Mips = mips;
            newTexture.m_IsCube = true;
            newTexture.m_ArraySize = 6;

            BindFlags bindFlags = BindFlags.ShaderResource;
            if (isDepthStencil) bindFlags |= BindFlags.DepthStencil;
            if (needsGpuWrite && !isDepthStencil) bindFlags |= BindFlags.RenderTarget;
            if (needsGpuWrite && !isDepthStencil) bindFlags |= BindFlags.UnorderedAccess;

            Texture2DDescription textureDescription = new Texture2DDescription
            {
                ArraySize = 6,
                BindFlags = bindFlags,
                CpuAccessFlags = CpuAccessFlags.None,
                Format = format,
                Height = height,
                Width = width,
                MipLevels = mips,
                OptionFlags = ResourceOptionFlags.TextureCube | ((mips > 1 && needsGpuWrite) ? ResourceOptionFlags.GenerateMipMaps : ResourceOptionFlags.None),
                SampleDescription = new SampleDescription(1, 0),
                Usage = ResourceUsage.Default
            };

            newTexture.m_TextureObject2D = new Texture2D(device, textureDescription);

            Format srvFormat = format;

            // Special case for depth
            if (isDepthStencil)
            {
                srvFormat = (format == Format.R32_Typeless) ? Format.R32_Float : Format.R24_UNorm_X8_Typeless;
            }

            ShaderResourceViewDescription srvViewDesc = new ShaderResourceViewDescription
            {
                ArraySize = 6,
                Format = srvFormat,
                Dimension = ShaderResourceViewDimension.Texture2DArray,
                Flags = 0,
                FirstArraySlice = 0,
                MostDetailedMip = 0,
                MipLevels = mips
            };

            newTexture.m_ShaderResourceView = new ShaderResourceView(device, newTexture.m_TextureObject2D, srvViewDesc);

            newTexture.m_ArrayShaderResourceViews = new ShaderResourceView[6]; 
            for (int i = 0; i < 6; ++ i )
            {
                srvViewDesc.ArraySize = 1;
                srvViewDesc.FirstArraySlice = i;
                newTexture.m_ArrayShaderResourceViews[i] = new ShaderResourceView(device, newTexture.m_TextureObject2D, srvViewDesc);
            }

            if (isDepthStencil)
            {
                DepthStencilViewDescription dsViewDesc = new DepthStencilViewDescription
                {
                    ArraySize = 6,
                    Format = (format == Format.R32_Typeless) ? Format.D32_Float : Format.D24_UNorm_S8_UInt,
                    Dimension = DepthStencilViewDimension.Texture2DArray,
                    MipSlice = 0,
                    Flags = 0,
                    FirstArraySlice = 0
                };

                newTexture.m_DepthStencilView = new DepthStencilView(device, newTexture.m_TextureObject2D, dsViewDesc);

                newTexture.m_ArrayDepthStencilViews = new DepthStencilView[6];
                for (int i = 0; i < 6; ++i)
                {
                    dsViewDesc.ArraySize = 1;
                    dsViewDesc.FirstArraySlice = i;
                    newTexture.m_ArrayDepthStencilViews[i] = new DepthStencilView(device, newTexture.m_TextureObject2D, dsViewDesc);
                }
            }

            // No RTV for depth stencil, sorry
            if (needsGpuWrite && !isDepthStencil)
            {
                newTexture.m_RenderTargetView = new RenderTargetView(device, newTexture.m_TextureObject2D);

                RenderTargetViewDescription rtvDesc = new RenderTargetViewDescription
                {
                    ArraySize = 6,
                    Dimension = RenderTargetViewDimension.Texture2DArray,
                    FirstArraySlice = 0,
                    Format = format,
                };

                newTexture.m_ArrayRenderTargetViews = new RenderTargetView[6];
                for (int i = 0; i < 6; ++i)
                {
                    rtvDesc.ArraySize = 1;
                    rtvDesc.FirstArraySlice = i;
                    newTexture.m_ArrayRenderTargetViews[i] = new RenderTargetView(device, newTexture.m_TextureObject2D, rtvDesc);
                }

                UnorderedAccessViewDescription uavDesc = new UnorderedAccessViewDescription
                {
                    ArraySize = 6,
                    Dimension = UnorderedAccessViewDimension.Texture2DArray,
                    FirstArraySlice = 0,
                    Format = format,
                };
                newTexture.m_UnorderedAccessView = new UnorderedAccessView(device, newTexture.m_TextureObject2D, uavDesc);

                newTexture.m_ArrayUnorderedAccessViews = new UnorderedAccessView[6];
                for (int i = 0; i < 6; ++i)
                {
                    uavDesc.ArraySize = 1;
                    uavDesc.FirstArraySlice = i;
                    newTexture.m_ArrayUnorderedAccessViews[i] = new UnorderedAccessView(device, newTexture.m_TextureObject2D, uavDesc);
                }
            }

            return newTexture;
        }
예제 #60
0
        void CreateDeviceResources()
        {
            uint width  = (uint)host.ActualWidth;
            uint height = (uint)host.ActualHeight;

            // If we don't have a device, need to create one now and all
            // accompanying D3D resources.
            CreateDevice();

            Factory dxgiFactory = Factory.Create();

            SwapChainDescription swapDesc = new SwapChainDescription
            {
                BufferDescription = new ModeDescription
                {
                    Width       = width, Height = height,
                    Format      = Format.R8G8B8A8UNorm,
                    RefreshRate = new Rational {
                        Numerator = 60, Denominator = 1
                    }
                },
                SampleDescription = new SampleDescription {
                    Count = 1, Quality = 0
                },
                BufferUsage        = UsageOptions.RenderTargetOutput,
                BufferCount        = 1,
                OutputWindowHandle = host.Handle,
                Windowed           = true
            };

            swapChain = dxgiFactory.CreateSwapChain(
                device, swapDesc);

            // Create rasterizer state object
            RasterizerDescription rsDesc = new RasterizerDescription();

            rsDesc.AntiAliasedLineEnable = false;
            rsDesc.CullMode              = CullMode.None;
            rsDesc.DepthBias             = 0;
            rsDesc.DepthBiasClamp        = 0;
            rsDesc.DepthClipEnable       = true;
            rsDesc.FillMode              = D3D10.FillMode.Solid;
            rsDesc.FrontCounterclockwise = false; // Must be FALSE for 10on9
            rsDesc.MultisampleEnable     = false;
            rsDesc.ScissorEnable         = false;
            rsDesc.SlopeScaledDepthBias  = 0;

            rasterizerState = device.CreateRasterizerState(
                rsDesc);

            device.RS.State = rasterizerState;

            // If we don't have a D2D render target, need to create all of the resources
            // required to render to one here.
            // Ensure that nobody is holding onto one of the old resources
            device.OM.RenderTargets = new OutputMergerRenderTargets(new RenderTargetView[] { null });

            InitializeDepthStencil(width, height);

            // Create views on the RT buffers and set them on the device
            RenderTargetViewDescription renderDesc = new RenderTargetViewDescription();

            renderDesc.Format        = Format.R8G8B8A8UNorm;
            renderDesc.ViewDimension = RenderTargetViewDimension.Texture2D;

            Texture2DRenderTargetView renderView = renderDesc.Texture2D;

            renderView.MipSlice  = 0;
            renderDesc.Texture2D = renderView;

            using (D3DResource spBackBufferResource = swapChain.GetBuffer <D3DResource>(0))
            {
                renderTargetView = device.CreateRenderTargetView(
                    spBackBufferResource,
                    renderDesc);
            }

            device.OM.RenderTargets = new OutputMergerRenderTargets(new RenderTargetView[] { renderTargetView }, depthStencilView);

            SetViewport(width, height);


            // Create a D2D render target which can draw into the surface in the swap chain
            RenderTargetProperties props =
                new RenderTargetProperties(
                    RenderTargetType.Default, new PixelFormat(Format.Unknown, AlphaMode.Premultiplied),
                    96, 96, RenderTargetUsages.None, FeatureLevel.Default);

            // Allocate a offscreen D3D surface for D2D to render our 2D content into
            Texture2DDescription tex2DDescription = new Texture2DDescription
            {
                ArraySize                    = 1,
                BindingOptions               = BindingOptions.RenderTarget | BindingOptions.ShaderResource,
                CpuAccessOptions             = CpuAccessOptions.None,
                Format                       = Format.R8G8B8A8UNorm,
                Height                       = 4096,
                Width                        = 512,
                MipLevels                    = 1,
                MiscellaneousResourceOptions = MiscellaneousResourceOptions.None,
                SampleDescription            = new SampleDescription {
                    Count = 1, Quality = 0
                },
                Usage = Usage.Default
            };

            offscreenTexture = device.CreateTexture2D(tex2DDescription);

            using (Surface dxgiSurface = offscreenTexture.GraphicsSurface)
            {
                // Create a D2D render target which can draw into our offscreen D3D surface
                renderTarget = d2DFactory.CreateGraphicsSurfaceRenderTarget(
                    dxgiSurface,
                    props);
            }

            PixelFormat alphaOnlyFormat = new PixelFormat(Format.A8UNorm, AlphaMode.Premultiplied);

            opacityRenderTarget = renderTarget.CreateCompatibleRenderTarget(CompatibleRenderTargetOptions.None,
                                                                            alphaOnlyFormat);

            // Load pixel shader
            // Open precompiled vertex shader
            // This file was compiled using DirectX's SDK Shader compilation tool:
            // fxc.exe /T fx_4_0 /Fo SciFiText.fxo SciFiText.fx
            shader = LoadResourceShader(device, "SciFiTextDemo.SciFiText.fxo");

            // Obtain the technique
            technique = shader.GetTechniqueByName("Render");

            // Obtain the variables
            worldMatrixVariable     = shader.GetVariableByName("World").AsMatrix;
            viewMatrixVariable      = shader.GetVariableByName("View").AsMatrix;
            projectionMarixVariable = shader.GetVariableByName("Projection").AsMatrix;
            diffuseVariable         = shader.GetVariableByName("txDiffuse").AsShaderResource;

            // Create the input layout
            PassDescription passDesc = new PassDescription();

            passDesc = technique.GetPassByIndex(0).Description;

            vertexLayout = device.CreateInputLayout(
                inputLayoutDescriptions,
                passDesc.InputAssemblerInputSignature,
                passDesc.InputAssemblerInputSignatureSize
                );

            // Set the input layout
            device.IA.InputLayout = vertexLayout;

            IntPtr verticesDataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(VertexArray.VerticesInstance));

            Marshal.StructureToPtr(VertexArray.VerticesInstance, verticesDataPtr, true);

            BufferDescription bd = new BufferDescription();

            bd.Usage                        = Usage.Default;
            bd.ByteWidth                    = (uint)Marshal.SizeOf(VertexArray.VerticesInstance);
            bd.BindingOptions               = BindingOptions.VertexBuffer;
            bd.CpuAccessOptions             = CpuAccessOptions.None;
            bd.MiscellaneousResourceOptions = MiscellaneousResourceOptions.None;

            SubresourceData InitData = new SubresourceData {
                SystemMemory = verticesDataPtr
            };

            vertexBuffer = device.CreateBuffer(bd, InitData);

            Marshal.FreeHGlobal(verticesDataPtr);

            // Set vertex buffer
            uint stride = (uint)Marshal.SizeOf(typeof(SimpleVertex));
            uint offset = 0;

            device.IA.SetVertexBuffers(
                0,
                new D3DBuffer[] { vertexBuffer },
                new uint[] { stride },
                new uint[] { offset }
                );

            IntPtr indicesDataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(VertexArray.IndicesInstance));

            Marshal.StructureToPtr(VertexArray.IndicesInstance, indicesDataPtr, true);

            bd.Usage                        = Usage.Default;
            bd.ByteWidth                    = (uint)Marshal.SizeOf(VertexArray.IndicesInstance);
            bd.BindingOptions               = BindingOptions.IndexBuffer;
            bd.CpuAccessOptions             = CpuAccessOptions.None;
            bd.MiscellaneousResourceOptions = MiscellaneousResourceOptions.None;

            InitData.SystemMemory = indicesDataPtr;

            facesIndexBuffer = device.CreateBuffer(
                bd,
                InitData
                );

            Marshal.FreeHGlobal(indicesDataPtr);

            // Set primitive topology
            device.IA.PrimitiveTopology = PrimitiveTopology.TriangleList;

            // Convert the D2D texture into a Shader Resource View
            textureResourceView = device.CreateShaderResourceView(
                offscreenTexture);

            // Initialize the world matrices
            worldMatrix = Matrix4x4F.Identity;

            // Initialize the view matrix
            Vector3F Eye = new Vector3F(0.0f, 0.0f, 13.0f);
            Vector3F At  = new Vector3F(0.0f, -3.5f, 45.0f);
            Vector3F Up  = new Vector3F(0.0f, 1.0f, 0.0f);

            viewMatrix = Camera.MatrixLookAtLH(Eye, At, Up);

            // Initialize the projection matrix
            projectionMatrix = Camera.MatrixPerspectiveFovLH(
                (float)Math.PI * 0.1f,
                width / (float)height,
                0.1f,
                100.0f);

            // Update Variables that never change
            viewMatrixVariable.Matrix = viewMatrix;

            projectionMarixVariable.Matrix = projectionMatrix;

            GradientStop[] gradientStops =
            {
                new GradientStop(0.0f, new ColorF(GetColorValues(System.Windows.Media.Colors.Yellow))),
                new GradientStop(1.0f, new ColorF(GetColorValues(System.Windows.Media.Colors.Black)))
            };

            GradientStopCollection spGradientStopCollection = renderTarget.CreateGradientStopCollection(
                gradientStops, Gamma.StandardRgb, ExtendMode.Clamp);

            // Create a linear gradient brush for text
            textBrush = renderTarget.CreateLinearGradientBrush(
                new LinearGradientBrushProperties(new Point2F(0, 0), new Point2F(0, -2048)),
                spGradientStopCollection
                );
        }