示例#1
0
        protected override void _Render(DXCamera camera)
        {
            EffectTechnique technique = _shader.DXEffect.GetTechniqueByIndex(0);

            for (int i = 0; i < 5; i++)
            {
                if (_vertexBuffer2[i] != null && Program.DXSceneOptions.LevelVisibility[i])
                {
                    DXContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_vertexBuffer2[i], Marshal.SizeOf(typeof(DXMEV)), 0));
                    DXContext.InputAssembler.SetIndexBuffer(_indexBuffer2[i], Format.R32_UInt, 0);
                    DXContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
                    DXContext.InputAssembler.InputLayout       = _inputLayout;

                    _shader.SetParameter("worldMatrix", Matrix.Identity);
                    _shader.SetParameter("viewMatrix", camera.ViewMatrix);
                    _shader.SetParameter("projectionMatrix", camera.ProjMatrix);
                    _shader.SetParameter("wvp", Matrix.Identity * camera.ViewMatrix * camera.ProjMatrix);


                    EffectPass usePass = technique.GetPassByIndex(0);
                    usePass.Apply(DXContext);
                    DXContext.DrawIndexed(IndexCount2[i], 0, 0);
                    usePass.Dispose();


                    usePass = technique.GetPassByIndex(1);
                    usePass.Apply(DXContext);
                    DXContext.DrawIndexed(IndexCount2[i], 0, 0);
                    usePass.Dispose();
                }
            }
            technique.Dispose();
        }
示例#2
0
        public void Blit(Effect effect, EffectTechnique technique, params RenderTargetView[] targets)
        {
            view.Device10.OutputMerger.SetTargets(targets);

            /*foreach(var target in targets)
             *  view.Device10.ClearRenderTargetView(target, Color.Black);*/
            view.Device10.Rasterizer.SetViewports(new SlimDX.Direct3D10.Viewport
            {
                Width  = ((Texture2D)targets[0].Resource).Description.Width,
                Height = ((Texture2D)targets[0].Resource).Description.Height,
                MaxZ   = 1
            });

            var sp = view.Content.Acquire <Content.Mesh10>(screenPlane);

            sp.Setup(view.Device10, view.Content.Acquire <InputLayout>(new Graphics.Content.VertexStreamLayoutFromEffect
            {
                Signature10 = technique.GetPassByIndex(0).Description.Signature,
                Layout      = sp.VertexStreamLayout
            }));

            technique.GetPassByIndex(0).Apply();
            sp.Draw(view.Device10);
            view.Device10.OutputMerger.SetTargets((RenderTargetView)null);
        }
示例#3
0
        public override void DrawScene()
        {
            base.DrawScene();
            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.LightSteelBlue);
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            ImmediateContext.InputAssembler.InputLayout       = _inputLayout;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

            for (int i = 0; i < _tech.Description.PassCount; i++)
            {
                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_landVB, VertexPC.Stride, 0));
                ImmediateContext.InputAssembler.SetIndexBuffer(_landIB, Format.R32_UInt, 0);

                _fxWVP.SetMatrix(_gridWorld * _view * _proj);
                var pass = _tech.GetPassByIndex(i);
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_gridIndexCount, 0, 0);

                ImmediateContext.Rasterizer.State = _wireframeRS;
                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_wavesVB, VertexPC.Stride, 0));
                ImmediateContext.InputAssembler.SetIndexBuffer(_wavesIB, Format.R32_UInt, 0);

                _fxWVP.SetMatrix(_wavesWorld * _view * _proj);
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(3 * _waves.TriangleCount, 0, 0);

                ImmediateContext.Rasterizer.State = null;
            }
            SwapChain.Present(0, PresentFlags.None);
        }
示例#4
0
        public override void DrawScene()
        {
            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.SteelBlue);
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1, 0);

            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
            ImmediateContext.InputAssembler.InputLayout       = inputLayout;

            var array = Util.GetArray(dirLights);

            fxDirLights.SetRawValue(new DataStream(array, false, false), array.Length);

            fxEyePosW.Set(eyePosW);

            for (int i = 0; i < effectTechnique.Description.PassCount; i++)
            {
                for (int j = 0; j < shapes.Count; j++)
                {
                    ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(shapes[j].VertexBuffer, Basic32.Stride, 0));
                    ImmediateContext.InputAssembler.SetIndexBuffer(shapes[j].IndexBuffer, Format.R32_UInt, 0);

                    fxW.SetMatrix(shapes[j].ShapeWorld);
                    fxWIT.SetMatrix(MathF.InverseTranspose(shapes[j].ShapeWorld));
                    array = Util.GetArray(((ShapeWithTextureBase)shapes[j]).ShapeMaterial);
                    fxMaterial.SetRawValue(new DataStream(array, false, false), array.Length);
                    fxDiffuseMap.SetResource(((ShapeWithTextureBase)shapes[j]).ShapeTexture);
                    fxWVP.SetMatrix(shapes[j].ShapeWorld * view * projection);
                    fxTT.SetMatrix(Matrix.Identity);

                    effectTechnique.GetPassByIndex(i).Apply(ImmediateContext);
                    ImmediateContext.DrawIndexed(shapes[j].IndexCount, 0, 0);
                }
            }
            SwapChain.Present(0, PresentFlags.None);
        }
示例#5
0
        public override void DrawScene()
        {
            base.DrawScene();
            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.LightSteelBlue);
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            ImmediateContext.InputAssembler.InputLayout       = _inputLayout;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

            ImmediateContext.Rasterizer.State = _wireframeRS;

            ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_vb, VertexPC.Stride, 0));
            ImmediateContext.InputAssembler.SetIndexBuffer(_ib, Format.R32_UInt, 0);

            var wvp = _skullWorld * _view * _proj;

            _fx.SetWorldViewProj(wvp);

            for (var i = 0; i < _tech.Description.PassCount; i++)
            {
                _tech.GetPassByIndex(i).Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0);
            }
            SwapChain.Present(0, PresentFlags.None);
        }
示例#6
0
        void drawBackground()
        {
            _device.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_surfaceVertexBuffer, Marshal.SizeOf(typeof(Vertex)), 0));
            _device.InputAssembler.SetIndexBuffer(_surfaceIndexBuffer, SharpDX.DXGI.Format.R32_UInt, 0);

            _technique.GetPassByIndex(2).Apply();
            _device.DrawIndexed(_surfaceIndexCount, 0, 0);
        }
示例#7
0
        public override void Draw(EngineTime time, ref SharpDX.Matrix world, ref SharpDX.Matrix view, ref SharpDX.Matrix projection)
        {
            if (Material == null)
            {
                return;
            }
            var transformedWorld = Transformation * world;

            var ia = Engine.Device.ImmediateContext.InputAssembler;

            EffectTechnique tech = Material.CurrentTechnique;

            Material.Effect.Apply(ref world, ref view, ref projection);
            Material.Apply(Model.Parameters);

            var skinnedEffect = Material.Effect as Effects.SkinnedEffect;

            if (skinnedEffect != null)
            {
                var      boneList    = Model.Definition.BoneLists[Primitive.BaseMesh.Header.BoneListIndex];
                Matrix[] jointMatrix = new Matrix[boneList.ActualCount];
                for (var i = 0; i < boneList.ActualCount; ++i)
                {
                    jointMatrix[i] = Model.JointMatrixArray[boneList.Bones[i]];
                }

                skinnedEffect.JointMatrixArray = jointMatrix;
            }

            ia.PrimitiveTopology = SharpDX.Direct3D.PrimitiveTopology.TriangleList;
            ia.SetVertexBuffers(0, Primitive.VertexBufferBinding);
            ia.SetIndexBuffer(Primitive.IndexBuffer, SharpDX.DXGI.Format.R16_UInt, 0);

            InputLayout inputLayout = Material.Effect.GetInputLayout(tech.GetPassByIndex(0));

            ia.InputLayout = inputLayout;

            for (var i = 0; i < tech.Description.PassCount; ++i)
            {
                var pass = tech.GetPassByIndex(i);

                pass.Apply(Engine.Device.ImmediateContext);

                if (Parts.Length == 0)
                {
                    Engine.Device.ImmediateContext.DrawIndexed(Primitive.BaseMesh.Header.IndexCount, 0, 0);
                }
                else
                {
                    foreach (var part in Parts)
                    {
                        part.Draw(Engine.Device);
                    }
                }
            }
        }
示例#8
0
        void RenderScene()
        {
            lock (syncObject)
            {
                if (device == null)
                {
                    CreateDeviceResources();
                }

                if (!pause)
                {
                    if (lastSavedDelta != 0)
                    {
                        startTime      = Environment.TickCount - lastSavedDelta;
                        lastSavedDelta = 0;
                    }
                    currentTimeVariation = (Environment.TickCount - startTime) / 6000.0f;
                    worldMatrix          = MatrixMath.MatrixTranslate(0, 0, currentTimeVariation);
                    textBrush.Transform  = Matrix3x2F.Translation(0, (4096f / 16f) * currentTimeVariation);
                }

                device.ClearDepthStencilView(
                    depthStencilView,
                    ClearOptions.Depth,
                    1,
                    0
                    );

                // Clear the back buffer
                device.ClearRenderTargetView(renderTargetView, backColor);

                diffuseVariable.Resource = null;

                technique.GetPassByIndex(0).Apply();

                // Draw the D2D content into our D3D surface
                RenderD2DContentIntoSurface();

                diffuseVariable.Resource = textureResourceView;

                // Update variables
                worldMatrixVariable.Matrix = worldMatrix;

                // Set index buffer
                device.IA.IndexBuffer = new IndexBuffer(facesIndexBuffer, Format.R16UInt, 0);

                // Draw the scene
                technique.GetPassByIndex(0).Apply();

                device.DrawIndexed((uint)Marshal.SizeOf(VertexArray.VerticesInstance), 0, 0);

                swapChain.Present(0, Microsoft.WindowsAPICodePack.DirectX.Graphics.PresentOptions.None);
            }
        }
示例#9
0
文件: Program.cs 项目: mrommel/dx11
        public override void DrawScene()
        {
            base.DrawScene();

            ImmediateContext.ClearRenderTargetView(RenderTargetView, Color.LightSteelBlue);
            ImmediateContext.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

            ImmediateContext.InputAssembler.InputLayout       = _inputLayout;
            ImmediateContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

            var viewProj = _view * _proj;
            var array    = Util.GetArray(_dirLight);

            _fxDirLight.SetRawValue(new DataStream(array, false, false), array.Length);
            array = Util.GetArray(_pointLight);
            _fxPointLight.SetRawValue(new DataStream(array, false, false), array.Length);
            array = Util.GetArray(_spotLight);
            _fxSpotLight.SetRawValue(new DataStream(array, false, false), array.Length);

            _fxEyePosW.Set(_eyePosW);

            for (int i = 0; i < _tech.Description.PassCount; i++)
            {
                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_landVB, VertexPN.Stride, 0));
                ImmediateContext.InputAssembler.SetIndexBuffer(_landIB, Format.R32_UInt, 0);

                _fxWVP.SetMatrix(_landWorld * viewProj);
                var invTranspose = Matrix.Invert(Matrix.Transpose(_landWorld));
                _fxWIT.SetMatrix(invTranspose);
                _fxWorld.SetMatrix(_landWorld);
                array = Util.GetArray(_landMaterial);
                _fxMaterial.SetRawValue(new DataStream(array, false, false), array.Length);

                var pass = _tech.GetPassByIndex(i);
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_landIndexCount, 0, 0);

                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_waveVB, VertexPN.Stride, 0));
                ImmediateContext.InputAssembler.SetIndexBuffer(_waveIB, Format.R32_UInt, 0);

                _fxWVP.SetMatrix(_wavesWorld * viewProj);
                invTranspose = Matrix.Invert(Matrix.Transpose(_wavesWorld));
                _fxWIT.SetMatrix(invTranspose);
                _fxWorld.SetMatrix(_wavesWorld);
                array = Util.GetArray(_wavesMaterial);
                _fxMaterial.SetRawValue(new DataStream(array, false, false), array.Length);
                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(3 * _waves.TriangleCount, 0, 0);
            }

            SwapChain.Present(0, PresentFlags.None);
        }
        public void Load()
        {
            try
            {
                string path = Path.Combine(ShaderManager.ShadaresFolder, "EffectShaded.fx");
                using (ShaderBytecode effectByteCode = ShaderBytecode.CompileFromFile(
                           path,
                           "Render",
                           "fx_5_0",
                           ShaderFlags.EnableStrictness,
                           EffectFlags.None))
                {
                    effect         = new Effect(DeviceManager.Instance.device, effectByteCode);
                    technique      = effect.GetTechniqueByIndex(0);
                    pass           = technique.GetPassByIndex(0);
                    inputSignature = pass.Description.Signature;
                }

                layout = new InputLayout(DeviceManager.Instance.device, inputSignature, elements);

                tmat     = effect.GetVariableByName("gWVP").AsMatrix();
                invW     = effect.GetVariableByName("inv_world_matrix").AsMatrix();
                lightPos = effect.GetVariableByName("LightPosition").AsVector();
                color    = effect.GetVariableByName("color").AsVector();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
示例#11
0
文件: Waves.cs 项目: virus-404/dx11
        public void Draw(DeviceContext dc, EffectTechnique waveTech, Matrix viewProj)
        {
            for (var p = 0; p < waveTech.Description.PassCount; p++)
            {
                var world = _grid.World;
                var wit   = MathF.InverseTranspose(world);
                var wvp   = world * viewProj;

                Effects.WavesFX.SetWorld(world);
                Effects.WavesFX.SetWorldInvTranspose(wit);
                Effects.WavesFX.SetViewProj(viewProj);
                Effects.WavesFX.SetWorldViewProj(wvp);
                Effects.WavesFX.SetTexTransform(_grid.TexTransform);
                Effects.WavesFX.SetWaveDispTexTransform0(_wavesDispTexTransform0);
                Effects.WavesFX.SetWaveDispTexTransform1(_wavesDispTexTransform1);
                Effects.WavesFX.SetWaveNormalTexTransform0(_wavesNormalTexTransform0);
                Effects.WavesFX.SetWaveNormalTexTransform1(_wavesNormalTexTransform1);
                Effects.WavesFX.SetMaterial(_grid.Model.Materials[0]);
                Effects.WavesFX.SetDiffuseMap(_grid.Model.DiffuseMapSRV[0]);
                Effects.WavesFX.SetNormalMap0(NormalMap0);
                Effects.WavesFX.SetNormalMap1(NormalMap1);

                waveTech.GetPassByIndex(p).Apply(dc);
                _grid.Model.ModelMesh.Draw(dc, 0);
            }
        }
示例#12
0
        public DxEffect(SlimDX.Direct3D10.Device device, string shaderFileName = "scene.fx")
        {
//            using (var bytecode = ShaderBytecode.CompileFromFile(shaderFileName, "VShader", vs))

            _dxDevice = device;
            _effect   = Effect.FromFile(_dxDevice, shaderFileName, "fx_4_0",
                                        ShaderFlags.None, EffectFlags.None, null, null);

            _technique  = _effect.GetTechniqueByName("Render"); //C++ Comparaison// technique = effect->GetTechniqueByName( "Render" );
            _effectPass = _technique.GetPassByIndex(0);

            _worldVariable      = _effect.GetVariableByName("World").AsMatrix(); //C++ Comparaison// worldVariable = effect->GetVariableByName( "World" )->AsMatrix();
            _viewVariable       = _effect.GetVariableByName("View").AsMatrix();
            _projectionVariable = _effect.GetVariableByName("Projection").AsMatrix();


            ShaderSignature signature = _effectPass.Description.Signature;

            _inputLayout = new InputLayout(_dxDevice, signature, new[]
            {
                //C++...//      { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
                new InputElement("POSITION", 0, SlimDX.DXGI.Format.R32G32B32A32_Float, 0, 0),                                                       // 8bits = 1 bytes, so 32bits = 4 bytes, then R32+G32+B32+A32 = 4+4+4+4 = 16 bytes
                new InputElement("COLOR", 0, SlimDX.DXGI.Format.R32G32B32A32_Float, 16, 0)                                                          // 16 = total bytes from the element before, here it's "POSITION"
            });
            _effect.Optimize();
        }
示例#13
0
文件: Program.cs 项目: mrommel/dx11
        private void DrawRoom(EffectTechnique activeTech, Matrix viewProj)
        {
            // Draw floor and walls
            for (int p = 0; p < activeTech.Description.PassCount; p++)
            {
                var pass = activeTech.GetPassByIndex(p);

                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_roomVB, Basic32.Stride, 0));

                var world = _roomWorld;
                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(_roomMat);

                Effects.BasicFX.SetDiffuseMap(_floorDiffuseMapSRV);
                pass.Apply(ImmediateContext);
                ImmediateContext.Draw(6, 0);

                Effects.BasicFX.SetDiffuseMap(_wallDiffuseMapSRV);
                pass.Apply(ImmediateContext);
                ImmediateContext.Draw(18, 6);
            }
        }
