Example #1
0
        /// <summary>
        /// Creates an effect with on technique and one pass.
        /// </summary>
        /// <param name="vs">VertexShader to use.</param>
        /// <param name="ps">PixelShader to use.</param>
        public ShaderEffect(IVertexShader vs, IPixelShader ps)
        {
            Pass      pass      = new Pass("Pass1", vs, ps);
            Technique technique = new Technique("Technique1", pass);

            techniques.Add(technique);
        }
        public static void Render <TVertexShaderIn, TPixelShaderIn>(
            TVertexShaderIn[] vertices,
            int[] indices,
            MemoryResources resources,
            InputAssembler inputAssembler,
            OutputMerger outputMerger,
            IVertexShader <TVertexShaderIn, TPixelShaderIn> vertexShader,
            IGeometryProcessor <TPixelShaderIn> geometryProcessor,
            IRasterizer <TPixelShaderIn> rasterizer,
            IPixelShader <TPixelShaderIn> pixelShader,
            Bitmap output)
            where TVertexShaderIn : struct, IVertexShaderInput
            where TPixelShaderIn : struct, IPixelShaderInput
        {
            if (vertices.Length == 0 || indices.Length == 0)
            {
                return;
            }

            (vertices, indices) = inputAssembler.Assemble(vertices, indices);

            var vertexShaderOutput = new TPixelShaderIn[vertices.Length];

            for (var i = 0; i < vertices.Length; ++i)
            {
                vertexShaderOutput[i] = vertexShader.Transform(resources, vertices[i]);
            }

            (vertexShaderOutput, indices) = geometryProcessor.Process(vertexShaderOutput, indices);

            var pixelShaderOutput = rasterizer.Rasterize(resources, vertexShaderOutput, indices, pixelShader, outputMerger, output.Width, output.Height, _outputBuffer, _wBuffer);

            Helper.SetPixels(pixelShaderOutput, output);
        }
Example #3
0
        public override void Build(IDevice device)
        {
            _indexBuffer  = device.CreateIndexBuffer(new int[] { 0, 3, 1, 3, 2, 1 });
            _vertexBuffer = device.CreateVertexBuffer(CreateCube());

            using var pixelShaderBlob = new Blob(device.TEMPORARYCompiler.CompileShaderFromFile(@"F:\Git\GameDev\resources\shaders\BackBufferPixelShader.hlsl", "main", "ps_5_0"));
            _pixelShader = device.CreatePixelShader(pixelShaderBlob);
            using var vertexShaderBlob = new Blob(device.TEMPORARYCompiler.CompileShaderFromFile(@"F:\Git\GameDev\resources\shaders\BackBufferVertexShader.hlsl", "main", "vs_5_0"));
            _vertexShader = device.CreateVertexShader(vertexShaderBlob);

            _inputLayout = device.CreateInputLayout(new VertexLayout(2).Append("POSITION", VertexLayoutTypes.Position2D).Append("TEXCOORD", VertexLayoutTypes.Position2D), vertexShaderBlob);
            _sampler     = device.CreateSampler();
        }
Example #4
0
        public RenderMeshPass(IDevice device, ID3DCompiler compiler)
        {
            using var vertexShaderBlob = new Blob(compiler.CompileShaderFromFile(@"F:\Git\GameDev\src\Titan.D3D11.Bindings\VertexShader.hlsl", "main", "vs_5_0"));
            using var pixelShaderBlob  = new Blob(compiler.CompileShaderFromFile(@"F:\Git\GameDev\src\Titan.D3D11.Bindings\PixelShader.hlsl", "main", "ps_5_0"));

            _vertexShader = device.CreateVertexShader(vertexShaderBlob);
            _pixelShader  = device.CreatePixelShader(pixelShaderBlob);

            _inputLayout             = device.CreateInputLayout(new VertexLayout(4).Append("Position", VertexLayoutTypes.Position3D).Append("Normal", VertexLayoutTypes.Position3D).Append("Texture", VertexLayoutTypes.Texture2D).Append("Color", VertexLayoutTypes.Float4Color), vertexShaderBlob);
            _perFrameConstantBuffer  = device.CreateConstantBuffer <PerFrameContantBuffer>(BufferUsage.Dynamic, BufferAccessFlags.Write);
            _lightsConstantBuffer    = device.CreateConstantBuffer <LightsConstantBuffer>(BufferUsage.Dynamic, BufferAccessFlags.Write);
            _perObjectConstantBuffer = device.CreateConstantBuffer <PerObjectContantBuffer>(BufferUsage.Dynamic, BufferAccessFlags.Write);
            _sampler = device.CreateSampler();
        }
