コード例 #1
0
        public void CanSetAndGetMatrix()
        {
            // Arrange.
            var device      = new Device();
            var description = new BufferDescription
            {
                SizeInBytes = Utilities.SizeOf <Matrix>()
            };
            var buffer = new Buffer(device, description);
            var matrix = Matrix.LookAtRH(new Vector3(1, 2, 3), Vector3.ForwardRH, Vector3.Up);

            // Act.
            device.ImmediateContext.SetBufferData(buffer, ref matrix);

            Matrix retrievedMatrix;

            buffer.GetData(out retrievedMatrix, 0, Utilities.SizeOf <Matrix>());

            // Assert.
            Assert.That(retrievedMatrix, Is.EqualTo(matrix));
        }
コード例 #2
0
        public override WriteableBitmap Initialize(Device device)
        {
            const int width  = 600;
            const int height = 400;

            // Create device and swap chain.
            var swapChainPresenter = new WpfSwapChainPresenter();

            _swapChain     = device.CreateSwapChain(width, height, swapChainPresenter);
            _deviceContext = device.ImmediateContext;

            // Create RenderTargetView from the backbuffer.
            var backBuffer = Texture2D.FromSwapChain(_swapChain, 0);

            _renderTargetView = device.CreateRenderTargetView(backBuffer);

            // Create the depth buffer
            var depthBuffer = device.CreateTexture2D(new Texture2DDescription
            {
                ArraySize = 1,
                MipLevels = 1,
                Width     = width,
                Height    = height,
                BindFlags = BindFlags.DepthStencil
            });

            // Create the depth buffer view
            _depthView = device.CreateDepthStencilView(depthBuffer);

            // Compile Vertex and Pixel shaders
            var vertexShaderByteCode = ShaderCompiler.CompileFromFile("Modules/SampleBrowser/Samples/MiniCubeTexture/MiniCubeTexture.fx", "VS", "vs_4_0");
            var vertexShader         = device.CreateVertexShader(vertexShaderByteCode);

            var pixelShaderByteCode = ShaderCompiler.CompileFromFile("Modules/SampleBrowser/Samples/MiniCubeTexture/MiniCubeTexture.fx", "PS", "ps_4_0");
            var pixelShader         = device.CreatePixelShader(pixelShaderByteCode);

            // Layout from VertexShader input signature
            var layout = device.CreateInputLayout(
                new[]
            {
                new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0),
                new InputElement("TEXCOORD", 0, Format.R32G32_Float, 0, 16)
            }, vertexShaderByteCode);

            // Instantiate Vertex buiffer from vertex data
            var vertices = device.CreateBuffer(new BufferDescription(BindFlags.VertexBuffer), new[]
            {
                // 3D coordinates              UV Texture coordinates
                -1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 1.0f,     // Front
                -1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f,
                1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 0.0f,
                -1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 1.0f,
                1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 0.0f,
                1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f,

                -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 0.0f,      // BACK
                1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
                -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
                -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
                1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
                1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,

                -1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f,      // Top
                -1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
                1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
                -1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f,
                1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
                1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f,

                -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 0.0f,     // Bottom
                1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
                -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
                -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 0.0f,
                1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f,
                1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 1.0f,

                -1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 1.0f,     // Left
                -1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
                -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
                -1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 1.0f,
                -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
                -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f,

                1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 0.0f,     // Right
                1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
                1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
                1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 0.0f,
                1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f,
                1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f
            });

            // Create Constant Buffer
            _constantBuffer = device.CreateBuffer(new BufferDescription
            {
                SizeInBytes = Utilities.SizeOf <Matrix>(),
                BindFlags   = BindFlags.ConstantBuffer
            });

            // Load texture and create sampler
            var textureStream = _resourceLoader.GetStream(
                "Modules/SampleBrowser/Samples/MiniCubeTexture/GeneticaMortarlessBlocks.jpg",
                GetType().Assembly.FullName);
            var texture     = TextureLoader.CreateTextureFromStream(device, textureStream);
            var textureView = device.CreateShaderResourceView(texture);

            var sampler = device.CreateSamplerState(new SamplerStateDescription
            {
                Filter             = Filter.MinMagMipPoint,
                AddressU           = TextureAddressMode.Wrap,
                AddressV           = TextureAddressMode.Wrap,
                AddressW           = TextureAddressMode.Wrap,
                BorderColor        = Color4.Black,
                ComparisonFunction = Comparison.Never,
                MaximumAnisotropy  = 16,
                MipLodBias         = 0,
                MinimumLod         = 0,
                MaximumLod         = 16,
            });

            // Prepare all the stages
            _deviceContext.InputAssembler.InputLayout       = layout;
            _deviceContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
            _deviceContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertices, 0, Utilities.SizeOf <Vector4>() + Utilities.SizeOf <Vector2>()));
            _deviceContext.VertexShader.SetConstantBuffers(0, _constantBuffer);
            _deviceContext.VertexShader.Shader = vertexShader;
            _deviceContext.PixelShader.Shader  = pixelShader;
            _deviceContext.PixelShader.SetSamplers(0, sampler);
            _deviceContext.PixelShader.SetShaderResources(0, textureView);

            // Setup targets and viewport for rendering
            _deviceContext.Rasterizer.SetViewports(new Viewport(0, 0, width, height, 0.0f, 1.0f));
            _deviceContext.OutputMerger.SetTargets(_depthView, _renderTargetView);

            // Prepare matrices
            _view       = Matrix.LookAtLH(new Vector3(0, 0, -5), Vector3.Zero, Vector3.UnitY);
            _projection = Matrix.PerspectiveFovLH(MathUtil.PiOverFour,
                                                  width / (float)height, 0.1f, 100.0f);

            return(swapChainPresenter.Bitmap);
        }
