internal static void UpdateDeltaTime() { float currTimePick_ms = Watch.ElapsedMilliseconds; float realTimeElapsed_ms; if (lastRealTimeMeasurement_ms > 0) { realTimeElapsed_ms = (currTimePick_ms - lastRealTimeMeasurement_ms); } else { realTimeElapsed_ms = GLWindow.CurrentWindow._vSync ? 16.66667f : smoothedDeltaRealTime_ms; // just the first time } movAverageDeltaTime_ms = (realTimeElapsed_ms + movAverageDeltaTime_ms * (movAveragePeriod - 1)) / movAveragePeriod; smoothedDeltaRealTime_ms = smoothedDeltaRealTime_ms + (movAverageDeltaTime_ms - smoothedDeltaRealTime_ms) * smoothFactor; deltaTimeFactor = HelperGeneral.Clamp(smoothedDeltaRealTime_ms / TargetFrameTime, 0.00001f, 10); lastRealTimeMeasurement_ms = currTimePick_ms; }
internal static void SaveTextureToBitmap16(int texId, string name = null) { GL.Flush(); GL.Finish(); GL.BindTexture(TextureTarget.Texture2D, texId); GL.GetTextureLevelParameter(texId, 0, GetTextureParameter.TextureWidth, out int width); GL.GetTextureLevelParameter(texId, 0, GetTextureParameter.TextureHeight, out int height); Bitmap b = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); float[] data = new float[width * height * 4]; GL.GetTexImage(TextureTarget.Texture2D, 0, OpenTK.Graphics.OpenGL4.PixelFormat.Bgra, PixelType.Float, data); GL.BindTexture(TextureTarget.Texture2D, 0); int x = 0, y = height - 1; for (int i = 0; i < data.Length; i += 4) { float rd = HelperGeneral.Clamp(data[i] * byte.MaxValue, 0, 255); float gn = HelperGeneral.Clamp(data[i + 1] * byte.MaxValue, 0, 255); float bl = HelperGeneral.Clamp(data[i + 2] * byte.MaxValue, 0, 255); float al = HelperGeneral.Clamp(data[i + 3] * byte.MaxValue, 0, 255); byte red = (byte)rd; byte green = (byte)gn; byte blue = (byte)bl; byte alpha = (byte)al; b.SetPixel(x, y, Color.FromArgb(alpha, red, green, blue)); int prevX = x; x = (x + 1) % width; if (prevX > 0 && x == 0) { y--; } } b.Save(name == null ? "texture2d_16_tonemapped_rgba.png" : name, ImageFormat.Png); b.Dispose(); }