Example #5
0
        public RenderToBackbufferPass(IDevice device, ID3DCompiler compiler)
        {
            _backBuffer   = device.BackBuffer;
            _depthStencil = device.DepthStencil;

            _indexBuffer  = device.CreateIndexBuffer(new int[] { 0, 3, 1, 3, 2, 1 });
            _vertexBuffer = device.CreateVertexBuffer(CreateCube());

            using var pixelShaderBlob = new Blob(compiler.CompileShaderFromFile(@"F:\Git\GameDev\resources\shaders\BackBufferPixelShader.hlsl", "main", "ps_5_0"));
            _pixelShader = device.CreatePixelShader(pixelShaderBlob);
            using var vertexShaderBlob = new Blob(compiler.CompileShaderFromFile(@"F:\Git\GameDev\resources\shaders\BackBufferVertexShader.hlsl", "main", "vs_5_0"));
            _vertexShader = device.CreateVertexShader(vertexShaderBlob);
            _inputLayout  = device.CreateInputLayout(new VertexLayout(2).Append("POSITION", VertexLayoutTypes.Position2D).Append("TEXCOORD", VertexLayoutTypes.Position2D), vertexShaderBlob);
            _sampler      = device.CreateSampler();
        }
Example #6
0
        public SpriteBatchRenderer(IDevice device, IBlobReader blobReader, ICameraFactory cameraFactory)
        {
            _device  = device;
            _context = _device.ImmediateContext;
            _camera  = cameraFactory.CreateOrhographicCamera();

            _buffer       = device.CreateVertexBuffer <Vertex2D>(MaxVertices, BufferUsage.Dynamic, BufferAccessFlags.Write);
            _indices      = device.CreateIndexBuffer(CreateIndices());
            _sampler      = device.CreateSampler(true);
            _blendState   = device.CreateBlendState();
            _cameraBuffer = device.CreateConstantBuffer(new Camera {
                Transform = _camera.ViewProjection
            });
            using var vertexShaderBlob = blobReader.ReadFromFile("Shaders/VertexShader2D.cso");
            _vertexShader             = device.CreateVertexShader(vertexShaderBlob);
            using var pixelShaderBlob = blobReader.ReadFromFile("Shaders/PixelShader2D.cso");
            _pixelShader = device.CreatePixelShader(pixelShaderBlob);

            _inputLayout = device.CreateInputLayout(new VertexLayout(3).Append("Position", VertexLayoutTypes.Position2D).Append("Textures", VertexLayoutTypes.Texture2D).Append("Color", VertexLayoutTypes.Float4Color), vertexShaderBlob);
        }
Example #7
0
        public Color4[,] Rasterize(MemoryResources resources, TPixelShaderInput[] vertices, int[] indices,
                                   IPixelShader <TPixelShaderInput> pixelShader, OutputMerger outputMerger,
                                   int outputWidth, int outputHeight, Color4[,] outputBuffer, float[,] wBuffer)
        {
            for (var i = 0; i < indices.Length; i += 3)
            {
                var a   = vertices[indices[i]];
                var b   = vertices[indices[i + 1]];
                var c   = vertices[indices[i + 2]];
                var tri = new Triangle <TPixelShaderInput> {
                    A = a,
                    B = b,
                    C = c
                };

                RasterizeTriangle(tri, resources, pixelShader, outputMerger, outputWidth, outputHeight, outputBuffer, wBuffer);
            }

            return(outputBuffer);
        }
