示例#1
0
        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;
        }
示例#2
0
 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)
 {
 }
示例#4
0
 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;
 }
示例#5
0
        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();
        }
示例#6
0
        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);
            }