コード例 #3
0
            public ImageGenerator(IResourceManager resourceLoader)
            {
                const int width  = 400;
                const int height = 400;

                // Create device and swap chain.
                _device = new Device();
                var swapChainPresenter = new WpfSwapChainPresenter();

                _swapChain     = _device.CreateSwapChain(width, height, swapChainPresenter);
                _outputBitmap  = swapChainPresenter.Bitmap;
                _deviceContext = _device.ImmediateContext;

                // Create RenderTargetView from the backbuffer.
                var backBuffer = Texture2D.FromSwapChain(_swapChain, 0);

                _renderTargetView = _device.CreateRenderTargetView(backBuffer);

                // Create the depth buffer
                var depthBuffer = _device.CreateTexture2D(new Texture2DDescription
                {
                    ArraySize = 1,
                    MipLevels = 1,
                    Width     = width,
                    Height    = height,
                    BindFlags = BindFlags.DepthStencil
                });

                // Create the depth buffer view
                _depthView = _device.CreateDepthStencilView(depthBuffer);

                // Compile Vertex and Pixel shaders
                var vertexShaderByteCode = ShaderCompiler.CompileFromFile("Modules/SampleBrowser/TechDemos/Resources/TextureSampling/Texture.fx", "VS", "vs_4_0");
                var vertexShader         = _device.CreateVertexShader(vertexShaderByteCode);

                var pixelShaderByteCode = ShaderCompiler.CompileFromFile("Modules/SampleBrowser/TechDemos/Resources/TextureSampling/Texture.fx", "PS", "ps_4_1");
                var pixelShader         = _device.CreatePixelShader(pixelShaderByteCode);

                // Layout from VertexShader input signature
                var layout = _device.CreateInputLayout(
                    new[]
                {
                    new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0),
                    new InputElement("TEXCOORD", 0, Format.R32G32_Float, 0, 16)
                }, vertexShaderByteCode);

                // Instantiate Vertex buiffer from vertex data
                var vertices = _device.CreateBuffer(new BufferDescription(BindFlags.VertexBuffer), new[]
                {
                    // 3D coordinates              UV Texture coordinates
                    -1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 1.0f,     // Front
                    -1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f,
                    1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 0.0f,
                    -1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 1.0f,
                    1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 0.0f,
                    1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f,

                    -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 0.0f,     // BACK
                    1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
                    -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
                    -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
                    1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
                    1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,

                    -1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f,     // Top
                    -1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
                    1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
                    -1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f,
                    1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
                    1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f,

                    -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 0.0f,     // Bottom
                    1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
                    -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
                    -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 0.0f,
                    1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f,
                    1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 1.0f,

                    -1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 1.0f,     // Left
                    -1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
                    -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
                    -1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 1.0f,
                    -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
                    -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f,

                    1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 0.0f,     // Right
                    1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
                    1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
                    1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 0.0f,
                    1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f,
                    1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f
                });

                // Create Constant Buffer
                _constantBuffer = _device.CreateBuffer(new BufferDescription
                {
                    SizeInBytes = Utilities.SizeOf <Matrix>(),
                    BindFlags   = BindFlags.ConstantBuffer
                });

                // Load texture and create sampler
                var textureStream = resourceLoader.GetStream(
                    "Modules/SampleBrowser/TechDemos/Resources/TextureSampling/CorrodedTiles.png",
                    GetType().Assembly.FullName);
                var texture     = TextureLoader.CreateTextureFromStream(_device, textureStream);
                var textureView = _device.CreateShaderResourceView(texture);

                // Prepare all the stages
                _deviceContext.InputAssembler.InputLayout       = layout;
                _deviceContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
                _deviceContext.InputAssembler.SetVertexBuffers(0,
                                                               new VertexBufferBinding(vertices, 0, Utilities.SizeOf <Vector4>() + Utilities.SizeOf <Vector2>()));
                _deviceContext.VertexShader.SetConstantBuffers(0, _constantBuffer);
                _deviceContext.VertexShader.Shader = vertexShader;
                _deviceContext.PixelShader.Shader  = pixelShader;
                _deviceContext.PixelShader.SetShaderResources(0, textureView);

                // Setup targets and viewport for rendering
                _deviceContext.Rasterizer.SetViewports(new Viewport(0, 0, _outputBitmap.PixelWidth, _outputBitmap.PixelHeight, 0.0f, 1.0f));
                _deviceContext.OutputMerger.SetTargets(_depthView, _renderTargetView);

                // Prepare matrices
                _view       = Matrix.LookAtRH(new Vector3(0.7f, 0, -1.7f), Vector3.BackwardRH, Vector3.UnitY);
                _projection = Matrix.PerspectiveFovRH(MathUtil.PiOverFour,
                                                      _outputBitmap.PixelWidth / (float)_outputBitmap.PixelHeight, 0.1f, 100.0f);
            }