示例#14
0
文件: Program.cs 项目: mrommel/dx11
        private void DrawMirror(EffectTechnique activeTech, Matrix viewProj, Color4 blendFactor)
        {
            // draw mirror with transparency
            for (int p = 0; p < activeTech.Description.PassCount; p++)
            {
                var pass = activeTech.GetPassByIndex(p);

                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_roomVB, Basic32.Stride, 0));

                var world = _roomWorld;
                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(_mirrorMat);
                Effects.BasicFX.SetDiffuseMap(_mirrorDiffuseMapSRV);

                ImmediateContext.OutputMerger.BlendState      = RenderStates.TransparentBS;
                ImmediateContext.OutputMerger.BlendFactor     = blendFactor;
                ImmediateContext.OutputMerger.BlendSampleMask = -1;

                pass.Apply(ImmediateContext);
                ImmediateContext.Draw(6, 24);
            }
        }
示例#15
0
        public void Render()
        {
            if (_particleSystem == null)
            {
                return;
            }
            if (_playing == false)
            {
                return;
            }
            if (_particleSystem.MaxParticles > _bufferSize)
            {
                _bufferSize = _particleSystem.MaxParticles + 500;
                DebugLog.Log("Buffer too small. Increasing size...", "Particle Emitter");
                CreateBuffer();
            }

            _textureVar.SetResource(_textureResourceView);
            _viewInvVar.SetMatrix(_context.Camera.ViewInverseMatrix);
            _viewProjVar.SetMatrix(_context.Camera.ViewProjectionMatrix);

            _context.Device.InputAssembler.InputLayout       = _inputLayout;
            _context.Device.InputAssembler.PrimitiveTopology = PrimitiveTopology.PointList;
            _context.Device.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_vertexBuffer, _vertexStride, 0));

            for (int i = 0; i < _technique.Description.PassCount; ++i)
            {
                _technique.GetPassByIndex(i).Apply();
                _context.Device.OutputMerger.BlendState = _blendStates[(int)_particleSystem.BlendMode];
                _context.Device.Draw(_particleCount, 0);
            }
        }
