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); }
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; }