Example #8
0
 /// <summary>
 /// Creates a new instance of an <see cref="EffectEntity"/>.
 /// </summary>
 /// <param name="vs">Vertex shader to use.</param>
 /// <param name="ps">Pixel shader to use.</param>
 public EffectEntity(IVertexShader vs, IPixelShader ps)
 {
     throw new NotImplementedException("So far ;-)!");
     //this.effect = new Effect.XmlEffect(vs, ps);
 }
 public void SetPixelShader(IPixelShader shader)
 {
     _deviceContext.PixelShader.Set(((PixelShaderBox)shader).Shader);
 }
Example #10
0
        private void RasterizeTriangle(Triangle <TPixelShaderInput> tri, MemoryResources resources, IPixelShader <TPixelShaderInput> pixelShader, OutputMerger outputMerger, int outputWidth, int outputHeight, Color4[,] colorBuffer, float[,] wBuffer)
        {
            var posA         = tri.A.TransformedPosition;
            var posB         = tri.B.TransformedPosition;
            var posC         = tri.C.TransformedPosition;
            var bitmapCoordA = MapNdcToScreen(posA.X, posA.Y, outputWidth, outputHeight);
            var bitmapCoordB = MapNdcToScreen(posB.X, posB.Y, outputWidth, outputHeight);
            var bitmapCoordC = MapNdcToScreen(posC.X, posC.Y, outputWidth, outputHeight);

            // Triangle bounds (in [-1, 1] space)
            var boundsLeft   = Math.Min(bitmapCoordA.X, Math.Min(bitmapCoordB.X, bitmapCoordC.X));
            var boundsTop    = Math.Min(bitmapCoordA.Y, Math.Min(bitmapCoordB.Y, bitmapCoordC.Y));
            var boundsRight  = Math.Max(bitmapCoordA.X, Math.Max(bitmapCoordB.X, bitmapCoordC.X));
            var boundsBottom = Math.Max(bitmapCoordA.Y, Math.Max(bitmapCoordB.Y, bitmapCoordC.Y));

            if (boundsLeft == boundsRight || boundsTop == boundsBottom)
            {
                return;
            }

            for (var j = boundsTop; j <= boundsBottom; ++j)
            {
                if (j < 0 || outputHeight <= j)
                {
                    continue;
                }

                for (var i = boundsLeft; i <= boundsRight; ++i)
                {
                    if (i < 0 || outputWidth <= i)
                    {
                        continue;
                    }

                    if (!Helper.PointInTriangle(new Point(i, j), bitmapCoordA, bitmapCoordB, bitmapCoordC))
                    {
                        continue;
                    }

                    var pixCoord     = MapScreenToNdc(i, j, outputWidth, outputHeight);
                    var interpolated = InterpolatePoint(tri.A, tri.B, tri.C, pixCoord, out var outOfRange);

                    //if (outOfRange) {
                    //    continue;
                    //}

                    var pos = interpolated.TransformedPosition;

                    if (pos.Z < -1 || 1 < pos.Z || pos.Y < -1 || 1 < pos.Y || pos.X < -1 || 1 < pos.X)
                    {
                        continue;
                    }

                    var depthTestPassed = outputMerger.IsDepthTestPassed(pos.W, wBuffer[i, j]);

                    if (!depthTestPassed && colorBuffer[i, j].Alpha.Equals(1))
                    {
                        continue;
                    }

                    var pixel = pixelShader.Transform(resources, interpolated, out var discarded);

                    if (discarded)
                    {
                        continue;
                    }

                    pixel = Color4.Premultiply(pixel);

                    if (depthTestPassed)
                    {
                        wBuffer[i, j]     = pos.W;
                        colorBuffer[i, j] = outputMerger.Blend(colorBuffer[i, j], pixel);
                    }
                    else if (colorBuffer[i, j].Alpha < 1)
                    {
                        colorBuffer[i, j] = outputMerger.Blend(pixel, colorBuffer[i, j]);
                    }
                }
            }
        }