示例#16
0
        public void Load()
        {
            try
            {
                string path = Path.Combine(ShaderManager.ShadaresFolder, "transformEffectWireframe.fx");
                using (ShaderBytecode effectByteCode = ShaderBytecode.CompileFromFile(
                           path,
                           "Render",
                           "fx_5_0",
                           ShaderFlags.EnableStrictness,
                           EffectFlags.None))
                {
                    effect         = new Effect(DeviceManager.Instance.device, effectByteCode);
                    technique      = effect.GetTechniqueByIndex(0);
                    pass           = technique.GetPassByIndex(0);
                    inputSignature = pass.Description.Signature;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

            var elements = new[] {
                new InputElement("POSITION", 0, Format.R32G32B32_Float, 0),
            };

            layout = new InputLayout(DeviceManager.Instance.device, inputSignature, elements);

            tmat  = effect.GetVariableByName("gWVP").AsMatrix();
            wfCol = effect.GetVariableByName("colorWireframe").AsVector();
            mCol  = effect.GetVariableByName("colorSolid").AsVector();
        }
        private void LoadEffect(string shaderFileName)
        {
            _effect = Effect.FromFile(_dxDevice, shaderFileName, "fx_4_0",
                                      ShaderFlags.None, EffectFlags.None, null, null);

            _renderTech = _effect.GetTechniqueByName("Render"); //C++ Comparaison// technique = effect->GetTechniqueByName( "Render" );

            _eyePosWVar    = _effect.GetVariableByName("gEyePosW").AsVector();
            _viewProjVar   = _effect.GetVariableByName("gViewProj").AsMatrix();
            _worldVar      = _effect.GetVariableByName("gWorld").AsMatrix();
            _fillColorVar  = _effect.GetVariableByName("gFillColor").AsVector();
            _lightVariable = _effect.GetVariableByName("gLight");

            _imageMapVar = _effect.GetVariableByName("gImageMap").AsResource();
            _depthMapVar = _effect.GetVariableByName("gDepthMap").AsResource();

            _resVar              = _effect.GetVariableByName("gRes").AsVector();
            _depthToRgbVar       = _effect.GetVariableByName("gDepthToRgb").AsMatrix();
            _focalLengthDepthVar = _effect.GetVariableByName("gFocalLengthDepth").AsScalar();
            _focalLengthImageVar = _effect.GetVariableByName("gFocalLengthImage").AsScalar();

            ShaderSignature signature = _renderTech.GetPassByIndex(0).Description.Signature;

            _inputLayout = new InputLayout(_dxDevice, signature,
                                           new[] { new InputElement("POSITION", 0, SlimDX.DXGI.Format.R16G16_SInt, 0, 0) });
        }
        public override void Initialize()
        {
            base.Initialize();

            try
            {
                using (ShaderBytecode effectByteCode = ShaderBytecode.CompileFromFile(
                           "Shaders/transformEffectWireframe.fx",
                           "Render",
                           "fx_5_0",
                           ShaderFlags.EnableStrictness,
                           EffectFlags.None))
                {
                    effect         = new SlimDX.Direct3D11.Effect(DeviceManager.Instance.device, effectByteCode);
                    technique      = effect.GetTechniqueByIndex(0);
                    pass           = technique.GetPassByIndex(0);
                    inputSignature = pass.Description.Signature;
                }

                var elements = new[] {
                    new InputElement("POSITION", 0, Format.R32G32B32_Float, 0),
                };
                layout = new InputLayout(DeviceManager.Instance.device, inputSignature, elements);

                tmat  = effect.GetVariableByName("gWVP").AsMatrix();
                wfCol = effect.GetVariableByName("colorWireframe").AsVector();
                mCol  = effect.GetVariableByName("colorSolid").AsVector();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
示例#19
0
        void IScene.Render()
        {
            Device device = this.Host.Device;

            if (device == null)
            {
                return;
            }

            device.InputAssembler.InputLayout       = this.VertexLayout;
            device.InputAssembler.PrimitiveTopology = SharpDX.Direct3D.PrimitiveTopology.TriangleStrip;
            device.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(this.Vertices, 32, 0));
            device.InputAssembler.SetIndexBuffer(Indices, Format.R32_UInt, 0);

            device.Rasterizer.SetViewports(viewport);

            EffectTechnique technique = this.SimpleEffect.GetTechniqueByIndex(0);
            EffectPass      pass      = technique.GetPassByIndex(0);

            //EffectVectorVariable overlayColor = this.SimpleEffect.GetVariableBySemantic("OverlayColor").AsVector();
            //overlayColor.Set(this.OverlayColor);

            for (int i = 0; i < technique.Description.PassCount; ++i)
            {
                pass.Apply();

                for (int j = 0; j < nrTextures; j++)
                {
                    device.PixelShader.SetShaderResource(j, textureView[j]);
                }

                device.DrawIndexed(nrIndices, 0, 0);
            }
        }
示例#20
0
        void IScene.Render()
        {
            Device device = this.Host.Device;

            if (device == null)
            {
                return;
            }

            device.InputAssembler.InputLayout       = this.VertexLayout;
            device.InputAssembler.PrimitiveTopology = SharpDX.Direct3D.PrimitiveTopology.TriangleList;
            device.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(this.Vertices, 32, 0));

            EffectTechnique technique = this.SimpleEffect.GetTechniqueByIndex(0);
            EffectPass      pass      = technique.GetPassByIndex(0);

            EffectVectorVariable overlayColor = this.SimpleEffect.GetVariableBySemantic("OverlayColor").AsVector();

            overlayColor.Set(this.OverlayColor);

            for (int i = 0; i < technique.Description.PassCount; ++i)
            {
                pass.Apply();
                device.Draw(3, 0);
            }
        }
示例#21
0
        public void Render(int arg)
        {
            D3DDevice.OutputMerger.SetTargets(SampleDepthView, SampleRenderView);
            D3DDevice.Rasterizer.SetViewports(new Viewport(0, 0, WindowWidth, WindowHeight, 0.0f, 1.0f));

            D3DDevice.ClearDepthStencilView(SampleDepthView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);
            float c = ((float)(arg % 1000)) / 999.0f;

            D3DDevice.ClearRenderTargetView(SampleRenderView, new SlimDX.Color4(1.0f, c, c, c));

            D3DDevice.InputAssembler.SetInputLayout(SampleLayout);
            D3DDevice.InputAssembler.SetPrimitiveTopology(PrimitiveTopology.TriangleList);
            D3DDevice.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(SampleVertices, 32, 0));

            EffectTechnique technique = SampleEffect.GetTechniqueByIndex(0);
            EffectPass      pass      = technique.GetPassByIndex(0);

            for (int i = 0; i < technique.Description.PassCount; ++i)
            {
                pass.Apply();
                D3DDevice.Draw(3, 0);
            }

            D3DDevice.Flush();
        }
        public static void RenderFullScreenQuad(ShaderResourceView srv)
        {
            Shader e = WorldData.GetObject("FullScreenQuad.fx") as Shader;

            if (e == null)
            {
                return;
            }
            ShaderHelper.UpdateCommonEffectVars(e, Matrix.Identity);
            EffectTechnique t = e.EffectObj.GetTechniqueByName("FullScreen");

            Game.Device.InputAssembler.SetPrimitiveTopology(PrimitiveTopology.TriangleList);

            for (int p = 0; p < t.Description.PassCount; p++)
            {
                EffectPass  pass = t.GetPassByIndex(p);
                InputLayout l    = ShaderHelper.ConstructInputLayout(MeshInputElements10.FullScreenQuad, pass.Description.Signature);
                Game.Device.InputAssembler.SetInputLayout(l);

                EffectResourceVariable diffTex = e.GetVar(ShaderHelper.DiffTex).AsResource();
                if (diffTex != null)
                {
                    diffTex.SetResource(srv);
                }
                pass.Apply();
                Game.Device.Draw(3, 0);
            }
        }
        public void Render(DxCamera camera)
        {
            if (_vertexBuffer == null || _vertexCount == 0)
            {
                return;
            }

            _worldVar.SetMatrix(Matrix.Scaling(Scale, -Scale, Scale));
            _eyePosWVar.Set(camera.Eye);
            _viewProjVar.SetMatrix(camera.View * camera.Projection);
            _fillColorVar.Set(_fillColor);

            _resVar.Set(new Vector2(_xRes, _yRes));
            _focalLengthDepthVar.Set(_focalLengthDepth);
            _focalLengthImageVar.Set(_focalLengthImage);
            _depthToRgbVar.SetMatrix(_depthToRgb);

            _depthMapVar.SetResource(_depthMapBufferRV);
            _imageMapVar.SetResource(_imageTextureRV);

            _dxDevice.InputAssembler.SetInputLayout(_inputLayout);
            _dxDevice.InputAssembler.SetPrimitiveTopology(PrimitiveTopology.PointList);
            _dxDevice.InputAssembler.SetVertexBuffers(0,
                                                      new VertexBufferBinding(_vertexBuffer, PointVertex.SizeOf, 0));

            for (int p = 0; p < _renderTech.Description.PassCount; p++)
            {
                _renderTech.GetPassByIndex(p).Apply();
                _dxDevice.Draw(_vertexCount, 0);
            }
        }
        public void Load()
        {
            try
            {
                using (ShaderBytecode effectByteCode = ShaderBytecode.CompileFromFile(
                           Path.Combine(ShaderManager.ShadaresFolder, "ColorEffectInstanced.fx"),
                           "Render",
                           "fx_5_0",
                           ShaderFlags.EnableStrictness,
                           EffectFlags.None))
                {
                    effect         = new Effect(DeviceManager.Instance.device, effectByteCode);
                    technique      = effect.GetTechniqueByIndex(0);
                    pass           = technique.GetPassByIndex(0);
                    inputSignature = pass.Description.Signature;
                }

                layout = new InputLayout(DeviceManager.Instance.device, inputSignature, elements);

                tmat = effect.GetVariableByName("gWVP").AsMatrix();


                Vector4 col = new Vector4(0, 0, 0, 1);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
        private void LoadEffect(string fileName)
        {
            _effect = Effect.FromFile(_dxDevice, fileName, "fx_4_0",
                                      ShaderFlags.None, EffectFlags.None, null, null);

            _streamOutTech = _effect.GetTechniqueByName("StreamOutTech");
            _drawTech      = _effect.GetTechniqueByName("DrawTech");

            _viewProjVar  = _effect.GetVariableByName("gViewProj").AsMatrix();
            _gameTimeVar  = _effect.GetVariableByName("gGameTime").AsScalar();
            _timeStepVar  = _effect.GetVariableByName("gTimeStep").AsScalar();
            _eyePosVar    = _effect.GetVariableByName("gEyePosW").AsVector();
            _emitPosVar   = _effect.GetVariableByName("gEmitPosW").AsVector();
            _emitDirVar   = _effect.GetVariableByName("gEmitDirW").AsVector();
            _texArrayVar  = _effect.GetVariableByName("gTexArray").AsResource();
            _randomTexVar = _effect.GetVariableByName("gRandomTex").AsResource();

            ShaderSignature signature = _streamOutTech.GetPassByIndex(0).Description.Signature;

            _vertexLayout = new InputLayout(_dxDevice, signature,
                                            new[] {
                new InputElement("POSITION", 0, Format.R32G32B32_Float, 0, 0),
                new InputElement("VELOCITY", 0, Format.R32G32B32_Float, 12, 0),
                new InputElement("SIZE", 0, Format.R32G32_Float, 24, 0),
                new InputElement("AGE", 0, Format.R32_Float, 32, 0),
                new InputElement("TYPE", 0, Format.R32_UInt, 36, 0)
            });
        }
示例#26
0
        public void Initialize(Device device)
        {
            _b = EffectUtils.Load(ShadersResourceManager.Manager, "DeferredTransparent");
            E  = new Effect(device, _b);

            TechDebug                 = E.GetTechniqueByName("Debug");
            TechDebugPost             = E.GetTechniqueByName("DebugPost");
            TechDebugLighting         = E.GetTechniqueByName("DebugLighting");
            TechDebugLocalReflections = E.GetTechniqueByName("DebugLocalReflections");
            TechCombine0              = E.GetTechniqueByName("Combine0");

            for (var i = 0; i < TechDebug.Description.PassCount && InputSignaturePT == null; i++)
            {
                InputSignaturePT = TechDebug.GetPassByIndex(i).Description.Signature;
            }
            if (InputSignaturePT == null)
            {
                throw new System.Exception("input signature (DeferredTransparent, PT, Debug) == null");
            }
            LayoutPT = new InputLayout(device, InputSignaturePT, InputLayouts.VerticePT.InputElementsValue);

            FxWorldViewProjInv   = new EffectOnlyMatrixVariable(E.GetVariableByName("gWorldViewProjInv").AsMatrix());
            FxBaseMap            = E.GetVariableByName("gBaseMap").AsResource();
            FxNormalMap          = E.GetVariableByName("gNormalMap").AsResource();
            FxMapsMap            = E.GetVariableByName("gMapsMap").AsResource();
            FxDepthMap           = E.GetVariableByName("gDepthMap").AsResource();
            FxLightMap           = E.GetVariableByName("gLightMap").AsResource();
            FxLocalReflectionMap = E.GetVariableByName("gLocalReflectionMap").AsResource();
            FxReflectionCubemap  = E.GetVariableByName("gReflectionCubemap").AsResource();
            FxAmbientDown        = E.GetVariableByName("gAmbientDown").AsVector();
            FxAmbientRange       = E.GetVariableByName("gAmbientRange").AsVector();
            FxEyePosW            = E.GetVariableByName("gEyePosW").AsVector();
        }
示例#27
0
        public void Initialize(Device device)
        {
            _b = EffectUtils.Load(ShadersResourceManager.Manager, "DeferredPpSslr");
            E  = new Effect(device, _b);

            TechHabrahabrVersion = E.GetTechniqueByName("HabrahabrVersion");

            for (var i = 0; i < TechHabrahabrVersion.Description.PassCount && InputSignaturePT == null; i++)
            {
                InputSignaturePT = TechHabrahabrVersion.GetPassByIndex(i).Description.Signature;
            }
            if (InputSignaturePT == null)
            {
                throw new System.Exception("input signature (DeferredPpSslr, PT, HabrahabrVersion) == null");
            }
            LayoutPT = new InputLayout(device, InputSignaturePT, InputLayouts.VerticePT.InputElementsValue);

            FxWorldViewProjInv = new EffectOnlyMatrixVariable(E.GetVariableByName("gWorldViewProjInv").AsMatrix());
            FxWorldViewProj    = new EffectOnlyMatrixVariable(E.GetVariableByName("gWorldViewProj").AsMatrix());
            FxBaseMap          = E.GetVariableByName("gBaseMap").AsResource();
            FxLightMap         = E.GetVariableByName("gLightMap").AsResource();
            FxNormalMap        = E.GetVariableByName("gNormalMap").AsResource();
            FxMapsMap          = E.GetVariableByName("gMapsMap").AsResource();
            FxDepthMap         = E.GetVariableByName("gDepthMap").AsResource();
            FxEyePosW          = E.GetVariableByName("gEyePosW").AsVector();
        }
示例#28
0
        public Renderable(string effectFilename, string techniqueName, SlimDX.Direct3D11.Device device, Matrix world, string textureFilename, Scene scene, SamplerState sampler, Vector2 screenSize, bool isCameraRelative)
        {
            mesh_ = Mesh.MakeQuadMesh(device, 1.0f);
            var effect = scene.LoadEffect(effectFilename);

            technique_ = effect.GetTechniqueByName(techniqueName);
            layout_    = new InputLayout(device, technique_.GetPassByIndex(0).Description.Signature, new[] {
                new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0),
                new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 16, 0)
            });
            world_  = world;
            effect_ = effect;

            boundSamplers_ = new Dictionary <EffectSamplerVariable, SamplerState>();
            boundTextures_ = new Dictionary <EffectResourceVariable, ShaderResourceView>();

            var texture = scene.LoadTexture(textureFilename);

            BindSampler("mainSampler", sampler);
            BindTexture("quadImage", texture);

            m_screenSize       = screenSize;
            m_isCameraRelative = isCameraRelative;

            IsVisible = true; // Visible by default
        }
示例#29
0
文件: Program.cs 项目: mrommel/dx11
        private void MarkMirrorOnStencil(EffectTechnique activeTech, Matrix viewProj, Color4 blendFactor)
        {
            // Draw mirror to stencil
            for (int p = 0; p < activeTech.Description.PassCount; p++)
            {
                var pass = activeTech.GetPassByIndex(p);

                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_roomVB, Basic32.Stride, 0));

                var world = _roomWorld;
                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);

                ImmediateContext.OutputMerger.BlendState      = RenderStates.NoRenderTargetWritesBS;
                ImmediateContext.OutputMerger.BlendFactor     = blendFactor;
                ImmediateContext.OutputMerger.BlendSampleMask = -1;

                ImmediateContext.OutputMerger.DepthStencilState     = RenderStates.MarkMirrorDSS;
                ImmediateContext.OutputMerger.DepthStencilReference = 1;

                pass.Apply(ImmediateContext);
                ImmediateContext.Draw(6, 24);
                ImmediateContext.OutputMerger.DepthStencilState     = null;
                ImmediateContext.OutputMerger.DepthStencilReference = 0;
                ImmediateContext.OutputMerger.BlendState            = null;
                ImmediateContext.OutputMerger.BlendFactor           = blendFactor;
                ImmediateContext.OutputMerger.BlendSampleMask       = -1;
            }
        }
        public void Load()
        {
            try
            {
                string path = Path.Combine(ShaderManager.ShadaresFolder, "texture3DEffect.fx");
                using (ShaderBytecode effectByteCode = ShaderBytecode.CompileFromFile(
                           path,
                           "Render",
                           "fx_5_0",
                           ShaderFlags.EnableStrictness,
                           EffectFlags.None))
                {
                    effect         = new Effect(DeviceManager.Instance.device, effectByteCode);
                    technique      = effect.GetTechniqueByIndex(0);
                    pass           = technique.GetPassByIndex(0);
                    inputSignature = pass.Description.Signature;
                }

                tmat     = effect.GetVariableByName("gWVP").AsMatrix();
                WVInvmat = effect.GetVariableByName("gWVInv").AsMatrix();
                WVmat    = effect.GetVariableByName("gWV").AsMatrix();
                textureResourceVariable = effect.GetVariableByName("Texture").AsShaderResource();

                layout = new InputLayout(DeviceManager.Instance.device, inputSignature, elements);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
 public UserInterfaceRenderCommand(Renderer renderer, Hud hud, RenderableNode rNode)
     : base(renderer, new UIMaterial(),
         new RenderableCollection(UIMaterial.ItemsDescription, new [] {rNode}))
 {
     CommandType = CommandType.UserInterfaceRenderCommand;
     CommandAttributes |= Graphics.CommandAttributes.MonoRendering;
     this.hud = hud;
     textMaterial = new TextMaterial();
     this.rNode = rNode;
     this.rNode.RenderableObject.Material = Material;
     tNode = (TransformNode)rNode.Parent;
     UpdateSprites(hud.SpriteControls);
     textTechnique = textMaterial.EffectDescription.Technique;
     textPass = textTechnique.GetPassByIndex(textMaterial.EffectDescription.Pass);
     textLayout = new InputLayout(Game.Context.Device, textPass.Description.Signature,
         TextItems.Description.InputElements);
 }
示例#32
0
        /// <summary>
        /// Create our test RenderEffect.
        /// </summary>
        /// <param name="Device"></param>
        public TestEffect(Device Device)
        {
            this.Device = Device;
            ImmediateContext = Device.ImmediateContext;

            // Compile our shader...
            string compileErrors;
            var compiledShader = SlimDX.D3DCompiler.ShaderBytecode.CompileFromFile
            (
                "../../Effects/TestEffect/TestEffect.fx",
                null,
                "fx_5_0",
                SlimDX.D3DCompiler.ShaderFlags.None,
                SlimDX.D3DCompiler.EffectFlags.None,
                null,
                null,
                out compileErrors
            );

            if (compileErrors != null && compileErrors != "")
            {
                throw new EffectBuildException(compileErrors);
            }

            Effect = new Effect(Device, compiledShader);
            EffectTechnique = Effect.GetTechniqueByName("TestTechnique");

            var vertexDesc = new[]
            {
                new InputElement("POSITION", 0, SlimDX.DXGI.Format.R32G32B32_Float, 0, 0, InputClassification.PerVertexData, 0),
                new InputElement("COLOR", 0, SlimDX.DXGI.Format.R32G32B32A32_Float, 12, 0, InputClassification.PerVertexData, 0)
            };

            WorldViewProj = SlimDX.Matrix.Identity;
            CPO_WorldViewProj = Effect.GetVariableByName("gWorldViewProj").AsMatrix();
            InputLayout = new InputLayout(Device, EffectTechnique.GetPassByIndex(0).Description.Signature, vertexDesc);

            Util.ReleaseCom(ref compiledShader);
        }
示例#33
0
		public void Initialize(Device device) {
			_b = EffectUtils.Load("DeferredGObject");
			E = new Effect(device, _b);

			TechStandardDeferred = E.GetTechniqueByName("StandardDeferred");
			TechStandardForward = E.GetTechniqueByName("StandardForward");
			TechAmbientShadowDeferred = E.GetTechniqueByName("AmbientShadowDeferred");
			TechTransparentDeferred = E.GetTechniqueByName("TransparentDeferred");
			TechTransparentForward = E.GetTechniqueByName("TransparentForward");
			TechTransparentMask = E.GetTechniqueByName("TransparentMask");

			for (var i = 0; i < TechStandardDeferred.Description.PassCount && InputSignaturePNTG == null; i++) {
				InputSignaturePNTG = TechStandardDeferred.GetPassByIndex(i).Description.Signature;
			}
			if (InputSignaturePNTG == null) throw new System.Exception("input signature (DeferredGObject, PNTG, StandardDeferred) == null");
			LayoutPNTG = new InputLayout(device, InputSignaturePNTG, InputLayouts.VerticePNTG.InputElementsValue);
			for (var i = 0; i < TechAmbientShadowDeferred.Description.PassCount && InputSignaturePT == null; i++) {
				InputSignaturePT = TechAmbientShadowDeferred.GetPassByIndex(i).Description.Signature;
			}
			if (InputSignaturePT == null) throw new System.Exception("input signature (DeferredGObject, PT, AmbientShadowDeferred) == null");
			LayoutPT = new InputLayout(device, InputSignaturePT, InputLayouts.VerticePT.InputElementsValue);

			FxWorld = E.GetVariableByName("gWorld").AsMatrix();
			FxWorldInvTranspose = E.GetVariableByName("gWorldInvTranspose").AsMatrix();
			FxWorldViewProj = E.GetVariableByName("gWorldViewProj").AsMatrix();
			FxDiffuseMap = E.GetVariableByName("gDiffuseMap").AsResource();
			FxNormalMap = E.GetVariableByName("gNormalMap").AsResource();
			FxMapsMap = E.GetVariableByName("gMapsMap").AsResource();
			FxDetailsMap = E.GetVariableByName("gDetailsMap").AsResource();
			FxDetailsNormalMap = E.GetVariableByName("gDetailsNormalMap").AsResource();
			FxReflectionCubemap = E.GetVariableByName("gReflectionCubemap").AsResource();
			FxEyePosW = E.GetVariableByName("gEyePosW").AsVector();
			FxAmbientDown = E.GetVariableByName("gAmbientDown").AsVector();
			FxAmbientRange = E.GetVariableByName("gAmbientRange").AsVector();
			FxLightColor = E.GetVariableByName("gLightColor").AsVector();
			FxDirectionalLightDirection = E.GetVariableByName("gDirectionalLightDirection").AsVector();
			FxMaterial = E.GetVariableByName("gMaterial");
		}
示例#34
0
        private void CompileShader(Device device, string fullPath)
        {
            _File = fullPath;

            _CompiledEffect = ShaderBytecode.CompileFromFile(_File, "SpriteTech", "fx_5_0");

            if (_CompiledEffect.HasErrors) {
                Log.Write("Shader compilation failed with status code: {0} - {1} | Path: {2}", _CompiledEffect.ResultCode.Code, _CompiledEffect.Message, _File);
                return;
            }

            _Effect = new Effect(device, _CompiledEffect);
            _EffectTechnique = _Effect.GetTechniqueByName("SpriteTech");
            _SpriteMap = _Effect.GetVariableByName("SpriteTex").AsShaderResource();
            var _EffectPass = _EffectTechnique.GetPassByIndex(0).Description.Signature;

            InputElement[] _LayoutDescription = {
                new InputElement("POSITION", 0, SharpDX.DXGI.Format.R32G32B32_Float, 0, 0, InputClassification.PerVertexData, 0),
                new InputElement("TEXCOORD", 0, SharpDX.DXGI.Format.R32G32_Float, 12, 0, InputClassification.PerVertexData, 0),
                new InputElement("COLOR", 0, SharpDX.DXGI.Format.R32G32B32A32_Float, 20, 0, InputClassification.PerVertexData, 0)
            };

            _InputLayout = new InputLayout(device, _EffectPass, _LayoutDescription);
        }
示例#35
0
        /// <summary>
        /// Create Direct3D device and swap chain
        /// </summary>
        protected void InitDevice()
        {
            device = D3DDevice.CreateDeviceAndSwapChain(directControl.Handle, out swapChain);

            SetViews();

            // Create the effect
            using (FileStream effectStream = File.OpenRead("Tutorial02.fxo"))
            {
                effect = device.CreateEffectFromCompiledBinary(new BinaryReader(effectStream));
            }

            // Obtain the technique
            technique = effect.GetTechniqueByName("Render");

            // Define the input layout
            InputElementDescription[] layout = 
            {
                new InputElementDescription()
                {
                    SemanticName = "POSITION",
                    SemanticIndex = 0,
                    Format = Format.R32G32B32_FLOAT,
                    InputSlot = 0,
                    AlignedByteOffset = 0,
                    InputSlotClass = InputClassification.PerVertexData,
                    InstanceDataStepRate = 0
                }
            };

            PassDescription passDesc = technique.GetPassByIndex(0).Description;

            vertexLayout = device.CreateInputLayout(
                layout,
                passDesc.InputAssemblerInputSignature,
                passDesc.InputAssemblerInputSignatureSize);

            device.IA.SetInputLayout(vertexLayout);

            SimpleVertexArray vertex = new SimpleVertexArray();

            BufferDescription bd = new BufferDescription()
            {
                Usage = Usage.Default,
                ByteWidth = (uint)Marshal.SizeOf(vertex),
                BindFlags = BindFlag.VertexBuffer,
                CpuAccessFlags = 0,
                MiscFlags = 0
            };

            IntPtr vertexData = Marshal.AllocCoTaskMem(Marshal.SizeOf(vertex));
            Marshal.StructureToPtr(vertex, vertexData, false);

            SubresourceData InitData = new SubresourceData()
            {
                SysMem = vertexData,
                SysMemPitch = 0,
                SysMemSlicePitch = 0
            };

            //D3DBuffer buffer = null;
            vertexBuffer = device.CreateBuffer(bd, InitData);

            // Set vertex buffer
            uint stride = (uint)Marshal.SizeOf(typeof(Vector3F));
            uint offset = 0;
            device.IA.SetVertexBuffers(0, new Collection<D3DBuffer>()
                {
                    vertexBuffer
                },
                new uint[] { stride }, new uint[] { offset });

            // Set primitive topology
            device.IA.SetPrimitiveTopology(PrimitiveTopology.TriangleList);
            Marshal.FreeCoTaskMem(vertexData);
        }
示例#36
0
        public void EffectsInitialization()
        {
            var effectByteCode = ShaderBytecode.CompileFromFile("C:\\Users\\Nat�lia\\Documents\\MPM\\5. ro�n�k\\Diplomovka\\grafika3D\\Grafika3D\\effect.fx", "fx_5_0", ShaderFlags.None, EffectFlags.None);
            effect = new Effect(device, effectByteCode);

            techniquePosition = effect.GetTechniqueByName("Position");
            passPosition = techniquePosition.GetPassByIndex(0);

            techniqueTexture = effect.GetTechniqueByName("Texture");
            passTextureXY = techniqueTexture.GetPassByIndex(0);
            passTextureYZ = techniqueTexture.GetPassByIndex(1);
            passTextureZX = techniqueTexture.GetPassByIndex(2);

            var signature = passPosition.Description.Signature;
            inputLayout = new InputLayout(device, signature, new[]
                    {
                        new InputElement("POSITION", 0, Format.R32G32B32_Float, 0, 0),
                        new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 12, 0)
                    });

            var signatureTex = passTextureXY.Description.Signature;
            inputLayoutTex = new InputLayout(device, signatureTex, new[]
                    {
                        new InputElement("POSITION", 0, Format.R32G32B32_Float, 0, 0),
                        new InputElement("TEXCOORD", 0, Format.R32G32_Float, 12, 0)
                    });

            var samplerState = new SamplerState(device, new SamplerStateDescription()
            {
                AddressU = TextureAddressMode.Wrap,
                AddressV = TextureAddressMode.Wrap,
                AddressW = TextureAddressMode.Wrap,
                Filter = Filter.MinMagMipLinear,
            });

            var effectSampler = effect.GetVariableByName("Sampler").AsSampler();
            effectSampler.SetSampler(0, samplerState);
        }
示例#37
0
		public void Initialize(Device device) {
			_b = EffectUtils.Load("SpecialUv");
			E = new Effect(device, _b);

			TechMain = E.GetTechniqueByName("Main");

			for (var i = 0; i < TechMain.Description.PassCount && InputSignaturePNTG == null; i++) {
				InputSignaturePNTG = TechMain.GetPassByIndex(i).Description.Signature;
			}
			if (InputSignaturePNTG == null) throw new System.Exception("input signature (SpecialUv, PNTG, Main) == null");
			LayoutPNTG = new InputLayout(device, InputSignaturePNTG, InputLayouts.VerticePNTG.InputElementsValue);

			FxOffset = E.GetVariableByName("gOffset").AsVector();
		}
示例#38
0
        public TerrainSubrender(BTerrain terrain, RenderManager renderer, IRunManager manager)
            : base(manager)
        {
            Renderer = renderer;

            FrustumCheck = Manager.Opts.Get<bool>("rndr_terrain_frustumCheck");
            NotifyHandlers.Add(Manager.Opts.RegisterChangeNotification("rndr_terrain_frustumCheck", delegate(string key, object value) { FrustumCheck = (bool)value; }));
            try
            {
                Lods = Manager.Opts.Get<int>("rndr_terrain_lods");
                if (Lods > 1)
                {
                    LodDistancesSquared = new float[Lods - 1];
                    LodFactors = new int[Lods -1];
                    var list = Manager.Opts.Get<List<float>>("rndr_terrain_lodDistances");
                    var list2 = Manager.Opts.Get<List<int>>("rndr_terrain_lodFactors");
                    for (int i = 0; i < Lods-1; i++)
                    {
                        LodDistancesSquared[i] = list[i] * list[i];
                        LodFactors[i] = list2[i];
                    }
                }
            }
            catch (Exception)
            {
                Console.WriteLine("[Error] Could not read terrain-LOD settings, LOD disabled!");
                Lods = 1;
                LodDistancesSquared = null;
            }
            var shaderdeffile = Manager.Files.Get(@"Shaders\Terrain.hlsl", false);
            var bbuffer = new byte[shaderdeffile.Length];
            shaderdeffile.Read(bbuffer, 0, bbuffer.Length);
            shaderdeffile.Dispose();
            var bytecode = ShaderBytecode.Compile(
                Encoding.ASCII.GetBytes(
                    Encoding.ASCII.GetString(bbuffer).Replace("%TEXTURECOUNT%", "2").Replace("%OVERLAYCOUNT%", "1"))
                , "fx_5_0");
            bbuffer = null;
            Effect = new Effect(Renderer.D3DDevice, bytecode);
            bytecode.Dispose();
            _technique = Effect.GetTechniqueByName("Terrain");
            _pass = _technique.GetPassByIndex(0);

            _vertexLayout = new InputLayout(Renderer.D3DDevice, _pass.Description.Signature, new[]
                { new InputElement("POSITION", 0, Format.R32G32B32_Float, 0),
                new InputElement("NORMAL", 0, Format.R32G32B32_Float, 0),
                new InputElement("TEXCOORD",0,Format.R32G32_Float, 0) });

            Effect.GetVariableByName("texRepeat").AsScalar().Set(new[] { 0.1f, 0.1f });

            var sampleMode = SamplerState.FromDescription(Renderer.D3DDevice, new SamplerDescription()
            {
                AddressU = TextureAddressMode.Wrap,
                AddressV = TextureAddressMode.Wrap,
                AddressW = TextureAddressMode.Clamp,
                BorderColor = new Color4(0, 0, 0, 0),
                Filter = Filter.MinMagMipLinear,
                ComparisonFunction = Comparison.Always,
                MipLodBias = 0f,
                MaximumAnisotropy = 8,
                MinimumLod = 0f,
                MaximumLod = float.MaxValue
            });
            Effect.GetVariableByName("textureSampler").AsSampler().SetSamplerState(0, sampleMode);
            Effect.GetVariableByName("alphaSampler").AsSampler().SetSamplerState(0, sampleMode);

            UpdateStaticVars();

            CurrentTerrain = terrain;
            QuadEdgeLength = Manager.Opts.Get<int>("rndr_terrain_quadVerticesPerEdge");

            var verticesX = terrain.PointsX;
            var verticesZ = terrain.PointsZ;
            var quadsX = (int)Math.Ceiling((double)(verticesX - 1) / (QuadEdgeLength - 1));
            var quadsZ = (int)Math.Ceiling((double)(verticesZ - 1) / (QuadEdgeLength - 1));
            #if DEBUG
            if ((verticesX - 1) % (QuadEdgeLength - 1) != 0)
                Console.WriteLine("[Info] The terrain X-Vertices are no multiple of the quad-length, filling to fit IndexBuffers");
            if ((verticesZ - 1) % (QuadEdgeLength - 1) != 0)
                Console.WriteLine("[Info] The terrain Z-Vertices are no multiple of the quad-length, filling to fit IndexBuffers");
            #endif
            Quads = new Quad[quadsX*quadsZ];
            QuadCountZ = quadsZ;
            for (int i = 0; i < quadsX; i++)
            {
                for (int j = 0; j < quadsZ; j++)
                {
                    Quads[i * quadsZ + j] = new Quad(i * (QuadEdgeLength - 1), (i + 1) * (QuadEdgeLength - 1), j * (QuadEdgeLength - 1), (j + 1) * (QuadEdgeLength - 1), CurrentTerrain, Renderer);
                }
            }

            FrustumTree = new QuadContainer(0,quadsX-1, 0, quadsZ-1, ref Quads, QuadCountZ);

            QuadLods = new int[Quads.Length];
            Indexbuffers = new Dictionary<uint, KeyValuePair<Buffer, int>>();
        }
示例#39
0
        public MenuEffect(Device device)
        {
            Device = device;
            ImmediateContext = Device.ImmediateContext;

            // Compile the shader...
            string compileErrors;
            var compiledShader = SlimDX.D3DCompiler.ShaderBytecode.CompileFromFile
            (
                "../../Effects/MenuEffect/MenuEffect.fx",
                null,
                "fx_5_0",
                SlimDX.D3DCompiler.ShaderFlags.None,
                SlimDX.D3DCompiler.EffectFlags.None,
                null,
                null,
                out compileErrors
            );

            if (compileErrors != null && compileErrors != "")
            {
                throw new EffectBuildException(compileErrors);
            }

            Effect = new Effect(Device, compiledShader);
            Technique = Effect.GetTechniqueByName("MenuTechnique");

            var vertexDesc = new[]
            {
                new InputElement("POSITION", 0, SlimDX.DXGI.Format.R32G32_Float, 0, 0, InputClassification.PerVertexData, 0),
                new InputElement("TEXCOORD", 0, SlimDX.DXGI.Format.R32G32_Float, 8, 0, InputClassification.PerVertexData, 0)
            };

            CPO_BlendColor = Effect.GetVariableByName("gBlendColor").AsVector();
            SRV_DiffuseMap = Effect.GetVariableByName("gDiffuseMap").AsResource();

            InputLayout = new InputLayout(Device, Technique.GetPassByIndex(0).Description.Signature, vertexDesc);

            Util.ReleaseCom(ref compiledShader);

            DepthStencilStateDescription dssd = new DepthStencilStateDescription()
            {
                IsDepthEnabled = false,
                DepthWriteMask = DepthWriteMask.All,
                DepthComparison = Comparison.Less,
                IsStencilEnabled = true,
                StencilReadMask = 0xFF,
                StencilWriteMask = 0xFF,
                FrontFace = new DepthStencilOperationDescription()
                {
                    FailOperation = StencilOperation.Keep,
                    PassOperation = StencilOperation.Keep,
                    DepthFailOperation = StencilOperation.Increment,
                    Comparison = Comparison.Always
                },
                BackFace = new DepthStencilOperationDescription()
                {
                    FailOperation = StencilOperation.Keep,
                    PassOperation = StencilOperation.Keep,
                    Comparison = Comparison.Always,
                    DepthFailOperation = StencilOperation.Decrement
                }
            };
            DepthDisabledState = DepthStencilState.FromDescription(Device, dssd);
        }
示例#40
0
        private void LoadEffect(string shaderFileName = @"Assets\light.fx")
        {
            _effect = Effect.FromFile(_dxDevice, shaderFileName, "fx_4_0", ShaderFlags.None, EffectFlags.None, null, null);
            _technique = _effect.GetTechniqueByName("Render"); //C++ Comparaison// technique = effect->GetTechniqueByName( "Render" );
            _effectPass = _technique.GetPassByIndex(0);

            ShaderSignature signature = _effectPass.Description.Signature;
            _inputLayout = new InputLayout(_dxDevice, signature,
                new[] {
                    new InputElement("POSITION", 0, SlimDX.DXGI.Format.R32G32B32A32_Float, 0, 0),
                    new InputElement("NORMAL", 0, SlimDX.DXGI.Format.R32G32B32A32_Float, 16, 0),
                    new InputElement("TEXCOORD", 0, SlimDX.DXGI.Format.R32G32_Float, 32, 0)
                });
        }
示例#41
0
        private void DrawSkullShadowReflection(EffectTechnique activeSkullTech, Matrix viewProj, Color4 blendFactor) {
            // draw skull shadow
            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 shadowPlane = new Plane(new Vector3(0, 1, 0), 0.0f);
                var toMainLight = -_dirLights[0].Direction;

                var s = Matrix.Shadow(new Vector4(toMainLight, 0), shadowPlane);
                var shadowOffsetY = Matrix.Translation(0, 0.001f, 0);

                var mirrorPlane = new Plane(new Vector3(0, 0, 1), 0);
                var r = Matrix.Reflection(mirrorPlane);

                var world = _skullWorld * s * shadowOffsetY * r;
                var wit = MathF.InverseTranspose(world);
                var wvp = world * viewProj;

                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(wit);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetMaterial(_shadowMat);

                ImmediateContext.OutputMerger.BlendState = RenderStates.TransparentBS;
                ImmediateContext.OutputMerger.BlendFactor = blendFactor;
                ImmediateContext.OutputMerger.BlendSampleMask = -1;

                var oldLightDirections = _dirLights.Select(l => l.Direction).ToArray();

                for (int i = 0; i < _dirLights.Length; i++) {
                    var l = _dirLights[i];
                    var lightDir = l.Direction;
                    var reflectedLightDir = Vector3.Transform(lightDir, r);
                    _dirLights[i].Direction = new Vector3(reflectedLightDir.X, reflectedLightDir.Y, reflectedLightDir.Z);
                }
                Effects.BasicFX.SetDirLights(_dirLights);

                ImmediateContext.Rasterizer.State = RenderStates.CullClockwiseRS;

                ImmediateContext.OutputMerger.DepthStencilState = RenderStates.NoDoubleBlendDSS;
                ImmediateContext.OutputMerger.DepthStencilReference = 1;
                pass.Apply(ImmediateContext);

                ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0);

                ImmediateContext.Rasterizer.State = null;
                ImmediateContext.OutputMerger.DepthStencilState = null;
                ImmediateContext.OutputMerger.DepthStencilReference = 0;

                ImmediateContext.OutputMerger.BlendState = null;
                ImmediateContext.OutputMerger.BlendFactor = blendFactor;
                ImmediateContext.OutputMerger.BlendSampleMask = -1;

                for (int i = 0; i < oldLightDirections.Length; i++) {
                    _dirLights[i].Direction = oldLightDirections[i];
                }
                Effects.BasicFX.SetDirLights(_dirLights);
            }
        }
