Пример #1
0
        public Minimap(Device device, DeviceContext dc, int minimapWidth, int minimapHeight, Terrain terrain, CameraBase viewCam)
        {
            _dc = dc;

            _minimapViewport = new Viewport(0, 0, minimapWidth, minimapHeight);

            CreateMinimapTextureViews(device, minimapWidth, minimapHeight);

            _terrain = terrain;

            SetupOrthoCamera();
            _viewCam = viewCam;

            // frustum vb will contain four corners of view frustum, with first vertex repeated as the last
            var vbd = new BufferDescription(
                VertexPC.Stride * 5,
                ResourceUsage.Dynamic,
                BindFlags.VertexBuffer,
                CpuAccessFlags.Write,
                ResourceOptionFlags.None,
                0
            );
            _frustumVB = new Buffer(device, vbd);

            _edgePlanes = new[] {
            new Plane(1, 0, 0, -_terrain.Width / 2),
            new Plane(-1, 0, 0, _terrain.Width / 2),
            new Plane(0, 1, 0, -_terrain.Depth / 2),
            new Plane(0, -1, 0, _terrain.Depth / 2)
            };

            ScreenPosition = new Vector2(0.25f, 0.75f);
            Size = new Vector2(0.25f, 0.25f);
        }
Пример #2
0
        public void Draw(DeviceContext dc, CameraBase camera) {
            var vp = camera.ViewProj;

            // set shader variables
            _fx.SetViewProj(vp);
            _fx.SetGameTime(_gameTime);
            _fx.SetTimeStep(_timeStep);
            _fx.SetEyePosW(EyePosW);
            _fx.SetEmitPosW(EmitPosW);
            _fx.SetEmitDirW(EmitDirW);
            _fx.SetTexArray(_texArraySRV);
            _fx.SetRandomTex(_randomTexSRV);

            dc.InputAssembler.InputLayout = InputLayouts.Particle;
            dc.InputAssembler.PrimitiveTopology = PrimitiveTopology.PointList;

            var stride = Particle.Stride;
            const int offset = 0;
            
            // bind the input vertex buffer for the stream-out technique
            // use the _initVB when _firstRun = true
            dc.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_firstRun ? _initVB : _drawVB, stride, offset));
            // bind the stream-out vertex buffer
            dc.StreamOutput.SetTargets(new StreamOutputBufferBinding(_streamOutVB, offset));

            // draw the particles using the stream-out technique, which will update the particles positions
            // and output the resulting particles to the stream-out buffer
            var techDesc = _fx.StreamOutTech.Description;
            for (int p = 0; p < techDesc.PassCount; p++) {
                _fx.StreamOutTech.GetPassByIndex(p).Apply(dc);
                if (_firstRun) {
                    dc.Draw(1, 0);
                    _firstRun = false;
                } else {
                    // the _drawVB buffer was populated by the Stream-out technique, so we don't
                    // know how many vertices are contained within it.  Direct3D keeps track of this
                    // internally, however, and we can use DrawAuto to draw everything in the buffer.
                    dc.DrawAuto();
                }
            }
            // Disable stream-out
            dc.StreamOutput.SetTargets(null);

            // ping-pong the stream-out and draw buffers, since we will now want to draw the vertices
            // populated into the buffer that was bound to stream-out
            var temp = _drawVB;
            _drawVB = _streamOutVB;
            _streamOutVB = temp;

            // draw the particles using the draw technique that will transform the points to lines/quads
            dc.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_drawVB, stride, offset));
            techDesc = _fx.DrawTech.Description;
            for (var p = 0; p < techDesc.PassCount; p++) {
                _fx.DrawTech.GetPassByIndex(p).Apply(dc);
                dc.DrawAuto();
            }
        }
