private void Update(EvaluationContext context)
        {
            var resourceManager = ResourceManager.Instance();
            var device          = resourceManager.Device;
            var deviceContext   = device.ImmediateContext;
            var outputMerger    = deviceContext.OutputMerger;

            DepthStencilView.GetValue(context);
            DepthStencilReference.GetValue(context);
            BlendFactor.GetValue(context);
            BlendSampleMask.GetValue(context);


            RenderTargetViews.GetValues(ref _renderTargetViews, context);
            UnorderedAccessViews.GetValues(ref _unorderedAccessViews, context);

            _prevRenderTargetViews = outputMerger.GetRenderTargets(_renderTargetViews.Length);
            // if (_unorderedAccessViews.Length > 0)
            // _prevUnorderedAccessViews = outputMerger.GetUnorderedAccessViews(1, _unorderedAccessViews.Length);
            outputMerger.GetRenderTargets(out _prevDepthStencilView);
            outputMerger.SetDepthStencilState(DepthStencilState.GetValue(context));
            _prevBlendState = outputMerger.GetBlendState(out _prevBlendFactor, out _prevSampleMask);
            if (_renderTargetViews.Length > 0)
            {
                outputMerger.SetRenderTargets(null, _renderTargetViews);
            }
            if (_unorderedAccessViews.Length > 0)
            {
                // Log.Debug($"num uavs: {_unorderedAccessViews.Length}");
                outputMerger.SetUnorderedAccessViews(1, _unorderedAccessViews);
            }

            outputMerger.BlendState = BlendState.GetValue(context);
        }
示例#2
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);
        }