示例#42
0
        private void DrawSkullReflection(EffectTechnique activeSkullTech, Matrix viewProj) {
            // Draw skull reflection

            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 mirrorPlane = new Plane(new Vector3(0, 0, 1), 0);
                var r = Matrix.Reflection(mirrorPlane);

                var world = _skullWorld * r;
                var wit = MathF.InverseTranspose(world);
                var wvp = world * viewProj;

                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(wit);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetMaterial(_skullMat);

                var oldLightDirections = _dirLights.Select(l => l.Direction).ToArray();

                for (int i = 0; i < _dirLights.Length; i++) {
                    var l = _dirLights[i];
                    var lightDir = l.Direction;
                    var reflectedLightDir = Vector3.Transform(lightDir, r);
                    _dirLights[i].Direction = new Vector3(reflectedLightDir.X, reflectedLightDir.Y, reflectedLightDir.Z);
                }
                Effects.BasicFX.SetDirLights(_dirLights);

                ImmediateContext.Rasterizer.State = RenderStates.CullClockwiseRS;

                ImmediateContext.OutputMerger.DepthStencilState = RenderStates.DrawReflectionDSS;
                ImmediateContext.OutputMerger.DepthStencilReference = 1;
                pass.Apply(ImmediateContext);

                ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0);

                ImmediateContext.Rasterizer.State = null;
                ImmediateContext.OutputMerger.DepthStencilState = null;
                ImmediateContext.OutputMerger.DepthStencilReference = 0;

                for (int i = 0; i < oldLightDirections.Length; i++) {
                    _dirLights[i].Direction = oldLightDirections[i];
                }
                Effects.BasicFX.SetDirLights(_dirLights);
            }
        }