Пример #3
0
        public void Draw(DeviceContext dc, CameraBase camera) {
            var eyePos = camera.Position;
            var t = Matrix.Translation(eyePos);
            var wvp = t * camera.ViewProj;

            Effects.SkyFX.SetWorldViewProj(wvp);
            Effects.SkyFX.SetCubeMap(_cubeMapSRV);

            var stride = Marshal.SizeOf(typeof(Vector3));
            const int Offset = 0;
            dc.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_vb, stride, Offset));
            dc.InputAssembler.SetIndexBuffer(_ib, Format.R32_UInt, 0);
            dc.InputAssembler.InputLayout = InputLayouts.Pos;
            dc.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
            var tech = Effects.SkyFX.SkyTech;
            for (var p = 0; p < tech.Description.PassCount; p++) {
                var pass = tech.GetPassByIndex(p);
                pass.Apply(dc);
                dc.DrawIndexed(_indexCount, 0, 0);
            }
        }
Пример #4
0
        private void DrawScene(CameraBase camera, bool drawCenterSphere)
        {
            ImmediateContext.InputAssembler.InputLayout = InputLayouts.Basic32;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

            Matrix view = camera.View;
            Matrix proj = camera.Proj;
            Matrix viewProj = camera.ViewProj;
            Effects.BasicFX.SetEyePosW(camera.Position);
            Effects.BasicFX.SetDirLights(_dirLights);

            var activeTexTech = Effects.BasicFX.Light1TexTech;
            var activeSkullTech = Effects.BasicFX.Light1ReflectTech;
            var activeReflectTech = Effects.BasicFX.Light1TexReflectTech;
            switch (_lightCount) {
                case 1:
                    activeTexTech = Effects.BasicFX.Light1TexTech;
                    activeSkullTech = Effects.BasicFX.Light1ReflectTech;
                    activeReflectTech = Effects.BasicFX.Light1TexReflectTech;
                    break;
                case 2:
                    activeTexTech = Effects.BasicFX.Light2TexTech;
                    activeSkullTech = Effects.BasicFX.Light2ReflectTech;
                    activeReflectTech = Effects.BasicFX.Light2TexReflectTech;
                    break;
                case 3:
                    activeTexTech = Effects.BasicFX.Light3TexTech;
                    activeSkullTech = Effects.BasicFX.Light3ReflectTech;
                    activeReflectTech = Effects.BasicFX.Light3TexReflectTech;
                    break;
            }
            for (int p = 0; p < activeSkullTech.Description.PassCount; p++) {
                var pass = activeSkullTech.GetPassByIndex(p);
                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_skullVB, Basic32.Stride, 0));
                ImmediateContext.InputAssembler.SetIndexBuffer(_skullIB, Format.R32_UInt, 0);

                var world = _skullWorld;
                var worldInvTranspose = MathF.InverseTranspose(world);
                var wvp = world * viewProj;
                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose);
                Effects.BasicFX.SetTexTransform(Matrix.Identity);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetMaterial(_skullMat);
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0);
            }
            // draw grid, box, cylinders without reflection
            for (var p = 0; p < activeTexTech.Description.PassCount; p++) {
                var pass = activeTexTech.GetPassByIndex(p);
                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_shapesVB, Basic32.Stride, 0));
                ImmediateContext.InputAssembler.SetIndexBuffer(_shapesIB, Format.R32_UInt, 0);

                var world = _gridWorld;
                var worldInvTranspose = MathF.InverseTranspose(world);
                var wvp = world * view * proj;
                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetTexTransform(Matrix.Scaling(6, 8, 1));
                Effects.BasicFX.SetMaterial(_gridMat);
                Effects.BasicFX.SetDiffuseMap(_floorTexSRV);
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_gridIndexCount, _gridIndexOffset, _gridVertexOffset);

                world = _boxWorld;
                worldInvTranspose = MathF.InverseTranspose(world);
                wvp = world * viewProj;
                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetTexTransform(Matrix.Identity);
                Effects.BasicFX.SetMaterial(_boxMat);
                Effects.BasicFX.SetDiffuseMap(_stoneTexSRV);
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_boxIndexCount, _boxIndexOffset, _boxVertexOffset);

                foreach (var matrix in _cylWorld) {
                    world = matrix;
                    worldInvTranspose = MathF.InverseTranspose(world);
                    wvp = world * viewProj;
                    Effects.BasicFX.SetWorld(world);
                    Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose);
                    Effects.BasicFX.SetWorldViewProj(wvp);
                    Effects.BasicFX.SetTexTransform(Matrix.Identity);
                    Effects.BasicFX.SetMaterial(_cylinderMat);
                    Effects.BasicFX.SetDiffuseMap(_brickTexSRV);
                    pass.Apply(ImmediateContext);
                    ImmediateContext.DrawIndexed(_cylinderIndexCount, _cylinderIndexOffset, _cylinderVertexOffset);
                }
                foreach (var matrix in _sphereWorld) {
                    world = matrix;
                    worldInvTranspose = MathF.InverseTranspose(world);
                    wvp = world * viewProj;
                    Effects.BasicFX.SetWorld(world);
                    Effects.BasicFX.SetWorldInvTranspose(worldInvTranspose);
                    Effects.BasicFX.SetWorldViewProj(wvp);
                    Effects.BasicFX.SetTexTransform(Matrix.Identity);
                    Effects.BasicFX.SetMaterial(_sphereMat);
                    Effects.BasicFX.SetDiffuseMap(_stoneTexSRV);
                    pass.Apply(ImmediateContext);
                    ImmediateContext.DrawIndexed(_sphereIndexCount, _sphereIndexOffset, _sphereVertexOffset);
                }
            }
            if (drawCenterSphere) {
                for (int p = 0; p < activeReflectTech.Description.PassCount; p++) {
                    var pass = activeReflectTech.GetPassByIndex(p);
                    var world = _centerSphereWorld;
                    var wit = MathF.InverseTranspose(world);
                    var wvp = world * viewProj;
                    Effects.BasicFX.SetWorld(world);
                    Effects.BasicFX.SetWorldInvTranspose(wit);
                    Effects.BasicFX.SetWorldViewProj(wvp);
                    Effects.BasicFX.SetTexTransform(Matrix.Identity);
                    Effects.BasicFX.SetMaterial(_centerSphereMat);
                    Effects.BasicFX.SetDiffuseMap(_stoneTexSRV);
                    Effects.BasicFX.SetCubeMap(_dynamicCubeMapSRV);

                    pass.Apply(ImmediateContext);
                    ImmediateContext.DrawIndexed(_sphereIndexCount, _sphereIndexOffset, _sphereVertexOffset);

                }
            }
            _sky.Draw(ImmediateContext, camera);

            ImmediateContext.Rasterizer.State = null;
            ImmediateContext.OutputMerger.DepthStencilState = null;
            ImmediateContext.OutputMerger.DepthStencilReference = 0;
        }
