private void ProjectToZBuffer(ZBufferItem[] zBuffer, IRayFactory rayFactory) { foreach (var o in Objects) { for (int i = 0; i < o.Mesh.Triangles.Length; ++i) { var t = o.Mesh.Triangles[i]; var v1 = o.Mesh.Vertices[t.V1]; var v2 = o.Mesh.Vertices[t.V2]; var v3 = o.Mesh.Vertices[t.V3]; var n = o.Mesh.Normals[i]; rayFactory.ProjectToZBuffer(v1, v2, v3, n, zBuffer, o); } } }
public string RenderScene(int[] colors, int width, int height, bool parallel = true, CancellationToken?cancellationToken = null) { if (ZBuffer == null) { ZBuffer = new ZBufferItem[width * height]; } if (rayFactory == null) { rayFactory = Camera.GetRayFactory(width, height); } var watch = Stopwatch.StartNew(); Scene.Render(rayFactory, width, height, colors, ZBuffer); watch.Stop(); var tCount = Sphere.Mesh.Triangles.Length + Cube.Mesh.Triangles.Length; var t = (int)(tCount / (float)watch.ElapsedMilliseconds); var fps = 1000 / watch.ElapsedMilliseconds; var debug = "Rendered in " + watch.ElapsedMilliseconds + " ms Polycount: " + tCount + "; Speed: " + t + " t/ms; FPS: " + fps; Debug.WriteLine(debug); return(debug); }
public void Render(IRayFactory rayFactory, int width, int height, int[] frameBuffer, ZBufferItem[] zBuffer) { ClearZBuffer(zBuffer); ProjectToZBuffer(zBuffer, rayFactory); WriteToFrameBuffer(frameBuffer, zBuffer); }