public static CubeMapTexture Generate(int seed, int resolution, int samples) { var rand = seed == 0 ? new Random() : new Random(seed); var stars = Star.Generate(rand, rand.Next(16384, 32768)); var dusts = DustCloud.Generate(rand, rand.Next(4096, 8192)); int renderResolution = resolution * samples; var camera = new Camera(renderResolution, renderResolution, MathHelper.PiOver2, 4f, 64f); var starShader = new StarShader { Camera = camera }; var dustShader = new DustCloudShader { Camera = camera }; var target = new FrameBuffer(new BitmapTexture2D(new Bitmap(renderResolution, renderResolution)), 16); var angles = new[] { Tuple.Create(0f, MathHelper.PiOver2), Tuple.Create(0f, -MathHelper.PiOver2), Tuple.Create(MathHelper.PiOver2, 0f), Tuple.Create(-MathHelper.PiOver2, 0f), Tuple.Create(0f, 0f), Tuple.Create(0f, MathHelper.Pi) }; var bmps = new Bitmap[6]; target.Begin(); GL.ClearColor(Color.Black); var bmp = new Bitmap(renderResolution, renderResolution); for (int i = 0; i < 6; ++i) { camera.Pitch = angles[i].Item1; camera.Yaw = angles[i].Item2; GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); dustShader.BeginBatch(); foreach (var dust in dusts) { dustShader.Render(dust); } dustShader.EndBatch(); starShader.BeginBatch(); foreach (var star in stars) { starShader.Render(star); } starShader.EndBatch(); var data = bmp.LockBits(new Rectangle(0, 0, renderResolution, renderResolution), ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); GL.ReadPixels(0, 0, renderResolution, renderResolution, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0); bmp.UnlockBits(data); bmps[i] = new Bitmap(bmp, new Size(resolution, resolution)); } bmp.Dispose(); target.End(); target.Dispose(); return(new CubeMapTexture(bmps[0], bmps[1], bmps[2], bmps[3], bmps[4], bmps[5])); }