Пример #5
0
        public void ComputeSsao(CameraBase camera) {
            _dc.OutputMerger.SetTargets((DepthStencilView)null, _ambientRTV0);
            _dc.ClearRenderTargetView(_ambientRTV0, Color.Black);
            _dc.Rasterizer.SetViewports(_ambientMapViewport);

            var T = Matrix.Identity;
            T.M11 = 0.5f;
            T.M22 = -0.5f;
            T.M41 = 0.5f;
            T.M42 = 0.5f;

            var P = camera.Proj;
            var pt = P * T;

            Effects.SsaoFX.SetViewToTexSpace(pt);
            Effects.SsaoFX.SetOffsetVectors(_offsets);
            Effects.SsaoFX.SetFrustumCorners(_frustumFarCorners);
            Effects.SsaoFX.SetNormalDepthMap(_normalDepthSRV);
            Effects.SsaoFX.SetRandomVecMap(_randomVectorSRV);

            var stride = Basic32.Stride;
            const int Offset = 0;

            _dc.InputAssembler.InputLayout = InputLayouts.Basic32;
            _dc.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
            _dc.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_screenQuadVB, stride, Offset));
            _dc.InputAssembler.SetIndexBuffer(_screenQuadIB, Format.R16_UInt, 0);

            var tech = Effects.SsaoFX.SsaoTech;
            for (var p = 0; p < tech.Description.PassCount; p++) {
                tech.GetPassByIndex(p).Apply(_dc);
                _dc.DrawIndexed(6, 0, 0);
            }
        }