public RenderCommand( Effect effect, PrimitiveType primitiveType, SharpDX.Toolkit.Graphics.Buffer <T> vertexBuffer, int numVertices, Dictionary <string, GraphicsResource> resources, Matrix world, BlendState blend = null, DepthStencilState depthStencil = null, RasterizerState rasterizer = null, string technique = null) { var device = Engine.GraphicsContext.Device; this.VertexBuffer = vertexBuffer; this.NumVertices = numVertices; this.Resources = resources; this.PrimitiveType = primitiveType; this.BlendState = blend ?? device.BlendStates.Default; this.DepthStencilState = depthStencil ?? device.DepthStencilStates.Default; this.RasterizerState = rasterizer ?? device.RasterizerStates.Default; this.World = world; this.Effect = effect; this.Technique = technique; }
public AtmosphereRenderCommand( Effect effect, PrimitiveType primitiveType, SharpDX.Toolkit.Graphics.Buffer <LightQuadVertex> vertexBuffer, int numVertices, Dictionary <string, GraphicsResource> resources, Matrix world, BlendState blend = null, DepthStencilState depthStencil = null, RasterizerState rasterizer = null, string technique = null) : base(effect, primitiveType, vertexBuffer, numVertices, resources, world, blend, depthStencil, rasterizer, technique) { }
public RenderDeferredIndexedCommand( Effect effect, PrimitiveType primitiveType, SharpDX.Toolkit.Graphics.Buffer <T> vertexBuffer, int numVertices, SharpDX.Toolkit.Graphics.Buffer indexBuffer, int numIndices, bool is32bit, Dictionary <string, GraphicsResource> resources, Matrix world, BlendState blend = null, DepthStencilState depthStencil = null, RasterizerState rasterizer = null, string technique = null, int startIndex = 0) : base(effect, primitiveType, vertexBuffer, numVertices, indexBuffer, numIndices, is32bit, resources, world, blend, depthStencil, rasterizer, technique) { }
public RenderInstancedCommand( Effect effect, PrimitiveType primitiveType, SharpDX.Toolkit.Graphics.Buffer <T> vertexBuffer, int numVertices, SharpDX.Toolkit.Graphics.Buffer <I> instanceData, int instanceCount, Dictionary <string, GraphicsResource> resources, Matrix world, BlendState blend = null, DepthStencilState depthStencil = null, RasterizerState rasterizer = null, string technique = null) : base(effect, primitiveType, vertexBuffer, numVertices, resources, world, blend, depthStencil, rasterizer, technique) { this.InstanceData = instanceData; this.InstanceCount = instanceCount; }
public Atmosphere() { GraphicsDevice device = Engine.GraphicsContext.Device; transmittanceT = RenderTarget2D.New(device, TRANSMITTANCE_W, TRANSMITTANCE_H, PixelFormat.R16G16B16A16.Float); irradianceT = RenderTarget2D.New(device, SKY_W, SKY_H, PixelFormat.R16G16B16A16.Float); inscatterT = RenderTarget3D.New(device, RES_MU_S * RES_NU, RES_MU, RES_R, PixelFormat.R16G16B16A16.Float); deltaET = RenderTarget2D.New(device, SKY_W, SKY_H, PixelFormat.R16G16B16A16.Float); deltaSRT = RenderTarget3D.New(device, RES_MU_S * RES_NU, RES_MU, RES_R, PixelFormat.R16G16B16A16.Float); deltaSMT = RenderTarget3D.New(device, RES_MU_S * RES_NU, RES_MU, RES_R, PixelFormat.R16G16B16A16.Float); deltaJT = RenderTarget3D.New(device, RES_MU_S * RES_NU, RES_MU, RES_R, PixelFormat.R16G16B16A16.Float); atmosphere = EffectLoader.Load(@"World/Atmosphere/Shaders/atmosphere.fx"); copyInscatter1 = EffectLoader.Load(@"World/Atmosphere/Shaders/copyInscatter1.fx"); copyInscatterN = EffectLoader.Load(@"World/Atmosphere/Shaders/copyInscatterN.fx"); copyIrradiance = EffectLoader.Load(@"World/Atmosphere/Shaders/copyIrradiance.fx"); inscatter1 = EffectLoader.Load(@"World/Atmosphere/Shaders/inscatter1.fx"); inscatterN = EffectLoader.Load(@"World/Atmosphere/Shaders/inscatterN.fx"); inscatterS = EffectLoader.Load(@"World/Atmosphere/Shaders/inscatterS.fx"); irradiance1 = EffectLoader.Load(@"World/Atmosphere/Shaders/irradiance1.fx"); irradianceN = EffectLoader.Load(@"World/Atmosphere/Shaders/irradianceN.fx"); transmittance = EffectLoader.Load(@"World/Atmosphere/Shaders/transmittance.fx"); QuadVert[] verts = new QuadVert[6] { new QuadVert(-1, -1, 0), new QuadVert(-1, 1, 0), new QuadVert(1, 1, 0), new QuadVert(1, 1, 0), new QuadVert(1, -1, 0), new QuadVert(-1, -1, 0) }; vb = SharpDX.Toolkit.Graphics.Buffer.New <QuadVert>(device, verts, BufferFlags.VertexBuffer); PreProcess(); }
public void PreProcess() { order = 2; GraphicsDevice device = Engine.GraphicsContext.Device; device.SetRasterizerState(device.RasterizerStates.CullNone); device.SetBlendState(device.BlendStates.Default); device.SetDepthStencilState(device.DepthStencilStates.None); // compute transmittance texture T (line 1 in algorithm 4.1) device.SetRenderTargets(transmittanceT); device.SetViewport(new ViewportF(0, 0, TRANSMITTANCE_W, TRANSMITTANCE_H)); device.DrawQuad(transmittance); // compute irradiance texture deltaE (line 2 in algorithm 4.1) device.SetRenderTargets(deltaET); device.SetViewport(new ViewportF(0, 0, SKY_W, SKY_H)); irradiance1.Parameters["transTex"].SetResource(transmittanceT); device.DrawQuad(irradiance1); //// compute single scattering texture deltaS (line 3 in algorithm 4.1) //// Rayleigh and Mie separated in deltaSR + deltaSM device.SetRenderTargets(deltaSRT, deltaSMT); device.SetViewport(new ViewportF(0, 0, RES_MU_S * RES_NU, RES_MU)); device.SetVertexBuffer(vb); device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, vb)); inscatter1.Parameters["_transTex"].SetResource(transmittanceT); inscatter1.Parameters["_transSamp"].SetResource(device.SamplerStates.LinearClamp); for (int layer = 0; layer < RES_R; layer++) { setLayer(inscatter1, layer); inscatter1.CurrentTechnique.Passes[0].Apply(); device.Draw(PrimitiveType.TriangleList, 6); } // copy deltaE into irradiance texture E (line 4 in algorithm 4.1) // really this just clears irradianceT device.SetRenderTargets(irradianceT); device.SetViewport(new ViewportF(0, 0, SKY_W, SKY_H)); copyIrradiance.Parameters["k"].SetValue(0f); copyIrradiance.Parameters["deltaE"].SetResource(deltaET); device.DrawQuad(copyIrradiance); for (; order < 3; order++) { // copy deltaS into inscatter texture S (line 5 in algorithm 4.1) device.SetRenderTargets(inscatterT); device.SetViewport(new ViewportF(0, 0, RES_MU_S * RES_NU, RES_MU)); device.SetVertexBuffer(vb); device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, vb)); copyInscatter1.Parameters["deltaSR"].SetResource(deltaSRT); copyInscatter1.Parameters["deltaSM"].SetResource(deltaSMT); for (int layer = 0; layer < RES_R; layer++) { setLayer(copyInscatter1, layer); copyInscatter1.CurrentTechnique.Passes[0].Apply(); device.Draw(PrimitiveType.TriangleList, 6); } // compute deltaJ (line 7 in algorithm 4.1) device.SetRenderTargets(deltaJT); device.SetViewport(new ViewportF(0, 0, RES_MU_S * RES_NU, RES_MU)); device.SetVertexBuffer(vb); device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, vb)); inscatterS.Parameters["first"].SetValue(order == 2 ? 1.0f : 0.0f); inscatterS.Parameters["trans"].SetResource(transmittanceT); inscatterS.Parameters["deltaE"].SetResource(deltaET); inscatterS.Parameters["deltaSR"].SetResource(deltaSRT); inscatterS.Parameters["deltaSM"].SetResource(deltaSMT); for (int layer = 0; layer < RES_R; layer++) { setLayer(inscatterS, layer); inscatterS.CurrentTechnique.Passes[0].Apply(); device.Draw(PrimitiveType.TriangleList, 6); } // compute deltaE (line 8 in algorithm 4.1) device.SetRenderTargets(deltaET); device.SetViewport(new ViewportF(0, 0, SKY_W, SKY_H)); irradianceN.Parameters["first"].SetValue(order == 2 ? 1.0f : 0.0f); irradianceN.Parameters["deltaSR"].SetResource(deltaSRT); irradianceN.Parameters["deltaSM"].SetResource(deltaSMT); device.DrawQuad(irradianceN); // compute deltaS (line 9 in algorithm 4.1) device.SetRenderTargets(deltaSRT); device.SetViewport(new ViewportF(0, 0, RES_MU_S * RES_NU, RES_MU)); device.SetVertexBuffer(vb); device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, vb)); inscatterN.Parameters["trans"].SetResource(transmittanceT); inscatterN.Parameters["deltaJ"].SetResource(deltaJT); for (int layer = 0; layer < RES_R; layer++) { setLayer(inscatterN, layer); inscatterN.CurrentTechnique.Passes[0].Apply(); device.Draw(PrimitiveType.TriangleList, 6); } device.SetBlendState(BlendState.New(device, SharpDX.Direct3D11.BlendOption.One, SharpDX.Direct3D11.BlendOption.One, SharpDX.Direct3D11.BlendOperation.Add, SharpDX.Direct3D11.BlendOption.One, SharpDX.Direct3D11.BlendOption.One, SharpDX.Direct3D11.BlendOperation.Add)); // add deltaE into irradiance texture E (line 10 in algorithm 4.1) device.SetRenderTargets(irradianceT); device.SetViewport(new ViewportF(0, 0, SKY_W, SKY_H)); copyIrradiance.Parameters["k"].SetValue(1.0f); copyIrradiance.Parameters["deltaE"].SetResource(deltaET); device.DrawQuad(copyIrradiance); // add deltaS into inscatter texture S (line 11 in algorithm 4.1) device.SetRenderTargets(inscatterT); device.SetViewport(new ViewportF(0, 0, RES_MU_S * RES_NU, RES_MU)); device.SetVertexBuffer(vb); device.SetVertexInputLayout(VertexInputLayout.FromBuffer(0, vb)); copyInscatterN.Parameters["deltaS"].SetResource(deltaSRT); for (int layer = 0; layer < RES_R; layer++) { setLayer(copyInscatterN, layer); copyInscatterN.CurrentTechnique.Passes[0].Apply(); device.Draw(PrimitiveType.TriangleList, 6); } device.SetBlendState(device.BlendStates.Opaque); } // end multiple scattering loop LightQuadVertex[] lightVerts = new LightQuadVertex[6] { new LightQuadVertex(-1, -1, 0, 0, 1, 3), new LightQuadVertex(-1, 1, 0, 0, 0, 2), new LightQuadVertex(1, 1, 0, 1, 0, 1), new LightQuadVertex(1, 1, 0, 1, 0, 1), new LightQuadVertex(1, -1, 0, 1, 1, 0), new LightQuadVertex(-1, -1, 0, 0, 1, 3) }; atmosVb = SharpDX.Toolkit.Graphics.Buffer.New <LightQuadVertex>(device, lightVerts, BufferFlags.VertexBuffer); }
public InstancedGeomClipMapping(GraphicsDevice graphicsDevice, float minPatchSizeWorld, uint ringThinkness, uint numRings) { this.ringThinkness = ringThinkness; this.numRings = numRings; this.minPatchSizeWorld = minPatchSizeWorld; // Patch vertex buffer Half2[] patchVertices = new Half2[9]; for (int x = 0; x < 3; ++x) { for (int y = 0; y < 3; ++y) { patchVertices[x + y * 3] = new Half2(x * 0.5f, y * 0.5f); } } patchVertexBuffer = Buffer<Half2>.New(graphicsDevice, patchVertices, BufferFlags.VertexBuffer, SharpDX.Direct3D11.ResourceUsage.Immutable); // Instance buffers // Try to guess max number of patches: maxPatchInstances[(uint)PatchType.FULL] = ringThinkness * ringThinkness * 4 * numRings; maxPatchInstances[(uint)PatchType.STITCH1] = (uint)(maxPatchInstances[(uint)PatchType.FULL] * (float)(4 * 2 * ringThinkness) / (2 * ringThinkness * 2 * ringThinkness)); maxPatchInstances[(uint)PatchType.STITCH2] = maxPatchInstances[(uint)PatchType.STITCH1] / 4; for(int i = 0; i < patchInstanceBuffer.Length; ++i) { patchInstanceBuffer[i] = SharpDX.Toolkit.Graphics.Buffer.New( graphicsDevice, (int)maxPatchInstances[i] * sizeof(float) * 4, sizeof(float) * 4, BufferFlags.VertexBuffer, SharpDX.Direct3D11.ResourceUsage.Dynamic); currentInstanceData[i] = new List<PatchInstanceData>(); } // Input layout. vertexInputLayout = VertexInputLayout.New( VertexBufferLayout.New(0, new VertexElement[]{ new VertexElement("RELPOS", 0, SharpDX.DXGI.Format.R16G16_Float, 0) }, 0), VertexBufferLayout.New(1, new VertexElement[]{ new VertexElement("WORLDPOS", 0, SharpDX.DXGI.Format.R32G32_Float, 0), // worldPosition new VertexElement("SCALE", 0, SharpDX.DXGI.Format.R32_Float, 8), // worldScale new VertexElement("ROTATION", 0, SharpDX.DXGI.Format.R32_UInt, 12) }, 1)); // rotationType // Patch index buffer // Full patch ushort[] indicesFull = new ushort[]{ 0, 1, 4, 4, 1, 2, 0, 4, 3, 4, 2, 5, 3, 4, 6, 6, 4, 7, 7, 4, 8, 8, 4, 5 }; // optimize? patchIndexBuffer[(uint)PatchType.FULL] = Buffer<ushort>.New(graphicsDevice, indicesFull, BufferFlags.IndexBuffer, SharpDX.Direct3D11.ResourceUsage.Immutable); // First stitch: Only one triangle at bottom ushort[] indicesStitch1 = new ushort[]{ 0, 1, 4, 4, 1, 2, 0, 4, 3, 4, 2, 5, 3, 4, 6, 6, 4, 8, 8, 4, 5 }; // optimize? patchIndexBuffer[(uint)PatchType.STITCH1] = Buffer<ushort>.New(graphicsDevice, indicesStitch1, BufferFlags.IndexBuffer, SharpDX.Direct3D11.ResourceUsage.Immutable); // Second stitch: Only one triangle at bottom and right ushort[] indicesStitch2 = new ushort[]{ 0, 1, 4, 4, 1, 2, 0, 4, 3, 3, 4, 6, 6, 4, 8, 8, 4, 2 }; // optimize? patchIndexBuffer[(uint)PatchType.STITCH2] = Buffer<ushort>.New(graphicsDevice, indicesStitch2, BufferFlags.IndexBuffer, SharpDX.Direct3D11.ResourceUsage.Immutable); }