コード例 #4
0
        /// <summary>
        /// Create meshes and add vertex and index buffers.
        /// </summary>
        private void AddVertexData(
            Model model, Scene scene, Node node, Device device,
            ref Matrix transform)
        {
            var previousTransform = transform;

            transform = Matrix.Multiply(previousTransform, node.Transform.ToMatrix());

            // Also calculate inverse transpose matrix for normal/tangent/bitagent transformation.
            var invTranspose = transform;

            invTranspose.Invert();
            invTranspose.Transpose();

            if (node.HasMeshes)
            {
                foreach (int index in node.MeshIndices)
                {
                    // Get a mesh from the scene.
                    Mesh mesh = scene.Meshes[index];

                    // Create new mesh to add to model.
                    var modelMesh = new ModelMesh();
                    model.AddMesh(modelMesh);

                    // If mesh has a material extract the diffuse texture, if present.
                    Material material = scene.Materials[mesh.MaterialIndex];
                    if (material != null && material.GetTextureCount(TextureType.Diffuse) > 0)
                    {
                        TextureSlot aiTexture = material.GetTexture(TextureType.Diffuse, 0);
                        using (var fileStream = File.OpenRead(_modelPath + "\\" + Path.GetFileName(aiTexture.FilePath)))
                        {
                            var texture = _textureLoadHandler(_device, fileStream);
                            modelMesh.AddTextureDiffuse(device, texture);
                        }
                    }

                    // Determine the elements in the vertex.
                    bool hasTexCoords  = mesh.HasTextureCoords(0);
                    bool hasColors     = mesh.HasVertexColors(0);
                    bool hasNormals    = mesh.HasNormals;
                    bool hasTangents   = mesh.Tangents != null;
                    bool hasBitangents = mesh.BiTangents != null;

                    // Create vertex element list.
                    var  vertexElements = new InputElement[GetNumberOfInputElements(mesh)];
                    uint elementIndex   = 0;
                    vertexElements[elementIndex++] = new InputElement("POSITION", 0, Format.R32G32B32_Float, 0, 0);
                    var vertexSize = (short)Utilities.SizeOf <Vector3>();

                    if (hasColors)
                    {
                        vertexElements[elementIndex++] = new InputElement("COLOR", 0, Format.R8G8B8A8_UInt, 0, vertexSize);
                        vertexSize += (short)Utilities.SizeOf <Color>();
                    }
                    if (hasNormals)
                    {
                        vertexElements[elementIndex++] = new InputElement("NORMAL", 0, Format.R32G32B32_Float, 0, vertexSize);
                        vertexSize += (short)Utilities.SizeOf <Vector3>();
                    }
                    if (hasTangents)
                    {
                        vertexElements[elementIndex++] = new InputElement("TANGENT", 0, Format.R32G32B32_Float, 0, vertexSize);
                        vertexSize += (short)Utilities.SizeOf <Vector3>();
                    }
                    if (hasBitangents)
                    {
                        vertexElements[elementIndex++] = new InputElement("BITANGENT", 0, Format.R32G32B32_Float, 0, vertexSize);
                        vertexSize += (short)Utilities.SizeOf <Vector3>();
                    }
                    if (hasTexCoords)
                    {
                        vertexElements[elementIndex++] = new InputElement("TEXCOORD", 0, Format.R32G32_Float, 0, vertexSize);
                        vertexSize += (short)Utilities.SizeOf <Vector2>();
                    }

                    //set the vertex elements and size
                    modelMesh.InputElements = vertexElements;
                    modelMesh.VertexSize    = vertexSize;

                    //get pointers to vertex data
                    Vector3D[] positions  = mesh.Vertices;
                    Vector3D[] texCoords  = mesh.GetTextureCoords(0);
                    Vector3D[] normals    = mesh.Normals;
                    Vector3D[] tangents   = mesh.Tangents;
                    Vector3D[] biTangents = mesh.BiTangents;
                    Color4D[]  colours    = mesh.GetVertexColors(0);

                    //also determine primitive type
                    switch (mesh.PrimitiveType)
                    {
                    case PrimitiveType.Point:
                        modelMesh.PrimitiveTopology = PrimitiveTopology.PointList;
                        break;

                    case PrimitiveType.Line:
                        modelMesh.PrimitiveTopology = PrimitiveTopology.LineList;
                        break;

                    case PrimitiveType.Triangle:
                        modelMesh.PrimitiveTopology = PrimitiveTopology.TriangleList;
                        break;

                    default:
                        throw new Exception("ModelLoader::AddVertexData(): Unknown primitive type");
                    }

                    // Create new vertex buffer.
                    var vertexBuffer = device.CreateBuffer(
                        new BufferDescription
                    {
                        BindFlags   = BindFlags.VertexBuffer,
                        SizeInBytes = mesh.VertexCount * vertexSize
                    });

                    int byteOffset = 0;
                    for (int i = 0; i < mesh.VertexCount; i++)
                    {
                        {
                            // Add position, after transforming it with accumulated node transform.
                            Vector4 tempResult;
                            Vector3 pos = positions[i].ToVector3();
                            Vector3.Transform(ref pos, ref transform, out tempResult);
                            var result = new Vector3(tempResult.X, tempResult.Y, tempResult.Z);
                            device.ImmediateContext.SetBufferData(vertexBuffer, ref result, byteOffset);
                            byteOffset += Vector3.SizeInBytes;
                        }

                        if (hasColors)
                        {
                            var vertColor = colours[i].ToColor();
                            device.ImmediateContext.SetBufferData(vertexBuffer, ref vertColor, byteOffset);
                            byteOffset += 4;
                        }
                        if (hasNormals)
                        {
                            var     normal = normals[i].ToVector3();
                            Vector4 tempResult;
                            Vector3.Transform(ref normal, ref invTranspose, out tempResult);
                            var result = new Vector3(tempResult.X, tempResult.Y, tempResult.Z);
                            device.ImmediateContext.SetBufferData(vertexBuffer, ref result, byteOffset);
                            byteOffset += Vector3.SizeInBytes;
                        }
                        if (hasTangents)
                        {
                            var     tangent = tangents[i].ToVector3();
                            Vector4 tempResult;
                            Vector3.Transform(ref tangent, ref invTranspose, out tempResult);
                            var result = new Vector3(tempResult.X, tempResult.Y, tempResult.Z);
                            device.ImmediateContext.SetBufferData(vertexBuffer, ref result, byteOffset);
                            byteOffset += Vector3.SizeInBytes;
                        }
                        if (hasBitangents)
                        {
                            var     biTangent = biTangents[i].ToVector3();
                            Vector4 tempResult;
                            Vector3.Transform(ref biTangent, ref invTranspose, out tempResult);
                            var result = new Vector3(tempResult.X, tempResult.Y, tempResult.Z);
                            device.ImmediateContext.SetBufferData(vertexBuffer, ref result, byteOffset);
                            byteOffset += Vector3.SizeInBytes;
                        }
                        if (hasTexCoords)
                        {
                            var result = new Vector2(texCoords[i].X, 1 - texCoords[i].Y);
                            device.ImmediateContext.SetBufferData(vertexBuffer, ref result, byteOffset);
                            byteOffset += Vector2.SizeInBytes;
                        }
                    }

                    // Add it to the mesh.
                    modelMesh.VertexBuffer   = vertexBuffer;
                    modelMesh.VertexCount    = mesh.VertexCount;
                    modelMesh.PrimitiveCount = mesh.FaceCount;

                    // Get pointer to indices data.
                    var indices = mesh.GetIndices();

                    // Create new index buffer.
                    var indexBuffer = device.CreateBuffer(
                        new BufferDescription
                    {
                        BindFlags   = BindFlags.IndexBuffer,
                        SizeInBytes = indices.Length * sizeof(uint)
                    }, indices);

                    // Add it to the mesh.
                    modelMesh.IndexBuffer = indexBuffer;
                    modelMesh.IndexCount  = indices.Length;
                }
            }

            // If node has more children process them as well.
            for (var i = 0; i < node.ChildCount; i++)
            {
                AddVertexData(model, scene, node.Children[i], device, ref transform);
            }

            transform = previousTransform;
        }
