Example #1
0
        private static void RenderGouraudShader(this Image <Rgba32> screen, float[,] zBuffer)
        {
            var cameraPosition = new Vector3(1, 1, 3);
            var cameraTarget   = new Vector3(0, 0, 0);
            var cameraUp       = new Vector3(0, 1, 0);

            var viewPort   = CreateViewPort(ScreenWidth / 8, ScreenHeight / 8, ScreenWidth * 3 / 4, ScreenHeight * 3 / 4);
            var projection = CreateProjection(-1 / (cameraPosition - cameraTarget).Length());
            var modelView  = CreateLookAt(cameraPosition, cameraTarget, cameraUp);
            var light      = new Vector3(1, 1, 1).Normalize();

            var shader = new GouraudShader
            {
                Transform = viewPort * projection * modelView,
                Light     = light
            };

            var model = ModelUtils.LoadModel(@"Resources\Head\Model.obj");

            screen.Render(model, shader, zBuffer);
        }
Example #2
0
        public void Render()
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();

            DirectBitmap bitmap = new DirectBitmap(width, height);

            Rasterizer rasterizer = new Rasterizer();

            //// start of picture render by toon shader ////
            var toon_shader = new GouraudShader(model, ViewPort, Projection, ModelView, light_dir);

            for (int i = 0; i < model.FacesV.Count; i++)
            {
                Vector4[] screen_coords = new Vector4[3];
                for (int j = 0; j < model.FacesV[i].Length; j++)
                {
                    screen_coords[j] = toon_shader.Vertex(i, j);
                }

                rasterizer.Triangle(screen_coords, toon_shader, bitmap, pictureBox, z_buffer);
            }
            //// end of picture render by toon shader ////

            sw.Stop();

            model.Texture.Dispose();
            bitmap.Bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone);

            InfoViewer.ShowDiagnosticInfo
                ($"Render Time: {sw.Elapsed.TotalMilliseconds:f2} ms", new PointF(10, 30), Graphics.FromImage(bitmap.Bitmap));

            // output final render
            pictureBox.Image = bitmap.Bitmap;
        }