コード例 #1
0
        public override void Render(RenderContext context, DeviceContextProxy deviceContext)
        {
            if (!materialVariables.UpdateMaterialStruct(deviceContext, ref ModelMatrix, Matrix.SizeInBytes))
            {
                return;
            }
            int slot = 0;

            buffer.AttachBuffers(deviceContext, ref slot, EffectTechnique.EffectsManager);
            cubeBackPass.BindShader(deviceContext);
            cubeBackPass.BindStates(deviceContext, StateType.All);
            var back = context.RenderHost.RenderBuffer.FullResRenderTargetPool.Get(global::SharpDX.DXGI.Format.R16G16B16A16_Float);

            BindTarget(null, back, deviceContext, (int)context.ActualWidth, (int)context.ActualHeight);
            deviceContext.DrawIndexed(buffer.IndexBuffer.ElementCount, 0, 0);
            context.RenderHost.SetDefaultRenderTargets(false);
            var pass = materialVariables.GetPass(RenderType.Opaque, context);

            if (pass != volumePass)
            {
                volumePass  = pass;
                backTexSlot = volumePass.PixelShader.ShaderResourceViewMapping.TryGetBindSlot(DefaultBufferNames.VolumeBack);
            }
            materialVariables.BindMaterialResources(context, deviceContext, pass);
            volumePass.PixelShader.BindTexture(deviceContext, backTexSlot, back);
            volumePass.BindShader(deviceContext);
            volumePass.BindStates(deviceContext, StateType.All);
            deviceContext.DrawIndexed(buffer.IndexBuffer.ElementCount, 0, 0);
            volumePass.PixelShader.BindTexture(deviceContext, backTexSlot, null);
            context.RenderHost.RenderBuffer.FullResRenderTargetPool.Put(global::SharpDX.DXGI.Format.R16G16B16A16_Float, back);
        }
コード例 #2
0
 /// <summary>
 /// Called when [render].
 /// </summary>
 /// <param name="context">The context.</param>
 /// <param name="deviceContext">The device context.</param>
 protected override void OnRender(RenderContext context, DeviceContextProxy deviceContext)
 {
     DefaultShaderPass.BindShader(deviceContext);
     DefaultShaderPass.BindStates(deviceContext, StateType.BlendState | StateType.DepthStencilState);
     DefaultShaderPass.PixelShader.BindTexture(deviceContext, cubeTextureSlot, cubeTextureRes);
     DefaultShaderPass.PixelShader.BindSampler(deviceContext, textureSamplerSlot, textureSampler);
     deviceContext.DrawIndexed(GeometryBuffer.IndexBuffer.ElementCount, 0, 0);
 }
コード例 #3
0
 /// <summary>
 /// Called when [render].
 /// </summary>
 /// <param name="context">The context.</param>
 /// <param name="deviceContext">The device context.</param>
 protected override void OnRender(RenderContext context, DeviceContextProxy deviceContext)
 {
     context.SharedResource.EnvironementMap         = cubeTextureRes;
     context.SharedResource.EnvironmentMapMipLevels = MipMapLevels;
     if (SkipRendering)
     {
         return;
     }
     DefaultShaderPass.BindShader(deviceContext);
     DefaultShaderPass.BindStates(deviceContext, StateType.BlendState | StateType.DepthStencilState);
     DefaultShaderPass.PixelShader.BindTexture(deviceContext, cubeTextureSlot, cubeTextureRes);
     DefaultShaderPass.PixelShader.BindSampler(deviceContext, textureSamplerSlot, textureSampler);
     deviceContext.DrawIndexed(GeometryBuffer.IndexBuffer.ElementCount, 0, 0);
 }
コード例 #4
0
            public override void Render(RenderContext context, DeviceContextProxy deviceContext)
            {
                using (var back = context.GetOffScreenRT(OffScreenTextureSize.Full, global::SharpDX.DXGI.Format.R16G16B16A16_Float))
                {
                    var slot = 0;
                    using (var depth = context.GetOffScreenDS(OffScreenTextureSize.Full, global::SharpDX.DXGI.Format.D32_Float_S8X24_UInt))
                    {
                        deviceContext.ClearDepthStencilView(depth, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1, 1);
                        deviceContext.ClearRenderTargetView(back, new Color4(0, 0, 0, 0));
                        BindTarget(depth, back, deviceContext, (int)context.ActualWidth, (int)context.ActualHeight);
                        #region Render box back face and set stencil buffer to 0
                        modelMatrices.Update(ref ModelMatrix);
                        if (!materialVariables.UpdateMaterialStruct(deviceContext, ref modelMatrices))
                        {
                            return;
                        }
                        buffer.AttachBuffers(deviceContext, ref slot, EffectTechnique.EffectsManager);
                        cubeBackPass.BindShader(deviceContext);
                        cubeBackPass.BindStates(deviceContext, StateType.All);
                        deviceContext.DrawIndexed(buffer.IndexBuffer.ElementCount, 0, 0);
                        #endregion

                        #region Render all mesh Positions onto off-screen texture region with stencil = 0 only
                        if (context.RenderHost.PerFrameOpaqueNodesInFrustum.Count > 0)
                        {
                            for (var i = 0; i < context.RenderHost.PerFrameOpaqueNodesInFrustum.Count; ++i)
                            {
                                var mesh     = context.RenderHost.PerFrameOpaqueNodesInFrustum[i];
                                var meshPass = mesh.EffectTechnique[DefaultPassNames.Positions];
                                if (meshPass.IsNULL)
                                {
                                    continue;
                                }
                                meshPass.BindShader(deviceContext);
                                meshPass.BindStates(deviceContext, StateType.BlendState);
                                // Set special depth stencil state to only render into region with stencil region is 0
                                meshFrontPass.BindStates(deviceContext, StateType.DepthStencilState);
                                mesh.RenderCustom(context, deviceContext);
                            }
                        }
                        #endregion
                    }

                    #region Render box back face again and do actual volume sampling
                    context.RenderHost.SetDefaultRenderTargets(false);
                    var pass = materialVariables.GetPass(RenderType.Opaque, context);
                    if (pass != volumePass)
                    {
                        volumePass  = pass;
                        backTexSlot = volumePass.PixelShader.ShaderResourceViewMapping.TryGetBindSlot(DefaultBufferNames.VolumeBack);
                    }
                    slot = 0;
                    buffer.AttachBuffers(deviceContext, ref slot, EffectTechnique.EffectsManager);
                    materialVariables.BindMaterialResources(context, deviceContext, pass);
                    volumePass.PixelShader.BindTexture(deviceContext, backTexSlot, back);
                    volumePass.BindShader(deviceContext);
                    volumePass.BindStates(deviceContext, StateType.All);
                    deviceContext.DrawIndexed(buffer.IndexBuffer.ElementCount, 0, 0);
                    #endregion
                    volumePass.PixelShader.BindTexture(deviceContext, backTexSlot, null);
                }
            }