public void SetRenderTargets(IDepthStencilView depthStencilView, IRenderTargetView renderTargetView0, IRenderTargetView renderTargetView1 = null, IRenderTargetView renderTargetView2 = null, IRenderTargetView renderTargetView3 = null) { var dsv = (DepthStencilViewBox)depthStencilView; var rtv0 = (RenderTargetViewBox)renderTargetView0; var rtv1 = (RenderTargetViewBox)renderTargetView1; var rtv2 = (RenderTargetViewBox)renderTargetView2; var rtv3 = (RenderTargetViewBox)renderTargetView3; if (_currentDepthStencilView == dsv && _currentRenderTargetViews[0] == rtv0 && _currentRenderTargetViews[1] == rtv1 && _currentRenderTargetViews[2] == rtv2 && _currentRenderTargetViews[3] == rtv3) { return; } _currentDepthStencilView = dsv; _currentRenderTargetViews[0] = rtv0; _currentRenderTargetViews[1] = rtv1; _currentRenderTargetViews[2] = rtv2; _currentRenderTargetViews[3] = rtv3; UpdateRenderTargetsInternal(); }
public RenderToTextureScene(IEye eye, DisplayMode desctopDisplayMode) : base(eye, desctopDisplayMode) { var vertexShader = Device.Create.VertexShader(ShaderParser.Parse(VertexShaderText)); var pixelShader = Device.Create.PixelShader(ShaderParser.Parse(PixelShaderText)); shaderCombination = Device.Create.ShaderCombination(vertexShader, null, null, null, pixelShader); var meshFactory = new MeshFactory(Device, Handedness.Right, Winding.Clockwise); cubeMesh = meshFactory.CreateCube(2.0f); vertexLayout = Device.Create.VertexLayout(vertexShader, new[] { new VertexLayoutElement(ExplicitFormat.R32G32B32_FLOAT, 0, 0), new VertexLayoutElement(ExplicitFormat.R32G32B32_FLOAT, 0, 12), new VertexLayoutElement(ExplicitFormat.R32G32_FLOAT, 0, 24) }); transformBuffer = Device.Create.Buffer( new BufferDescription { SizeInBytes = Transform.SizeInBytes, BindFlags = BindFlags.UniformBuffer, Usage = Usage.Dynamic }); cameraVertexBuffer = Device.Create.Buffer( new BufferDescription { SizeInBytes = CameraVertex.SizeInBytes, BindFlags = BindFlags.UniformBuffer, Usage = Usage.Dynamic }); lightBuffer = Device.Create.Buffer( new BufferDescription { SizeInBytes = Light.SizeInBytes, BindFlags = BindFlags.UniformBuffer, Usage = Usage.Dynamic }); var renderTargetFormats = Eye.Adapters[0] .GetSupportedFormats(FormatSupport.Texture2D | FormatSupport.RenderTarget | FormatSupport.MipAutogen) .Where(fi => fi.ColorBits <= 24); if (!renderTargetFormats.Any()) throw new NotSupportedException("Render target textures are not supported."); var renderTargetFormatInfo = renderTargetFormats .OrderByDescending(fi => fi.ColorBits) .ThenBy(fi => fi.TotalBits) .First(); var renderTargetTexture = Device.Create.Texture2D(new Texture2DDescription { Width = TargetSize, Height = TargetSize, MipLevels = TextureHelper.MipLevels(TargetSize, TargetSize, 1), ArraySize = 1, FormatID = renderTargetFormatInfo.ID, Sampling = Sampling.NoMultisampling, Usage = Usage.Default, BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource, MiscFlags = MiscFlags.GenerateMips, ExtraFlags = ExtraFlags.None }); targetRtv = renderTargetTexture.ViewAsRenderTarget(renderTargetFormatInfo.ID, 0); targetSrv = renderTargetTexture.ViewAsShaderResource(renderTargetFormatInfo.ID, 0, renderTargetTexture.MipLevels); var dsFormats = Eye.Adapters[0].GetSupportedFormats(FormatSupport.Texture2D | FormatSupport.DepthStencil); var dsFormatInfo = dsFormats .OrderBy(fi => (fi.ColorBits == 24 && fi.AlphaBits == 8) ? 0 : 1) .ThenByDescending(fi => fi.ColorBits) .ThenBy(fi => fi.TotalBits) .First(); var depthStencilTexture = Device.Create.Texture2D(new Texture2DDescription { Width = TargetSize, Height = TargetSize, MipLevels = 1, ArraySize = 1, FormatID = dsFormatInfo.ID, Sampling = Sampling.NoMultisampling, Usage = Usage.Default, BindFlags = BindFlags.DepthStencil, MiscFlags = MiscFlags.None, ExtraFlags = ExtraFlags.None }); targetDsv = depthStencilTexture.ViewAsDepthStencil(dsFormatInfo.ID, DepthStencilViewFlags.None, 0); var textureLoader = new TextureLoader(Device); var diffuseTexture = textureLoader.Load("../Textures/DiffuseTest.png"); diffuseView = diffuseTexture.ViewAsShaderResource(diffuseTexture.FormatID, 0, diffuseTexture.MipLevels); samplerState = Device.Create.SamplerState(SamplerDescription.Anisotropic); depthStencilState = Device.Create.DepthStencilState(DepthStencilDescription.Enabled); }
private void RenderScene_Forward(IDeviceContext context, SceneSnapshot scene, IDepthStencilView backBufferDepthStencilView, IRenderTargetView backBufferRenderTargetView) { RenderShadowMaps(context, scene); // Restore backbuffer rendertarget + scene constant buffer + srvs. context.SetRenderTargets(backBufferDepthStencilView, backBufferRenderTargetView); context.SetViewportRect(new RectangleF(0, 0, backBufferRenderTargetView.Resolution.Width, backBufferRenderTargetView.Resolution.Height)); UpdateSceneConstantBuffer(context, new Vector4(scene.CameraEye, 1.0f), scene.ProjView, scene.ProjViewInv, scene.ProjView, scene.ProjViewInv, true, true, scene.SpotlightInfos.Count, scene.Time); // Clear render/depth, bind srvs after setrendertargets context.ClearRenderTarget(Color.Gray); context.ClearDepthBuffer(1.0f); BindCommonShaderResourceViews(context); // Atmosphere if (false) { _techniques.ForwardSkyFromAtmosphere.BeginPass(context, 0); context.SetDepthConfiguration(DepthConfiguration.Disabled); var(orthoProj, world) = ComputeSceneQuadProjWorld(backBufferRenderTargetView.Resolution, 0, 0, backBufferRenderTargetView.Resolution.Width, backBufferRenderTargetView.Resolution.Height); UpdateSceneConstantBuffer(context, new Vector4(scene.CameraEye, 1), orthoProj, MatrixCM.Invert(orthoProj), scene.ProjView, MatrixCM.Invert(scene.ProjView), false, false, scene.SpotlightInfos.Count, scene.Time); UpdateBatchConstantBuffer(context, Matrix.Identity, DiffuseTextureSamplingMode.FlatUV, 0); DrawScreenQuad(context, world, null); context.SetDepthConfiguration(DepthConfiguration.Enabled); { var projViewInv = MatrixCM.Invert(scene.ProjView); projViewInv.Transpose(); var a = Vector4.Transform(new Vector4(0, 0, 1, 1), projViewInv); a /= a.W; var av = (Vector3)a; av.Normalize(); var b = Vector4.Transform(new Vector4(1, 0, 1, 1), projViewInv); b /= b.W; var bv = (Vector3)b; bv.Normalize(); var c = Vector4.Transform(new Vector4(0, 1, 1, 1), projViewInv); c /= c.W; var cv = (Vector3)c; cv.Normalize(); Console.WriteLine(av + " " + bv + " " + cv); } } // Water if (false) { var pv = scene.ProjView; pv.Transpose(); Console.WriteLine("!!!!!" + Vector3.Transform(new Vector3(-5.00f, -2.18557e-07f, -5.00f), pv)); _techniques.ForwardWater.BeginPass(context, 0); UpdateSceneConstantBuffer(context, new Vector4(scene.CameraEye, 1), scene.ProjView, scene.ProjViewInv, scene.ProjView, scene.ProjViewInv, false, false, scene.SpotlightInfos.Count, scene.Time); UpdateBatchConstantBuffer(context, Matrix.Identity, DiffuseTextureSamplingMode.FlatUV, 0); var instancingBuffer = PickInstancingBuffer(8192); context.SetVertexBuffer(1, instancingBuffer); int n = 40; using (var updater = context.TakeUpdater(instancingBuffer)) { for (var y = -n; y <= n; y++) { for (var x = -n; x <= n; x++) { updater.Write(new RenderJobDescription { WorldTransform = MatrixCM.Scaling(10) * MatrixCM.Translation(x, 0, y) * MatrixCM.RotationX(-(float)Math.PI / 2.0f) * MatrixCM.Translation(-0.5f, -0.5f, 0), MaterialProperties = { Metallic = 0.0f, Roughness = 1.0f }, MaterialResourcesIndex = -1, Color = Color.White, }); } } } context.SetShaderResource(30, _graphicsFacade.Presets.SolidTextures[Color4.White], RenderStage.Pixel); var mrbu = context.TakeUpdater(_materialResourcesBuffer); mrbu.Write(new InternalMaterialResourcesDescription() { BaseColor = Color4.White }.Resolve(30)); mrbu.UpdateCloseAndDispose(); water.Render(context, (2 * n + 1) * (2 * n + 1)); } // Forward render pass for (var pass = 0; pass < _techniques.Forward.Passes; pass++) { _techniques.Forward.BeginPass(context, pass); foreach (var batch in scene.RenderJobBatches) { RenderBatch(context, scene, batch); } } }
public void GetBackBufferViews(out IDepthStencilView dsv, out IRenderTargetView rtv) { dsv = _backBufferDepthView; rtv = _backBufferRenderTargetView; }