示例#43
0
        private void MarkMirrorOnStencil(EffectTechnique activeTech, Matrix viewProj, Color4 blendFactor) {
            // Draw mirror to stencil
            for (int p = 0; p < activeTech.Description.PassCount; p++) {
                var pass = activeTech.GetPassByIndex(p);

                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_roomVB, Basic32.Stride, 0));

                var world = _roomWorld;
                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);

                ImmediateContext.OutputMerger.BlendState = RenderStates.NoRenderTargetWritesBS;
                ImmediateContext.OutputMerger.BlendFactor = blendFactor;
                ImmediateContext.OutputMerger.BlendSampleMask = -1;

                ImmediateContext.OutputMerger.DepthStencilState = RenderStates.MarkMirrorDSS;
                ImmediateContext.OutputMerger.DepthStencilReference = 1;

                pass.Apply(ImmediateContext);
                ImmediateContext.Draw(6, 24);
                ImmediateContext.OutputMerger.DepthStencilState = null;
                ImmediateContext.OutputMerger.DepthStencilReference = 0;
                ImmediateContext.OutputMerger.BlendState = null;
                ImmediateContext.OutputMerger.BlendFactor = blendFactor;
                ImmediateContext.OutputMerger.BlendSampleMask = -1;
            }
        }
示例#44
0
        private void DrawSkull(EffectTechnique activeSkullTech, Matrix viewProj) {
            // Draw skull
            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 wit = MathF.InverseTranspose(world);
                var wvp = world * viewProj;

                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(wit);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetMaterial(_skullMat);

                pass.Apply(ImmediateContext);
                ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0);
            }
        }
示例#45
0
		public void Initialize(Device device) {
			_b = EffectUtils.Load("SpecialTrackMap");
			E = new Effect(device, _b);

			TechMain = E.GetTechniqueByName("Main");
			TechPp = E.GetTechniqueByName("Pp");
			TechFinal = E.GetTechniqueByName("Final");
			TechFinalCheckers = E.GetTechniqueByName("FinalCheckers");
			TechPpHorizontalBlur = E.GetTechniqueByName("PpHorizontalBlur");
			TechPpVerticalBlur = E.GetTechniqueByName("PpVerticalBlur");

			for (var i = 0; i < TechMain.Description.PassCount && InputSignaturePNTG == null; i++) {
				InputSignaturePNTG = TechMain.GetPassByIndex(i).Description.Signature;
			}
			if (InputSignaturePNTG == null) throw new System.Exception("input signature (SpecialTrackMap, PNTG, Main) == null");
			LayoutPNTG = new InputLayout(device, InputSignaturePNTG, InputLayouts.VerticePNTG.InputElementsValue);
			for (var i = 0; i < TechPp.Description.PassCount && InputSignaturePT == null; i++) {
				InputSignaturePT = TechPp.GetPassByIndex(i).Description.Signature;
			}
			if (InputSignaturePT == null) throw new System.Exception("input signature (SpecialTrackMap, PT, Pp) == null");
			LayoutPT = new InputLayout(device, InputSignaturePT, InputLayouts.VerticePT.InputElementsValue);

			FxWorldViewProj = E.GetVariableByName("gWorldViewProj").AsMatrix();
			FxWorldInvTranspose = E.GetVariableByName("gWorldInvTranspose").AsMatrix();
			FxInputMap = E.GetVariableByName("gInputMap").AsResource();
			FxScreenSize = E.GetVariableByName("gScreenSize").AsVector();
		}
示例#46
0
        private void DrawMirror(EffectTechnique activeTech, Matrix viewProj, Color4 blendFactor) {
            // draw mirror with transparency
            for (int p = 0; p < activeTech.Description.PassCount; p++) {
                var pass = activeTech.GetPassByIndex(p);

                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_roomVB, Basic32.Stride, 0));

                var world = _roomWorld;
                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(_mirrorMat);
                Effects.BasicFX.SetDiffuseMap(_mirrorDiffuseMapSRV);

                ImmediateContext.OutputMerger.BlendState = RenderStates.TransparentBS;
                ImmediateContext.OutputMerger.BlendFactor = blendFactor;
                ImmediateContext.OutputMerger.BlendSampleMask = -1;

                pass.Apply(ImmediateContext);
                ImmediateContext.Draw(6, 24);
            }
        }