コード例 #5
0
ファイル: MiniCubeSample.cs プロジェクト: prepare/rasterizr
        public override WriteableBitmap Initialize(Device device)
        {
            const int width  = 400;
            const int height = 300;

            // Create device and swap chain.
            var swapChainPresenter = new WpfSwapChainPresenter();

            _swapChain     = device.CreateSwapChain(width, height, swapChainPresenter);
            _deviceContext = device.ImmediateContext;

            // Create RenderTargetView from the backbuffer.
            var backBuffer = Texture2D.FromSwapChain(_swapChain, 0);

            _renderTargetView = device.CreateRenderTargetView(backBuffer);

            // Create the depth buffer
            var depthBuffer = device.CreateTexture2D(new Texture2DDescription
            {
                ArraySize = 1,
                MipLevels = 1,
                Width     = width,
                Height    = height,
                BindFlags = BindFlags.DepthStencil
            });

            // Create the depth buffer view
            _depthView = device.CreateDepthStencilView(depthBuffer);

            // Compile Vertex and Pixel shaders
            var vertexShaderByteCode = ShaderCompiler.CompileFromFile("Modules/SampleBrowser/Samples/MiniCube/MiniCube.fx", "VS", "vs_4_0");
            var vertexShader         = device.CreateVertexShader(vertexShaderByteCode);

            var pixelShaderByteCode = ShaderCompiler.CompileFromFile("Modules/SampleBrowser/Samples/MiniCube/MiniCube.fx", "PS", "ps_4_0");
            var pixelShader         = device.CreatePixelShader(pixelShaderByteCode);

            // Layout from VertexShader input signature
            var layout = device.CreateInputLayout(
                new[]
            {
                new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0),
                new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 0)
            }, vertexShaderByteCode);

            // Instantiate Vertex buffer from vertex data
            var vertices = device.CreateBuffer(new BufferDescription(BindFlags.VertexBuffer), new[]
            {
                new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f),                 // Front
                new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f),
                new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f),
                new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f),
                new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f),
                new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f),

                new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f),                 // BACK
                new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f),
                new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f),
                new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f),
                new Vector4(1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f),
                new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f),

                new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f),                 // Top
                new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f),
                new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f),
                new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f),
                new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f),
                new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f),

                new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f),                 // Bottom
                new Vector4(1.0f, -1.0f, 1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f),
                new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f),
                new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f),
                new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f),
                new Vector4(1.0f, -1.0f, 1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f),

                new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f),                 // Left
                new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f),
                new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f),
                new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f),
                new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f),
                new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f),

                new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f),                 // Right
                new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f),
                new Vector4(1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f),
                new Vector4(1.0f, -1.0f, -1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f),
                new Vector4(1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f),
                new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f)
            });

            // Create Constant Buffer
            _constantBuffer = device.CreateBuffer(new BufferDescription
            {
                SizeInBytes = Utilities.SizeOf <Matrix>(),
                BindFlags   = BindFlags.ConstantBuffer
            });

            // Prepare all the stages
            _deviceContext.InputAssembler.InputLayout       = layout;
            _deviceContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
            _deviceContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertices, 0, Utilities.SizeOf <Vector4>() * 2));
            _deviceContext.VertexShader.SetConstantBuffers(0, _constantBuffer);
            _deviceContext.VertexShader.Shader = vertexShader;
            _deviceContext.PixelShader.Shader  = pixelShader;

            // Setup targets and viewport for rendering
            _deviceContext.Rasterizer.SetViewports(new Viewport(0, 0, width, height, 0.0f, 1.0f));
            _deviceContext.OutputMerger.SetTargets(_depthView, _renderTargetView);

            // Prepare matrices
            _view       = Matrix.LookAtLH(new Vector3(0, 0, -5), Vector3.Zero, Vector3.UnitY);
            _projection = Matrix.PerspectiveFovLH(MathUtil.PiOverFour,
                                                  width / (float)height, 0.1f, 100.0f);

            return(swapChainPresenter.Bitmap);
        }