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); }
/// <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); }
/// <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); }
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); } }