示例#47
0
        void CreateDeviceResources()
        {
            uint width = (uint) host.ActualWidth;
            uint height = (uint) host.ActualHeight;

            // If we don't have a device, need to create one now and all
            // accompanying D3D resources.
            CreateDevice();

            DXGIFactory dxgiFactory = DXGIFactory.CreateFactory();

            SwapChainDescription swapDesc = new SwapChainDescription();
            swapDesc.BufferDescription.Width = width;
            swapDesc.BufferDescription.Height = height;
            swapDesc.BufferDescription.Format = Format.R8G8B8A8_UNORM;
            swapDesc.BufferDescription.RefreshRate.Numerator = 60;
            swapDesc.BufferDescription.RefreshRate.Denominator = 1;
            swapDesc.SampleDescription.Count = 1;
            swapDesc.SampleDescription.Quality = 0;
            swapDesc.BufferUsage = UsageOption.RenderTargetOutput;
            swapDesc.BufferCount = 1;
            swapDesc.OutputWindowHandle = host.Handle;
            swapDesc.Windowed = true;

            swapChain = dxgiFactory.CreateSwapChain(
                device, swapDesc);

            // Create rasterizer state object
            RasterizerDescription rsDesc = new RasterizerDescription();
            rsDesc.AntialiasedLineEnable = false;
            rsDesc.CullMode = CullMode.None;
            rsDesc.DepthBias = 0;
            rsDesc.DepthBiasClamp = 0;
            rsDesc.DepthClipEnable = true;
            rsDesc.FillMode = D3D10.FillMode.Solid;
            rsDesc.FrontCounterClockwise = false; // Must be FALSE for 10on9
            rsDesc.MultisampleEnable = false;
            rsDesc.ScissorEnable = false;
            rsDesc.SlopeScaledDepthBias = 0;

            rasterizerState = device.CreateRasterizerState(
                rsDesc);

            device.RS.SetState(
                rasterizerState
                );

            // If we don't have a D2D render target, need to create all of the resources
            // required to render to one here.
            // Ensure that nobody is holding onto one of the old resources
            device.OM.SetRenderTargets(new RenderTargetView[] {null});

            InitializeDepthStencil(width, height);

            // Create views on the RT buffers and set them on the device
            RenderTargetViewDescription renderDesc = new RenderTargetViewDescription();
            renderDesc.Format = Format.R8G8B8A8_UNORM;
            renderDesc.ViewDimension = RenderTargetViewDimension.Texture2D;
            renderDesc.Texture2D.MipSlice = 0;

            using (D3DResource spBackBufferResource = swapChain.GetBuffer<D3DResource>(0))
            {
                renderTargetView = device.CreateRenderTargetView(
                    spBackBufferResource,
                    renderDesc);
            }

            device.OM.SetRenderTargets(new RenderTargetView[] {renderTargetView}, depthStencilView);

            SetViewport(width, height);


            // Create a D2D render target which can draw into the surface in the swap chain
            RenderTargetProperties props =
                new RenderTargetProperties(
                    RenderTargetType.Default, new PixelFormat(Format.Unknown, AlphaMode.Premultiplied),
                    96, 96, RenderTargetUsage.None, FeatureLevel.Default);

            // Allocate a offscreen D3D surface for D2D to render our 2D content into
            Texture2DDescription tex2DDescription;
            tex2DDescription.ArraySize = 1;
            tex2DDescription.BindFlags = BindFlag.RenderTarget | BindFlag.ShaderResource;
            tex2DDescription.CpuAccessFlags = CpuAccessFlag.Unspecified;
            tex2DDescription.Format = Format.R8G8B8A8_UNORM;
            tex2DDescription.Height = 4096;
            tex2DDescription.Width = 512;
            tex2DDescription.MipLevels = 1;
            tex2DDescription.MiscFlags = 0;
            tex2DDescription.SampleDescription.Count = 1;
            tex2DDescription.SampleDescription.Quality = 0;
            tex2DDescription.Usage = Usage.Default;

            offscreenTexture = device.CreateTexture2D(tex2DDescription);

            using (Surface dxgiSurface = offscreenTexture.GetDXGISurface())
            {
                // Create a D2D render target which can draw into our offscreen D3D surface
                renderTarget = d2DFactory.CreateDxgiSurfaceRenderTarget(
                    dxgiSurface,
                    props);
            }

            PixelFormat alphaOnlyFormat = new PixelFormat(Format.A8_UNORM, AlphaMode.Premultiplied);

            opacityRenderTarget = renderTarget.CreateCompatibleRenderTarget(CompatibleRenderTargetOptions.None,
                                                                            alphaOnlyFormat);

            // Load pixel shader
            // Open precompiled vertex shader
            // This file was compiled using DirectX's SDK Shader compilation tool: 
            // fxc.exe /T fx_4_0 /Fo SciFiText.fxo SciFiText.fx
            shader = LoadResourceShader(device, "SciFiTextDemo.SciFiText.fxo");

            // Obtain the technique
            technique = shader.GetTechniqueByName("Render");

            // Obtain the variables
            worldMatrixVariable = shader.GetVariableByName("World").AsMatrix();
            viewMatrixVariable = shader.GetVariableByName("View").AsMatrix();
            projectionMarixVariable = shader.GetVariableByName("Projection").AsMatrix();
            diffuseVariable = shader.GetVariableByName("txDiffuse").AsShaderResource();

            // Create the input layout
            PassDescription passDesc = new PassDescription();
            passDesc = technique.GetPassByIndex(0).Description;

            vertexLayout = device.CreateInputLayout(
                inputLayoutDescriptions,
                passDesc.InputAssemblerInputSignature,
                passDesc.InputAssemblerInputSignatureSize
                );

            // Set the input layout
            device.IA.SetInputLayout(
                vertexLayout
                );

            IntPtr verticesDataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(VertexArray.VerticesInstance));
            Marshal.StructureToPtr(VertexArray.VerticesInstance, verticesDataPtr, true);

            BufferDescription bd = new BufferDescription();
            bd.Usage = Usage.Default;
            bd.ByteWidth = (uint) Marshal.SizeOf(VertexArray.VerticesInstance);
            bd.BindFlags = BindFlag.VertexBuffer;
            bd.CpuAccessFlags = CpuAccessFlag.Unspecified;
            bd.MiscFlags = ResourceMiscFlag.Undefined;

            SubresourceData InitData = new SubresourceData()
                                           {
                                               SysMem = verticesDataPtr
                                           };


            vertexBuffer = device.CreateBuffer(
                bd,
                InitData
                );

            Marshal.FreeHGlobal(verticesDataPtr);

            // Set vertex buffer
            uint stride = (uint) Marshal.SizeOf(typeof (SimpleVertex));
            uint offset = 0;

            device.IA.SetVertexBuffers(
                0,
                new D3DBuffer[] {vertexBuffer},
                new uint[] {stride},
                new uint[] {offset}
                );

            IntPtr indicesDataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(VertexArray.IndicesInstance));
            Marshal.StructureToPtr(VertexArray.IndicesInstance, indicesDataPtr, true);

            bd.Usage = Usage.Default;
            bd.ByteWidth = (uint) Marshal.SizeOf(VertexArray.IndicesInstance);
            bd.BindFlags = BindFlag.IndexBuffer;
            bd.CpuAccessFlags = 0;
            bd.MiscFlags = 0;

            InitData.SysMem = indicesDataPtr;

            facesIndexBuffer = device.CreateBuffer(
                bd,
                InitData
                );

            Marshal.FreeHGlobal(indicesDataPtr);

            // Set primitive topology
            device.IA.SetPrimitiveTopology(PrimitiveTopology.TriangleList);

            // Convert the D2D texture into a Shader Resource View
            textureResourceView = device.CreateShaderResourceView(
                offscreenTexture);

            // Initialize the world matrices
            worldMatrix = Matrix4x4F.Identity;

            // Initialize the view matrix
            Vector3F Eye = new Vector3F(0.0f, 0.0f, 13.0f);
            Vector3F At = new Vector3F(0.0f, -3.5f, 45.0f);
            Vector3F Up = new Vector3F(0.0f, 1.0f, 0.0f);

            viewMatrix = Camera.MatrixLookAtLH(Eye, At, Up);

            // Initialize the projection matrix
            projectionMatrix = Camera.MatrixPerspectiveFovLH(
                (float) Math.PI*0.1f,
                width/(float) height,
                0.1f,
                100.0f);

            // Update Variables that never change
            viewMatrixVariable.Matrix = viewMatrix;

            projectionMarixVariable.Matrix = projectionMatrix;

            GradientStop[] gradientStops =
                {
                    new GradientStop(0.0f, new ColorF(Colors.Yellow)),
                    new GradientStop(1.0f, new ColorF(Colors.Black))
                };

            GradientStopCollection spGradientStopCollection = renderTarget.CreateGradientStopCollection(
                gradientStops,
                Gamma.Gamma_22,
                ExtendMode.Clamp);

            // Create a linear gradient brush for text
            textBrush = renderTarget.CreateLinearGradientBrush(
                new LinearGradientBrushProperties(new Point2F(0, 0), new Point2F(0, -2048)),
                spGradientStopCollection
                );
        }
示例#48
0
        private void DrawSkullShadow(EffectTechnique activeSkullTech, Matrix viewProj, Color4 blendFactor) {
            // draw skull shadow on floor
            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 shadowPlane = new Plane(new Vector3(0, 1, 0), 0.0f);
                var toMainLight = -_dirLights[0].Direction;

                var s = Matrix.Shadow(new Vector4(toMainLight, 0), shadowPlane);
                var shadowOffsetY = Matrix.Translation(0, 0.001f, 0);

                var world = _skullWorld * s * shadowOffsetY;
                var wit = MathF.InverseTranspose(world);
                var wvp = world * viewProj;

                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(wit);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetMaterial(_shadowMat);

                ImmediateContext.OutputMerger.BlendState = RenderStates.TransparentBS;
                ImmediateContext.OutputMerger.BlendFactor = blendFactor;
                ImmediateContext.OutputMerger.BlendSampleMask = -1;

                ImmediateContext.OutputMerger.DepthStencilState = RenderStates.NoDoubleBlendDSS;
                ImmediateContext.OutputMerger.DepthStencilReference = 0;
                pass.Apply(ImmediateContext);

                ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0);

                // draw skull shadow on wall
                shadowPlane = new Plane(new Vector3(0, 0, -1), 0.0f);
                toMainLight = -_dirLights[0].Direction;

                s = Matrix.Shadow(new Vector4(toMainLight, 0), shadowPlane);
                shadowOffsetY = Matrix.Translation(0, 0, -0.001f);

                world = _skullWorld * s * shadowOffsetY;
                wit = MathF.InverseTranspose(world);
                wvp = world * viewProj;

                Effects.BasicFX.SetWorld(world);
                Effects.BasicFX.SetWorldInvTranspose(wit);
                Effects.BasicFX.SetWorldViewProj(wvp);
                Effects.BasicFX.SetMaterial(_shadowMat);

                pass.Apply(ImmediateContext);

                ImmediateContext.DrawIndexed(_skullIndexCount, 0, 0);

                ImmediateContext.Rasterizer.State = null;
                ImmediateContext.OutputMerger.DepthStencilState = null;
                ImmediateContext.OutputMerger.DepthStencilReference = 0;

                ImmediateContext.OutputMerger.BlendState = null;
                ImmediateContext.OutputMerger.BlendFactor = blendFactor;
                ImmediateContext.OutputMerger.BlendSampleMask = -1;
            }
        }
        private void LoadEffect(string shaderFileName)
        {
            _effect = Effect.FromFile(_dxDevice, shaderFileName, "fx_4_0",
                                      ShaderFlags.None, EffectFlags.None, null, null);

            _renderTech = _effect.GetTechniqueByName("Render"); //C++ Comparaison// technique = effect->GetTechniqueByName( "Render" );

            _eyePosWVar = _effect.GetVariableByName("gEyePosW").AsVector();
            _viewProjVar = _effect.GetVariableByName("gViewProj").AsMatrix();
            _worldVar = _effect.GetVariableByName("gWorld").AsMatrix();
            _fillColorVar = _effect.GetVariableByName("gFillColor").AsVector();
            _lightVariable = _effect.GetVariableByName("gLight");

            _imageMapVar = _effect.GetVariableByName("gImageMap").AsResource();
            _depthMapVar = _effect.GetVariableByName("gDepthMap").AsResource();

            _resVar = _effect.GetVariableByName("gRes").AsVector();
            _depthToRgbVar = _effect.GetVariableByName("gDepthToRgb").AsMatrix();
            _focalLengthDepthVar = _effect.GetVariableByName("gFocalLengthDepth").AsScalar();
            _focalLengthImageVar = _effect.GetVariableByName("gFocalLengthImage").AsScalar();

            ShaderSignature signature = _renderTech.GetPassByIndex(0).Description.Signature;
            _inputLayout = new InputLayout(_dxDevice, signature,
                                           new[] { new InputElement("POSITION", 0, SlimDX.DXGI.Format.R16G16_SInt, 0, 0)
                                                 });
        }
示例#50
0
        protected void InitOnce()
        {
            var shaderdeffile = Manager.Files.Get(@"Shaders\DeferredRendering.hlsl", false);
            var bbuffer = new byte[shaderdeffile.Length];
            shaderdeffile.Read(bbuffer,0, bbuffer.Length);
            shaderdeffile.Dispose();
            var bytecode = ShaderBytecode.Compile(bbuffer, "fx_5_0");
            bbuffer = null;
            _effect = new Effect(D3DDevice, bytecode);
            bytecode.Dispose();

            _composeTechnique = _effect.GetTechniqueByName("Compose");
            _composePass = _composeTechnique.GetPassByIndex(0);

            var vertices = new DataStream(20 * 4, true, true);
            vertices.Write(new Vector3(-1f, -1f, -1f));
            vertices.Write(new Vector2(0f,1f));
            vertices.Write(new Vector3(-1f, 1f, -1f));
            vertices.Write(new Vector2(0f, 0f));
            vertices.Write(new Vector3(1f, -1f, -1f));
            vertices.Write(new Vector2(1f, 1f));
            vertices.Write(new Vector3(1f, 1f, -1f));
            vertices.Write(new Vector2(1f, 0f));
            vertices.Position = 0;
            _composeVertices = new Buffer(D3DDevice, vertices, 20 * 4, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
            _composeVerticesBB = new VertexBufferBinding(_composeVertices, 20, 0);
            vertices.Dispose();
            _composeLayout = new InputLayout(D3DDevice, _composePass.Description.Signature, new[] { new InputElement("POSITION", 0, Format.R32G32B32_Float, 0), new InputElement("TEXCOORD", 0, Format.R32G32_Float, 0) });
            var sampleMode = SamplerState.FromDescription(D3DDevice, new SamplerDescription()
            {
                AddressU = TextureAddressMode.Clamp,
                AddressV = TextureAddressMode.Clamp,
                AddressW = TextureAddressMode.Clamp,
                BorderColor = new Color4(0, 0, 0, 0),
                Filter = Filter.MinLinearMagMipPoint,
                ComparisonFunction = Comparison.Always,
                MipLodBias = 0f,
                MaximumAnisotropy = 8,
                MinimumLod = 0f,
                MaximumLod = float.MaxValue
            });
            _effect.GetVariableByName("composeSampler").AsSampler().SetSamplerState(0, sampleMode);
            sampleMode.Dispose();
            _effect.GetVariableByName("composeFlags").AsScalar().Set(
                Manager.Opts.Get<bool>("rndr_rawGBufferView")?0x1:0
                );

            NotifyHandlers.Add(Manager.Opts.RegisterChangeNotification("rndr_rawGBufferView", delegate(string key, object value)
            {
                Output.BeginInvoke((Action)delegate
                {
                    if ((bool)value)
                        _effect.GetVariableByName("composeFlags").AsScalar().Set(_effect.GetVariableByName("composeFlags").AsScalar().GetInt() | 0x1);
                    else
                        _effect.GetVariableByName("composeFlags").AsScalar().Set(_effect.GetVariableByName("composeFlags").AsScalar().GetInt() & (int.MaxValue - 0x1));
                });
            }));

            NotifyHandlers.Add(Manager.Opts.RegisterChangeNotification("rndr_nearPlane", delegate {
                Output.BeginInvoke((Action)ResetDevice);
            }));
            NotifyHandlers.Add(Manager.Opts.RegisterChangeNotification("rndr_farPlane", delegate {
                Output.BeginInvoke((Action)ResetDevice);
            }));

            SceneRasterizer = RasterizerState.FromDescription(D3DDevice, new RasterizerStateDescription()
                                                                                      {
                                                                                          FillMode = (Manager.Opts.Get<bool>("rndr_wireframe") ? FillMode.Wireframe : FillMode.Solid),
                                                                                          CullMode = (Manager.Opts.Get<bool>("rndr_cull") ? CullMode.Back : CullMode.None)
                                                                                      });
            _composeRasterizer = RasterizerState.FromDescription(D3DDevice, new RasterizerStateDescription()
            {
                FillMode = FillMode.Solid,
                CullMode = CullMode.Back
            });

            var bsd = new BlendStateDescription();
            bsd.RenderTargets[0].BlendEnable = true;

            bsd.RenderTargets[0].SourceBlend = BlendOption.SourceAlpha;
            bsd.RenderTargets[0].DestinationBlend = BlendOption.InverseSourceAlpha;
            bsd.RenderTargets[0].BlendOperation = BlendOperation.Add;

            bsd.RenderTargets[0].SourceBlendAlpha = BlendOption.One;
            bsd.RenderTargets[0].DestinationBlendAlpha = BlendOption.Zero;
            bsd.RenderTargets[0].BlendOperationAlpha = BlendOperation.Add;
            bsd.RenderTargets[0].RenderTargetWriteMask = ColorWriteMaskFlags.All;

            Context.OutputMerger.BlendState = BlendState.FromDescription(D3DDevice, bsd);

            NotifyHandlers.Add(Manager.Opts.RegisterChangeNotification("rndr_wireframe", delegate(string key, object value)
            {
                Output.BeginInvoke((Action)delegate {
                    var oldcullmode = CullMode.Back;
                    if (SceneRasterizer != null)
                    {
                        oldcullmode = SceneRasterizer.Description.CullMode;
                        SceneRasterizer.Dispose();
                    }
                    SceneRasterizer = RasterizerState.FromDescription(D3DDevice, new RasterizerStateDescription()
                    {
                        FillMode = (((bool)value) ? FillMode.Wireframe : FillMode.Solid),
                        CullMode = oldcullmode
                    });
                });
            }));
            NotifyHandlers.Add(Manager.Opts.RegisterChangeNotification("rndr_cull", delegate(string key, object value)
            {
                Output.BeginInvoke((Action)delegate
                {
                    var oldfillmode = FillMode.Solid;
                    if (SceneRasterizer != null)
                    {
                        oldfillmode = SceneRasterizer.Description.FillMode;
                        SceneRasterizer.Dispose();
                    }
                    SceneRasterizer = RasterizerState.FromDescription(D3DDevice, new RasterizerStateDescription()
                    {
                        FillMode =  oldfillmode,
                        CullMode = (((bool)value) ? CullMode.Back : CullMode.None)
                    });
                });
            }));

            Context.OutputMerger.DepthStencilState = DepthStencilState.FromDescription(D3DDevice, new DepthStencilStateDescription()
                                                                                                      {
                                                                                                          IsDepthEnabled = true,
                                                                                                          DepthWriteMask = DepthWriteMask.All,
                                                                                                          DepthComparison = Comparison.Less,
                                                                                                          IsStencilEnabled = false,
                                                                                                      });
            _camIncorporeal = Manager.Opts.Get<bool>("rndr_incorporeal");
            NotifyHandlers.Add(Manager.Opts.RegisterChangeNotification("rndr_incorporeal", delegate(string key, object value) { _camIncorporeal = (bool)value; }));

            ViewerLocation = new Vector3(-1, 1, -1);
            ViewerLookAt = new Vector3(0, 0, 0);
            ViewerUpVector = Vector3.UnitY;
            _camLocationIncorporeal = new Vector3(-1, 1, -1);
            _camLookAtIncorporeal = new Vector3(0, 0, 0);
            _camUpVectorIncorporeal = Vector3.UnitY;
            ViewerFrustum = new Frustum();
            _fpsTimer = new HTimer();
            _fpsRingbuffer = new double[60];
            _fpsRingbufferIndex = 0;
        }
示例#51
0
        public void Load()
        {
            byte[] effectBuffer = null;
            ShaderSignature inputSignature;
            try
            {
                using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("OpenSAGE.Shaders.Compiled.Simple.fxo"))
                {
                    effectBuffer = new byte[stream.Length];
                    stream.Read(effectBuffer, 0, effectBuffer.Length);
                }
                using (DataStream stream = new DataStream(effectBuffer, true, true))
                {
                    using (ShaderBytecode byteCode = new ShaderBytecode(stream))
                    {
                        _effect = new Effect(_device, byteCode);
                    }
                }
            }
            catch
            {
                using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("OpenSAGE.Shaders.Simple.fx"))
                {
                    effectBuffer = new byte[stream.Length];
                    stream.Read(effectBuffer, 0, effectBuffer.Length);
                }
                using (ShaderBytecode byteCode = ShaderBytecode.Compile(effectBuffer, "fx_5_0"))
                {
                    _effect = new Effect(_device, byteCode);
                }
            }
            _defaultTechnique = _effect.GetTechniqueByName("Default");
            EffectPass pass = _defaultTechnique.GetPassByIndex(0);
            inputSignature = pass.Description.Signature;

            byte[] vertices = new byte[0x70];
            int position = 0;
            BufferWriter.WriteVector3(vertices, ref position, new Math.Vector3(0.0f, 0.5f, 0.5f));
            BufferWriter.WriteLinearColorRGBA(vertices, ref position, new Math.LinearColor(1.0f, 0.0f, 0.0f));
            BufferWriter.WriteVector3(vertices, ref position, new Math.Vector3(0.5f, -0.5f, 0.5f));
            BufferWriter.WriteLinearColorRGBA(vertices, ref position, new Math.LinearColor(0.0f, 1.0f, 0.0f));
            BufferWriter.WriteVector3(vertices, ref position, new Math.Vector3(-0.5f, -0.5f, 0.5f));
            BufferWriter.WriteLinearColorRGBA(vertices, ref position, new Math.LinearColor(0.0f, 0.0f, 1.0f));
            BufferWriter.WriteVector3(vertices, ref position, new Math.Vector3(-0.5f, 0.5f, 0.5f));
            BufferWriter.WriteLinearColorRGBA(vertices, position, new Math.LinearColor(1.0f, 1.0f, 1.0f, 0.0f));
            DataStream vertexStream = new DataStream(vertices, true, true);
            _vertexBuffer = new D3D11Buffer(_device, vertexStream, 0x70,
                ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
            byte[] indices = new byte[12];
            position = 0;
            BufferWriter.WriteUInt16(indices, ref position, 0);
            BufferWriter.WriteUInt16(indices, ref position, 1);
            BufferWriter.WriteUInt16(indices, ref position, 2);
            BufferWriter.WriteUInt16(indices, ref position, 3);
            BufferWriter.WriteUInt16(indices, ref position, 0);
            BufferWriter.WriteUInt16(indices, ref position, 2);
            DataStream indexStream = new DataStream(indices, true, true);
            _indexBuffer = new D3D11Buffer(_device, indexStream, 12,
                ResourceUsage.Default, BindFlags.IndexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);

            InputElement[] inElements = new[]
                {
                    new InputElement("POSITION", 0, Format.R32G32B32_Float, 0),
                    new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 12, 0)
                };
            _inLayout = new InputLayout(_device, inputSignature, inElements);
            _deviceContext.InputAssembler.InputLayout = _inLayout;
            _deviceContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
            _deviceContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_vertexBuffer, 28, 0));
            _deviceContext.InputAssembler.SetIndexBuffer(_indexBuffer, Format.R16_UInt, 0);
            _defaultTechnique.GetPassByIndex(0).Apply(_deviceContext);
        }
示例#52
0
        public void SetSourceCode(string extendedSourceCode)
        {
            string shaderCode = File.ReadAllText(renderer.Directory + "\\Resources\\Teapot.fx");

            try
            {
                using (ShaderBytecode bytecode = ShaderBytecode.Compile(extendedSourceCode + shaderCode, null, "fx_5_0", ShaderFlags.None, EffectFlags.None))
                {
                    effect = new Effect(renderingDevice, bytecode);
                }
            }
            catch (CompilationException ex)
            {
                System.Diagnostics.Debug.Write(ex.Message);
                return;
            }

            effectViewProjection = effect.GetVariableByName("matViewProjection").AsMatrix();
            effectCameraPositionWorld = effect.GetVariableByName("cameraPositionWorld").AsVector();

            technique = effect.GetTechniqueByIndex(0);
            pass = technique.GetPassByIndex(0);

            ShaderSignature signature = pass.Description.Signature;

            inputLayout = new InputLayout(renderingDevice, signature, new[] {
				new InputElement("POSITION", 0, SlimDX.DXGI.Format.R32G32B32_Float, 0, 0),
				new InputElement("NORMAL", 0, SlimDX.DXGI.Format.R32G32B32_Float, 12, 0) 
			});
        }
示例#53
0
        public void Draw(DeviceContext dc, EffectTechnique waveTech, Matrix viewProj) {
            for (var p = 0; p < waveTech.Description.PassCount; p++) {
                var world = _grid.World;
                var wit = MathF.InverseTranspose(world);
                var wvp = world * viewProj;

                Effects.WavesFX.SetWorld(world);
                Effects.WavesFX.SetWorldInvTranspose(wit);
                Effects.WavesFX.SetViewProj(viewProj);
                Effects.WavesFX.SetWorldViewProj(wvp);
                Effects.WavesFX.SetTexTransform(_grid.TexTransform);
                Effects.WavesFX.SetWaveDispTexTransform0(_wavesDispTexTransform0);
                Effects.WavesFX.SetWaveDispTexTransform1(_wavesDispTexTransform1);
                Effects.WavesFX.SetWaveNormalTexTransform0(_wavesNormalTexTransform0);
                Effects.WavesFX.SetWaveNormalTexTransform1(_wavesNormalTexTransform1);
                Effects.WavesFX.SetMaterial(_grid.Model.Materials[0]);
                Effects.WavesFX.SetDiffuseMap(_grid.Model.DiffuseMapSRV[0]);
                Effects.WavesFX.SetNormalMap0(NormalMap0);
                Effects.WavesFX.SetNormalMap1(NormalMap1);

                waveTech.GetPassByIndex(p).Apply(dc);
                _grid.Model.ModelMesh.Draw(dc, 0);
            }
        }
示例#54
0
		public override void LoadResources()
		{
			if (m_Disposed == true)
			{ 
				#region Load Volume Effect

				m_Effect = m_Effect = new Effect(GameEnvironment.Device, Bytecode); // Effect.FromFile(GameEnvironment.Device, Helper.ResolvePath(m_ShaderLocation), "fx_4_0", ShaderFlags.None, EffectFlags.None, null, null);

				RayStartTechnique = m_Effect.GetTechniqueByName("RayStart");
				RayStartOutsidePass = RayStartTechnique.GetPassByName("Outside");
				RayStartInsidePass = RayStartTechnique.GetPassByName("Inside");

				VolumeLayout = new InputLayout(GameEnvironment.Device, RayStartOutsidePass.Description.Signature, new[] {
				   new InputElement("POSITION", 0, Format.R32G32B32_Float, 0, 0),
				   new InputElement("COLOR", 0, Format.R32G32B32_Float, 12, 0)			
				});


				RayDirectionTechnique = m_Effect.GetTechniqueByName("RayDirection");
				RayDirectionPass0 = RayDirectionTechnique.GetPassByIndex(0);
				//RayDirectionPass1 = RayDirectionTechnique.GetPassByIndex(1);

				BillboardTechnique = m_Effect.GetTechniqueByName("Final");
				BillboardPass0 = BillboardTechnique.GetPassByIndex(0);

				ImposterTechnique = m_Effect.GetTechniqueByName("Imposter");
				ImposterPass0 = ImposterTechnique.GetPassByIndex(0);

				BillboardLayout = new InputLayout(GameEnvironment.Device, BillboardPass0.Description.Signature, new[] {
					new InputElement("POSITION", 0, Format.R32G32_Float, 0, 0),
					new InputElement("TEXCOORD", 0, Format.R32G32_Float, 8, 0)		
				});

				rayStart_texture = m_Effect.GetVariableByName("rayStart_texture").AsResource();
				rayDir_texture = m_Effect.GetVariableByName("rayDir_texture").AsResource();
				imposter = m_Effect.GetVariableByName("imposter").AsResource();
				volume_texture = m_Effect.GetVariableByName("volume_texture").AsResource();
				LocationColor = m_Effect.GetVariableByName("locationColor").AsVector();

				#endregion	

				#region Billboard Verts

				float minX = -1f;
				float miny = -1f;
				float maxX = 1f;
				float maxY = 1f; 

				using (DataStream stream = new DataStream(4 * Marshal.SizeOf(typeof(Vertex2D)), true, true))
				{
					stream.WriteRange(new Vertex2D[] {					
						new Vertex2D() { Position = new Vector2(maxX, miny), TextureCoords =  new Vector2(1.0f, 1.0f) }, 
						new Vertex2D() { Position = new Vector2(minX, miny), TextureCoords =  new Vector2(0.0f, 1.0f) }, 
						new Vertex2D() { Position = new Vector2(maxX, maxY), TextureCoords = new Vector2(1.0f, 0.0f) },  
						new Vertex2D() { Position = new Vector2(minX, maxY), TextureCoords =  new Vector2(0.0f, 0.0f) } 
					});
					stream.Position = 0;

					BillboardVertices = new SlimDX.Direct3D11.Buffer(GameEnvironment.Device, stream, new BufferDescription()
					{
						BindFlags = BindFlags.VertexBuffer,
						CpuAccessFlags = CpuAccessFlags.None,
						OptionFlags = ResourceOptionFlags.None,
						SizeInBytes = 4 * Marshal.SizeOf(typeof(Vertex2D)),
						Usage = ResourceUsage.Default
					});
				}

				BillboardVerticesBindings = new VertexBufferBinding(BillboardVertices, Marshal.SizeOf(typeof(UIVertex)), 0);

				#endregion

				m_Disposed = false; 
			}	
		}
示例#55
0
		public void Initialize(Device device) {
			_b = EffectUtils.Load("SpecialShadow");
			E = new Effect(device, _b);

			TechHorizontalShadowBlur = E.GetTechniqueByName("HorizontalShadowBlur");
			TechVerticalShadowBlur = E.GetTechniqueByName("VerticalShadowBlur");
			TechAmbientShadow = E.GetTechniqueByName("AmbientShadow");
			TechResult = E.GetTechniqueByName("Result");

			for (var i = 0; i < TechHorizontalShadowBlur.Description.PassCount && InputSignaturePT == null; i++) {
				InputSignaturePT = TechHorizontalShadowBlur.GetPassByIndex(i).Description.Signature;
			}
			if (InputSignaturePT == null) throw new System.Exception("input signature (SpecialShadow, PT, HorizontalShadowBlur) == null");
			LayoutPT = new InputLayout(device, InputSignaturePT, InputLayouts.VerticePT.InputElementsValue);

			FxShadowViewProj = E.GetVariableByName("gShadowViewProj").AsMatrix();
			FxInputMap = E.GetVariableByName("gInputMap").AsResource();
			FxDepthMap = E.GetVariableByName("gDepthMap").AsResource();
			FxMultipler = E.GetVariableByName("gMultipler").AsScalar();
			FxCount = E.GetVariableByName("gCount").AsScalar();
			FxPadding = E.GetVariableByName("gPadding").AsScalar();
			FxSize = E.GetVariableByName("gSize").AsVector();
			FxShadowSize = E.GetVariableByName("gShadowSize").AsVector();
		}
示例#56
0
        public void Render()
        {
            //BlendStateDescription desc = new BlendStateDescription();
            //desc.RenderTarget[0].SourceBlend = BlendOption.SourceAlpha;
            //desc.RenderTarget[0].SourceAlphaBlend = BlendOption.One;
            //desc.RenderTarget[0].DestinationBlend = BlendOption.InverseSourceAlpha;
            //desc.RenderTarget[0].DestinationAlphaBlend = BlendOption.InverseSourceAlpha;
            //SharpDX.Direct3D11.BlendState bs = new BlendState(Global._G.device, desc);
            //Global._G.context.OutputMerger.SetBlendState(bs, null, -1);
            //bs.Dispose();

            // Prepare All the stages
            Global._G.context.InputAssembler.InputLayout = layout;
            Global._G.context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
            //Global._G.dxState.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertices, Utilities.SizeOf<Vector3>() + Utilities.SizeOf<Vector3>() + Utilities.SizeOf<Vector2>(), 0));
            int lamez = System.Runtime.InteropServices.Marshal.SizeOf(new VertexPNT());
            Global._G.context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertices, lamez, 0));
            Global._G.context.InputAssembler.SetIndexBuffer(indexBuffer, Format.R32_UInt, 0);

            #if DEBUG
            technique = Global._G.effect.GetTechniqueByName(shaderName);	// Realtime update shaders if file was changed
            #endif
            int numPasses = technique.Description.PassCount;
            for (int count = 0; count < numPasses; count++)
            {
                EffectPass pass = technique.GetPassByIndex(count);
                pass.Apply(Global._G.context);
                Global._G.context.VertexShader.SetConstantBuffer(0, Global._G.constantBuffer);
                Global._G.context.PixelShader.SetConstantBuffer(0, Global._G.constantBuffer);
                //Global._G.dxState.VertexShader.Set(Global._G.vertexShader);
                //Global._G.dxState.PixelShader.Set(Global._G.pixelShader);
                //Global._G.context.PixelShader.SetSampler(0, sampler);
                Global._G.context.PixelShader.SetShaderResources(0, textureView.Length, textureView);
                Global._G.context.DrawIndexed(numIndexes, 0, 0);
            }
        }
示例#57
0
        public D3D10Renderer(Device1 device3D)
        {
            Contract.Requires(device3D != null);

            _Device3D = device3D;

            string shader = GetShaderText(Properties.Resources.RenderingEffects);

            using(var byteCode = ShaderBytecode.Compile(
                    shader, "fx_4_0", ShaderFlags.None, EffectFlags.None))
            {
                _Effect = new Effect(_Device3D, byteCode);
            }

            _EffectTechnique = _Effect.GetTechniqueByName("WithTexture");

            Contract.Assert(_EffectTechnique != null);

            _EffectPass = _EffectTechnique.GetPassByIndex(0);

            Contract.Assert(_EffectPass != null);

            _InputLayout = new InputLayout(
                _Device3D, _EffectPass.Description.Signature, _InputLayoutData);

            const int byteSize = _Stride * _VertexCount;

            using(DataStream stream = new DataStream(byteSize, true, true))
            {
                for(int i = 0; i < _QuadPrimitiveData.Length; i += 2)
                {
                    float fx = (2.0f * _QuadPrimitiveData[i + 0].X) - 1.0f;
                    float fy = (2.0f * _QuadPrimitiveData[i + 0].Y) - 1.0f;

                    stream.Write(new Vector3(fx, -fy, 0.5f));
                    stream.Write(_QuadPrimitiveData[i + 1]);
                }

                stream.Seek(0, SeekOrigin.Begin);

                BufferDescription description = new BufferDescription
                {
                    BindFlags = BindFlags.VertexBuffer,
                    CpuAccessFlags = CpuAccessFlags.None,
                    OptionFlags = ResourceOptionFlags.None,
                    Usage = ResourceUsage.Immutable,
                    SizeInBytes = byteSize
                };

                description.SizeInBytes = byteSize;

                _VertexBuffer = new Buffer(_Device3D, stream, description);

                _VertexBufferBinding = new VertexBufferBinding(
                    _VertexBuffer, _Stride, _Offset);
            }
        }
示例#58
0
        private void DrawRoom(EffectTechnique activeTech, Matrix viewProj) {
            // Draw floor and walls
            for (int p = 0; p < activeTech.Description.PassCount; p ++) {
                var pass = activeTech.GetPassByIndex(p);

                ImmediateContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(_roomVB, Basic32.Stride, 0));

                var world = _roomWorld;
                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(_roomMat);

                Effects.BasicFX.SetDiffuseMap(_floorDiffuseMapSRV);
                pass.Apply(ImmediateContext);
                ImmediateContext.Draw(6, 0);

                Effects.BasicFX.SetDiffuseMap(_wallDiffuseMapSRV);
                pass.Apply(ImmediateContext);
                ImmediateContext.Draw(18, 6);
            }
        }
示例#59
0
        public bool Initialize()
        {
            Debug.Assert(!_initialized);

            #region Shaders
            string SpriteFX = @"Texture2D SpriteTex;
SamplerState samLinear {
    Filter = MIN_MAG_MIP_LINEAR;
    AddressU = WRAP;
    AddressV = WRAP;
};
struct VertexIn {
    float3 PosNdc : POSITION;
    float2 Tex    : TEXCOORD;
    float4 Color  : COLOR;
};
struct VertexOut {
    float4 PosNdc : SV_POSITION;
    float2 Tex    : TEXCOORD;
    float4 Color  : COLOR;
};
VertexOut VS(VertexIn vin) {
    VertexOut vout;
    vout.PosNdc = float4(vin.PosNdc, 1.0f);
    vout.Tex    = vin.Tex;
    vout.Color  = vin.Color;
    return vout;
};
float4 PS(VertexOut pin) : SV_Target {
    return pin.Color*SpriteTex.Sample(samLinear, pin.Tex);
};
technique11 SpriteTech {
    pass P0 {
        SetVertexShader( CompileShader( vs_5_0, VS() ) );
        SetHullShader( NULL );
        SetDomainShader( NULL );
        SetGeometryShader( NULL );
        SetPixelShader( CompileShader( ps_5_0, PS() ) );
    }
};";
            #endregion

            _compiledFX = ShaderBytecode.Compile(SpriteFX, "SpriteTech", "fx_5_0");
            {
                
                if (_compiledFX.HasErrors)
                    return false;

                _effect = new Effect(_device, _compiledFX);
                {
                    _spriteTech = _effect.GetTechniqueByName("SpriteTech");
                    _spriteMap = _effect.GetVariableByName("SpriteTex").AsShaderResource();

                    var pass = _spriteTech.GetPassByIndex(0).Description.Signature;
                    InputElement[] layoutDesc = {
                                                    new InputElement("POSITION", 0, SharpDX.DXGI.Format.R32G32B32_Float, 0, 0, InputClassification.PerVertexData, 0),
                                                    new InputElement("TEXCOORD", 0, SharpDX.DXGI.Format.R32G32_Float, 12, 0, InputClassification.PerVertexData, 0),
                                                    new InputElement("COLOR", 0, SharpDX.DXGI.Format.R32G32B32A32_Float, 20, 0, InputClassification.PerVertexData, 0)
                                                };

                    _inputLayout = new InputLayout(_device, pass, layoutDesc);

                    // Create Vertex Buffer
                    BufferDescription vbd = new BufferDescription
                    {
                        SizeInBytes = 2048 * Marshal.SizeOf(typeof(SpriteVertex)),
                        Usage = ResourceUsage.Dynamic,
                        BindFlags = BindFlags.VertexBuffer,
                        CpuAccessFlags = CpuAccessFlags.Write,
                        OptionFlags = ResourceOptionFlags.None,
                        StructureByteStride = 0
                    };

                    _VB = new SharpDX.Direct3D11.Buffer(_device, vbd);

                    // Create and initialise Index Buffer

                    short[] indices = new short[3072];

                    for (ushort i = 0; i < 512; ++i)
                    {
                        indices[i * 6] = (short)(i * 4);
                        indices[i * 6 + 1] = (short)(i * 4 + 1);
                        indices[i * 6 + 2] = (short)(i * 4 + 2);
                        indices[i * 6 + 3] = (short)(i * 4);
                        indices[i * 6 + 4] = (short)(i * 4 + 2);
                        indices[i * 6 + 5] = (short)(i * 4 + 3);
                    }

                    _indexBuffer = Marshal.AllocHGlobal(indices.Length * Marshal.SizeOf(indices[0]));
                    Marshal.Copy(indices, 0, _indexBuffer, indices.Length);

                    BufferDescription ibd = new BufferDescription
                    {
                        SizeInBytes = 3072 * Marshal.SizeOf(typeof(short)),
                        Usage = ResourceUsage.Immutable,
                        BindFlags = BindFlags.IndexBuffer,
                        CpuAccessFlags = CpuAccessFlags.None,
                        OptionFlags = ResourceOptionFlags.None,
                        StructureByteStride = 0
                    };
                    
                    _IB = new SharpDX.Direct3D11.Buffer(_device, _indexBuffer, ibd);

                    BlendStateDescription transparentDesc = new BlendStateDescription()
                    {
                        AlphaToCoverageEnable = false,
                        IndependentBlendEnable = false,
                    };
                    transparentDesc.RenderTarget[0].IsBlendEnabled = true;
                    transparentDesc.RenderTarget[0].SourceBlend = BlendOption.SourceAlpha;
                    transparentDesc.RenderTarget[0].DestinationBlend = BlendOption.InverseSourceAlpha;
                    transparentDesc.RenderTarget[0].BlendOperation = BlendOperation.Add;
                    transparentDesc.RenderTarget[0].SourceAlphaBlend = BlendOption.One;
                    transparentDesc.RenderTarget[0].DestinationAlphaBlend = BlendOption.Zero;
                    transparentDesc.RenderTarget[0].AlphaBlendOperation = BlendOperation.Add;
                    transparentDesc.RenderTarget[0].RenderTargetWriteMask = ColorWriteMaskFlags.All;

                    _transparentBS = new BlendState(_device, transparentDesc);
                }
            }

            _initialized = true;

            return true;
        }
示例#60
0
        public void MakeLatLonSphere2(int latDivs, int lonDivs)
        {
            List<VertexPNT> verts = new List<VertexPNT>();
            List<int> faceTemp = new List<int>();
            int index = 0;
            for (int lat = -latDivs / 2; lat <= latDivs / 2; lat++)
            {
                for (int lon = 0; lon <= lonDivs; lon++)
                {
                    float2 pos = new float2((float)lon / lonDivs, (float)lat / latDivs);
                    float2 radScale = new float2((float)(2 * Math.PI), (float)(Math.PI));

                    if ((lon != lonDivs) && (lat != latDivs /2))
                    {
                        int row = lonDivs + 1;
                        faceTemp.Add(index);
                        faceTemp.Add(index + row);
                        faceTemp.Add(index + 1);
                        faceTemp.Add(index + row);
                        faceTemp.Add(index + row + 1);
                        faceTemp.Add(index + 1);
                    }

                    float3 posXYZ = new float3();
                    VertexPNT v0 = new VertexPNT();
                    v0._pos = SphericalCoord(pos * radScale, out posXYZ);
                    v0.normal = posXYZ.Normalize();
                    v0.uv0 = new float2(1.0f-pos.x, pos.y + 0.5f);
                    verts.Add(v0);
                    index++;
                }
            }

            int[] faceList = faceTemp.ToArray();// GenerateDefaultFaceList(verts);
            indexBuffer = Buffer.Create(Global._G.device, BindFlags.IndexBuffer, faceList);
            numIndexes = faceList.Length;

            //public EffectPass pass;
            //EffectTechnique technique = effect.GetTechniqueByIndex(0);
            shaderName = "EarthRender";
            technique = Global._G.effect.GetTechniqueByName(shaderName);
            EffectPass pass = technique.GetPassByIndex(0);
            var passSignature = pass.Description.Signature;
            layout = new InputLayout(Global._G.device, passSignature, new[]
            //ShaderSignature sig = ShaderSignature.GetInputSignature(Global._G.vertexShaderByteCode);
            //layout = new InputLayout(Global._G.device, sig, new[]
                {
                    new InputElement("POSITION", 0, Format.R32G32B32_Float, 0, 0),
                    new InputElement("NORMAL", 0, Format.R32G32B32_Float, 12, 0),
                    new InputElement("TEXCOORD", 0, Format.R32G32_Float, 12+12, 0)
                });
            vertices = Buffer.Create(Global._G.device, BindFlags.VertexBuffer, verts.ToArray());

            //SharpDX.Direct3D11.Resource tex = Texture2D.FromFile<Texture2D>(Global._G.device, @"Content\world.200401.3x540x270.jpg");
            ////SharpDX.Direct3D11.Resource tex = Texture2D.FromFile<Texture2D>(Global._G.device, @"C:\dev\Globe\Content\Custom\world.200401.3x5400x2700.jpg");
            //textureView = new ShaderResourceView(Global._G.device, tex);
            //tex.Dispose();
            textureView = new ShaderResourceView[] {
                Global._G.texMan.texDict["world.200401.3x540x270"].textureView,
                //Global._G.texMan.texDict["world.200407.3x5400x2700"].textureView,
                //Global._G.texMan.texDict["world.200408.3x8192x8192"].textureView,
                Global._G.texMan.texDict["noiseRGBA"].textureView,
                Global._G.texMan.texDict["cloud_combined_1024"].textureView
            };

            // This is handled the the shader effects file. Maybe someday we can make an override if needed.
            //sampler = new SamplerState(Global._G.device, new SamplerStateDescription()
            //{
            //    Filter = Filter.Anisotropic,
            //    AddressU = TextureAddressMode.Wrap,
            //    AddressV = TextureAddressMode.Wrap,
            //    AddressW = TextureAddressMode.Wrap,
            //    BorderColor = Color.Black,
            //    ComparisonFunction = Comparison.Never,
            //    MaximumAnisotropy = 16,
            //    MipLodBias = 0,
            //    MinimumLod = 0,
            //    MaximumLod = 16,
            //});

            //			CreateVertexBuffer(faces);
            //		m_shader = "simpleGlobeShade";
        }