From c1f4b8a9be2e9289e6ffbe6e0b7b028895137783 Mon Sep 17 00:00:00 2001 From: "SND\\AstrorEnales_cp" Date: Mon, 21 Nov 2011 20:01:03 +0000 Subject: [PATCH] Finally got the GL-Rendering to work, now investigating the wrong texture --- .../BlendStateGL3.cs | 4 + .../DatatypesMapping.cs | 7 +- .../DepthStencilStateGL3.cs | 11 +++ .../ANX.Framework.Windows.GL3/EffectGL3.cs | 9 ++- .../EffectParameterGL3.cs | 12 ++- .../GraphicsDeviceWindowsGL3.cs | 73 +++++++++++-------- .../IndexBufferGL3.cs | 18 ++++- .../RasterizerStateGL3.cs | 2 + .../VertexBufferGL3.cs | 58 +++++++++++---- Samples/SimpleSprite/Game1.cs | 16 ++++ 10 files changed, 157 insertions(+), 53 deletions(-) diff --git a/RenderSystems/ANX.Framework.Windows.GL3/BlendStateGL3.cs b/RenderSystems/ANX.Framework.Windows.GL3/BlendStateGL3.cs index 900bd31e..4a5ee928 100644 --- a/RenderSystems/ANX.Framework.Windows.GL3/BlendStateGL3.cs +++ b/RenderSystems/ANX.Framework.Windows.GL3/BlendStateGL3.cs @@ -193,12 +193,14 @@ namespace ANX.Framework.Windows.GL3 GL.BlendEquationSeparate( TranslateBlendFunction(ColorBlendFunction), TranslateBlendFunction(AlphaBlendFunction)); + ErrorHelper.Check("BlendEquationSeparate"); GL.BlendFuncSeparate( TranslateBlendSrc(ColorSourceBlend), TranslateBlendDest(ColorDestinationBlend), TranslateBlendSrc(AlphaSourceBlend), TranslateBlendDest(AlphaDestinationBlend)); + ErrorHelper.Check("BlendFuncSeparate"); SetColorWriteChannel(0, ColorWriteChannels); SetColorWriteChannel(1, ColorWriteChannels1); @@ -209,6 +211,7 @@ namespace ANX.Framework.Windows.GL3 BlendFactor.G * DatatypesMapping.ColorMultiplier, BlendFactor.B * DatatypesMapping.ColorMultiplier, BlendFactor.A * DatatypesMapping.ColorMultiplier); + ErrorHelper.Check("BlendColor"); // TODO: multi sample mask } @@ -252,6 +255,7 @@ namespace ANX.Framework.Windows.GL3 channels == Graphics.ColorWriteChannels.Alpha); GL.ColorMask(index, r, g, b, a); + ErrorHelper.Check("ColorMask"); } #endregion diff --git a/RenderSystems/ANX.Framework.Windows.GL3/DatatypesMapping.cs b/RenderSystems/ANX.Framework.Windows.GL3/DatatypesMapping.cs index 311e6b14..fcfe2ee8 100644 --- a/RenderSystems/ANX.Framework.Windows.GL3/DatatypesMapping.cs +++ b/RenderSystems/ANX.Framework.Windows.GL3/DatatypesMapping.cs @@ -240,21 +240,26 @@ namespace ANX.Framework.Windows.GL3 /// /// XNA PrimitiveType. /// Translated BeginMode for OpenGL. - public static BeginMode PrimitiveTypeToBeginMode(PrimitiveType type) + public static BeginMode PrimitiveTypeToBeginMode(PrimitiveType type, + int primitiveCount, out int count) { switch (type) { case PrimitiveType.LineList: + count = primitiveCount * 2; return BeginMode.Lines; case PrimitiveType.LineStrip: + count = primitiveCount + 1; return BeginMode.LineStrip; default: case PrimitiveType.TriangleList: + count = primitiveCount * 3; return BeginMode.Triangles; case PrimitiveType.TriangleStrip: + count = primitiveCount + 2; return BeginMode.TriangleStrip; } } diff --git a/RenderSystems/ANX.Framework.Windows.GL3/DepthStencilStateGL3.cs b/RenderSystems/ANX.Framework.Windows.GL3/DepthStencilStateGL3.cs index b9765782..eb747069 100644 --- a/RenderSystems/ANX.Framework.Windows.GL3/DepthStencilStateGL3.cs +++ b/RenderSystems/ANX.Framework.Windows.GL3/DepthStencilStateGL3.cs @@ -229,10 +229,13 @@ namespace ANX.Framework.Windows.GL3 { GL.Disable(EnableCap.DepthTest); } + ErrorHelper.Check("DepthTest"); GL.DepthFunc(TranslateDepthFunction(DepthBufferFunction)); + ErrorHelper.Check("DepthFunc"); GL.DepthMask(DepthBufferWriteEnable); + ErrorHelper.Check("DepthMask"); #endregion #region Stencil @@ -244,8 +247,10 @@ namespace ANX.Framework.Windows.GL3 { GL.Disable(EnableCap.StencilTest); } + ErrorHelper.Check("StencilTest"); GL.StencilMask(StencilWriteMask); + ErrorHelper.Check("StencilMask"); if (TwoSidedStencilMode) { @@ -253,19 +258,23 @@ namespace ANX.Framework.Windows.GL3 TranslateStencilOp(StencilFail), TranslateStencilOp(StencilDepthBufferFail), TranslateStencilOp(StencilPass)); + ErrorHelper.Check("StencilOpSeparate Front"); GL.StencilOpSeparate(StencilFace.Back, TranslateStencilOp(CounterClockwiseStencilFail), TranslateStencilOp(CounterClockwiseStencilDepthBufferFail), TranslateStencilOp(CounterClockwiseStencilPass)); + ErrorHelper.Check("StencilOpSeparate Back"); GL.StencilFuncSeparate(StencilFace.Front, TranslateStencilFunction(StencilFunction), ReferenceStencil, StencilMask); + ErrorHelper.Check("StencilFuncSeparate Front"); GL.StencilFuncSeparate(StencilFace.Back, TranslateStencilFunction(CounterClockwiseStencilFunction), ReferenceStencil, StencilMask); + ErrorHelper.Check("StencilFuncSeparate Back"); } else { @@ -273,9 +282,11 @@ namespace ANX.Framework.Windows.GL3 TranslateStencilOp(StencilFail), TranslateStencilOp(StencilDepthBufferFail), TranslateStencilOp(StencilPass)); + ErrorHelper.Check("StencilOp"); GL.StencilFunc(TranslateStencilFunction(StencilFunction), ReferenceStencil, StencilMask); + ErrorHelper.Check("StencilFunc"); } #endregion } diff --git a/RenderSystems/ANX.Framework.Windows.GL3/EffectGL3.cs b/RenderSystems/ANX.Framework.Windows.GL3/EffectGL3.cs index 2831ab50..c88c684e 100644 --- a/RenderSystems/ANX.Framework.Windows.GL3/EffectGL3.cs +++ b/RenderSystems/ANX.Framework.Windows.GL3/EffectGL3.cs @@ -103,16 +103,20 @@ namespace ANX.Framework.Windows.GL3 int uniformCount; GL.GetProgram(programHandle, ProgramParameter.ActiveUniforms, out uniformCount); + ErrorHelper.Check("GetProgram ActiveUniforms"); List names = new List(); for (int index = 0; index < uniformCount; index++) { string name = GL.GetActiveUniformName(programHandle, index); + ErrorHelper.Check("GetActiveUniformName name=" + name); if (names.Contains(name) == false) { names.Add(name); int uniformIndex = GL.GetUniformLocation(programHandle, name); + ErrorHelper.Check("GetUniformLocation name=" + name + + " uniformIndex=" + uniformIndex); parameters.Add(new EffectParameter() { NativeParameter = @@ -174,8 +178,11 @@ namespace ANX.Framework.Windows.GL3 } programHandle = GL.CreateProgram(); + ErrorHelper.Check("CreateProgram"); GL.AttachShader(programHandle, vertexShader); + ErrorHelper.Check("AttachShader vertexShader"); GL.AttachShader(programHandle, fragmentShader); + ErrorHelper.Check("AttachShader fragmentShader"); GL.LinkProgram(programHandle); int result; @@ -307,7 +314,6 @@ namespace ANX.Framework.Windows.GL3 { if (GraphicsDeviceWindowsGL3.activeEffect != this) { - System.Diagnostics.Debug.WriteLine("GL: Shader.Apply"); GL.UseProgram(programHandle); GraphicsDeviceWindowsGL3.activeEffect = this; ErrorHelper.Check("UseProgram"); @@ -322,6 +328,7 @@ namespace ANX.Framework.Windows.GL3 public void Dispose() { GL.DeleteProgram(programHandle); + ErrorHelper.Check("DeleteProgram"); int result; GL.GetProgram(programHandle, ProgramParameter.DeleteStatus, out result); diff --git a/RenderSystems/ANX.Framework.Windows.GL3/EffectParameterGL3.cs b/RenderSystems/ANX.Framework.Windows.GL3/EffectParameterGL3.cs index 4623dcf9..9736810f 100644 --- a/RenderSystems/ANX.Framework.Windows.GL3/EffectParameterGL3.cs +++ b/RenderSystems/ANX.Framework.Windows.GL3/EffectParameterGL3.cs @@ -94,7 +94,7 @@ namespace ANX.Framework.Windows.GL3 } #endregion - #region SetValue + #region SetValue (Matrix) /// /// Set a matrix value to the effect parameter. /// @@ -102,7 +102,8 @@ namespace ANX.Framework.Windows.GL3 public void SetValue(Matrix value) { GL.UseProgram(parentEffect.programHandle); - System.Diagnostics.Debug.WriteLine("GL: Setting Matrix uniform " + value); + ErrorHelper.Check("UseProgram"); + OpenTK.Matrix4 matrix = new OpenTK.Matrix4( value.M11, value.M12, value.M13, value.M14, value.M21, value.M22, value.M23, value.M24, @@ -112,7 +113,9 @@ namespace ANX.Framework.Windows.GL3 GL.UniformMatrix4(UniformIndex, false, ref matrix); ErrorHelper.Check("UniformMatrix4"); } + #endregion + #region SetValue (Texture) private Texture textureCache = null; /// /// Set a texture value to the effect parameter. @@ -121,16 +124,19 @@ namespace ANX.Framework.Windows.GL3 public void SetValue(Texture value) { GL.UseProgram(parentEffect.programHandle); + ErrorHelper.Check("UseProgram"); if (textureCache == null || textureCache != value) { // TODO: multiple texture units TextureUnit textureUnit = TextureUnit.Texture0; GL.Enable(EnableCap.Texture2D); + ErrorHelper.Check("Enable"); GL.ActiveTexture(textureUnit); + ErrorHelper.Check("ActiveTexture"); int handle = (value.NativeTexture as Texture2DGL3).NativeHandle; - System.Diagnostics.Debug.WriteLine("GL: Setting Texture uniform " + handle); GL.BindTexture(TextureTarget.Texture2D, handle); + ErrorHelper.Check("BindTexture"); int unitIndex = (int)(textureUnit - TextureUnit.Texture0); GL.Uniform1(UniformIndex, 1, ref unitIndex); ErrorHelper.Check("Uniform1"); diff --git a/RenderSystems/ANX.Framework.Windows.GL3/GraphicsDeviceWindowsGL3.cs b/RenderSystems/ANX.Framework.Windows.GL3/GraphicsDeviceWindowsGL3.cs index 782fa909..7572ee4a 100644 --- a/RenderSystems/ANX.Framework.Windows.GL3/GraphicsDeviceWindowsGL3.cs +++ b/RenderSystems/ANX.Framework.Windows.GL3/GraphicsDeviceWindowsGL3.cs @@ -81,6 +81,22 @@ namespace ANX.Framework.Windows.GL3 internal static EffectGL3 activeEffect; #endregion + #region Public + #region VSync + public bool VSync + { + get + { + return nativeContext.VSync; + } + set + { + nativeContext.VSync = value; + } + } + #endregion + #endregion + #region Constructor /// /// Create a new OpenGL graphics context. @@ -144,7 +160,7 @@ namespace ANX.Framework.Windows.GL3 GraphicsMode graphicsMode = new GraphicsMode( DatatypesMapping.SurfaceToColorFormat( - presentationParameters.BackBufferFormat), + presentationParameters.BackBufferFormat), depth, stencil, // AntiAlias Samples: 2/4/8/16/32 presentationParameters.MultiSampleCount); @@ -152,6 +168,15 @@ namespace ANX.Framework.Windows.GL3 nativeContext = new GraphicsContext(graphicsMode, nativeWindowInfo); nativeContext.MakeCurrent(nativeWindowInfo); nativeContext.LoadAll(); + + //string version = GL.GetString(StringName.Version); + //nativeContext.Dispose(); + //nativeContext = null; + //string[] parts = version.Split('.'); + //nativeContext = new GraphicsContext(graphicsMode, nativeWindowInfo, + // int.Parse(parts[0]), int.Parse(parts[1]), GraphicsContextFlags.Default); + //nativeContext.MakeCurrent(nativeWindowInfo); + //nativeContext.LoadAll(); } #endregion @@ -181,6 +206,7 @@ namespace ANX.Framework.Windows.GL3 lastClearColor = newClearColor; GL.ClearColor(color.R * ColorMultiplier, color.G * ColorMultiplier, color.B * ColorMultiplier, color.A * ColorMultiplier); + ErrorHelper.Check("ClearColor"); } GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); ErrorHelper.Check("Clear"); @@ -205,6 +231,7 @@ namespace ANX.Framework.Windows.GL3 lastClearColor = newClearColor; GL.ClearColor(anxColor.R * ColorMultiplier, anxColor.G * ColorMultiplier, anxColor.B * ColorMultiplier, anxColor.A * ColorMultiplier); + ErrorHelper.Check("ClearColor"); } ClearBufferMask mask = (ClearBufferMask)0; @@ -222,7 +249,9 @@ namespace ANX.Framework.Windows.GL3 } GL.ClearDepth(depth); + ErrorHelper.Check("ClearDepth"); GL.ClearStencil(stencil); + ErrorHelper.Check("ClearStencil"); GL.Clear(mask); ErrorHelper.Check("Clear"); } @@ -247,16 +276,17 @@ namespace ANX.Framework.Windows.GL3 int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount) { - System.Diagnostics.Debug.WriteLine("GL: DrawIndexedPrimitives"); // TODO: baseVertex, minVertexIndex, numVertices, startIndex, primitiveCount DrawElementsType elementsType = boundIndexBuffer.elementSize == IndexElementSize.SixteenBits ? DrawElementsType.UnsignedShort : DrawElementsType.UnsignedInt; - GL.DrawElements( - DatatypesMapping.PrimitiveTypeToBeginMode(primitiveType), - numVertices, elementsType, 0); + int count; + BeginMode mode = DatatypesMapping.PrimitiveTypeToBeginMode(primitiveType, + primitiveCount, out count); + + GL.DrawElements(mode, count, elementsType, 0); ErrorHelper.Check("DrawElements"); } #endregion @@ -313,9 +343,11 @@ namespace ANX.Framework.Windows.GL3 public void DrawPrimitives(PrimitiveType primitiveType, int vertexOffset, int primitiveCount) { - GL.DrawArrays( - DatatypesMapping.PrimitiveTypeToBeginMode(primitiveType), - vertexOffset, primitiveCount); + int count; + BeginMode mode = DatatypesMapping.PrimitiveTypeToBeginMode(primitiveType, + primitiveCount, out count); + GL.DrawArrays(mode, vertexOffset, count); + ErrorHelper.Check("DrawArrays"); } #endregion @@ -325,7 +357,6 @@ namespace ANX.Framework.Windows.GL3 boundVertexBuffers = new VertexBufferGL3[vertexBuffers.Length]; for (int index = 0; index < vertexBuffers.Length; index++) { - System.Diagnostics.Debug.WriteLine("GL: SetVertexBuffer " + index); boundVertexBuffers[index] = (VertexBufferGL3)vertexBuffers[index].VertexBuffer.NativeVertexBuffer; GL.BindBuffer(BufferTarget.ArrayBuffer, @@ -343,14 +374,10 @@ namespace ANX.Framework.Windows.GL3 IndexBufferGL3 nativeBuffer = (IndexBufferGL3)indexBuffer.NativeIndexBuffer; - if (boundIndexBuffer != nativeBuffer) - { - System.Diagnostics.Debug.WriteLine("GL: SetIndexBuffer"); - boundIndexBuffer = nativeBuffer; - GL.BindBuffer(BufferTarget.ElementArrayBuffer, - nativeBuffer.BufferHandle); - ErrorHelper.Check("BindBuffer"); - } + boundIndexBuffer = nativeBuffer; + GL.BindBuffer(BufferTarget.ElementArrayBuffer, + nativeBuffer.BufferHandle); + ErrorHelper.Check("BindBuffer"); } #endregion @@ -379,17 +406,5 @@ namespace ANX.Framework.Windows.GL3 { throw new NotImplementedException(); } - - public bool VSync - { - get - { - throw new NotImplementedException(); - } - set - { - throw new NotImplementedException(); - } - } } } diff --git a/RenderSystems/ANX.Framework.Windows.GL3/IndexBufferGL3.cs b/RenderSystems/ANX.Framework.Windows.GL3/IndexBufferGL3.cs index 37c154bd..9250d714 100644 --- a/RenderSystems/ANX.Framework.Windows.GL3/IndexBufferGL3.cs +++ b/RenderSystems/ANX.Framework.Windows.GL3/IndexBufferGL3.cs @@ -148,23 +148,33 @@ namespace ANX.Framework.Windows.GL3 #region BufferData (private helper) private void BufferData(T[] data, int offset) where T : struct { - IntPtr size = (IntPtr)((elementSize == IndexElementSize.SixteenBits ? - 2 : 4) * data.Length); + int size = (elementSize == IndexElementSize.SixteenBits ? + 2 : 4) * data.Length; GL.BindBuffer(BufferTarget.ElementArrayBuffer, bufferHandle); ErrorHelper.Check("BindBuffer"); if (offset == 0) { - GL.BufferData(BufferTarget.ElementArrayBuffer, size, data, usageHint); + GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)size, data, + usageHint); ErrorHelper.Check("BufferData size=" + size); } else { GL.BufferSubData(BufferTarget.ElementArrayBuffer, (IntPtr)offset, - size, data); + (IntPtr)size, data); ErrorHelper.Check("BufferSubData offset=" + offset + " size=" + size); } + + int setSize; + GL.GetBufferParameter(BufferTarget.ElementArrayBuffer, + BufferParameterName.BufferSize, out setSize); + if (setSize != size) + { + throw new Exception("Failed to set the indexBuffer data. DataSize=" + + size + " SetSize=" + setSize); + } } #endregion diff --git a/RenderSystems/ANX.Framework.Windows.GL3/RasterizerStateGL3.cs b/RenderSystems/ANX.Framework.Windows.GL3/RasterizerStateGL3.cs index a9af59f7..9d45cd1c 100644 --- a/RenderSystems/ANX.Framework.Windows.GL3/RasterizerStateGL3.cs +++ b/RenderSystems/ANX.Framework.Windows.GL3/RasterizerStateGL3.cs @@ -160,6 +160,7 @@ namespace ANX.Framework.Windows.GL3 #region Cull Mode GL.FrontFace(FrontFaceDirection.Cw); + ErrorHelper.Check("FrontFace"); if (CullMode == CullMode.None) { GL.Disable(EnableCap.CullFace); @@ -179,6 +180,7 @@ namespace ANX.Framework.Windows.GL3 GL.PolygonMode(MaterialFace.FrontAndBack, FillMode == FillMode.WireFrame ? PolygonMode.Line : PolygonMode.Fill); + ErrorHelper.Check("PolygonMode"); #region ScissorTestEnable if (ScissorTestEnable) diff --git a/RenderSystems/ANX.Framework.Windows.GL3/VertexBufferGL3.cs b/RenderSystems/ANX.Framework.Windows.GL3/VertexBufferGL3.cs index 2b1dccf2..5c0e38a4 100644 --- a/RenderSystems/ANX.Framework.Windows.GL3/VertexBufferGL3.cs +++ b/RenderSystems/ANX.Framework.Windows.GL3/VertexBufferGL3.cs @@ -103,9 +103,19 @@ namespace ANX.Framework.Windows.GL3 ErrorHelper.Check("GenBuffers"); GL.BindBuffer(BufferTarget.ArrayBuffer, bufferHandle); ErrorHelper.Check("BindBuffer"); - IntPtr size = (IntPtr)(vertexDeclaration.VertexStride * setVertexCount); - GL.BufferData(BufferTarget.ArrayBuffer, size, IntPtr.Zero, usageHint); + int size = vertexDeclaration.VertexStride * setVertexCount; + GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)size, IntPtr.Zero, + usageHint); ErrorHelper.Check("BufferData"); + + int setSize; + GL.GetBufferParameter(BufferTarget.ArrayBuffer, + BufferParameterName.BufferSize, out setSize); + if (setSize != size) + { + throw new Exception("Failed to set the vertexBuffer data. DataSize=" + + size + " SetSize=" + setSize); + } } #endregion @@ -153,15 +163,16 @@ namespace ANX.Framework.Windows.GL3 } #endregion - #region BufferData (private helper) (TODO) + #region BufferData (private helper) private void BufferData(T[] data, int offset) where T : struct { - IntPtr size = (IntPtr)(vertexDeclaration.VertexStride * data.Length); + int size = vertexDeclaration.VertexStride * data.Length; GL.BindBuffer(BufferTarget.ArrayBuffer, bufferHandle); ErrorHelper.Check("BindBuffer"); - GL.BufferSubData(BufferTarget.ArrayBuffer, (IntPtr)offset, size, data); + GL.BufferSubData(BufferTarget.ArrayBuffer, (IntPtr)offset, + (IntPtr)size, data); ErrorHelper.Check("BufferSubData"); } #endregion @@ -169,37 +180,53 @@ namespace ANX.Framework.Windows.GL3 #region MapVertexDeclaration internal void MapVertexDeclaration(int programHandle) { - foreach (VertexElement element in vertexDeclaration.GetVertexElements()) + int attributes; + GL.GetProgram(programHandle, ProgramParameter.ActiveAttributes, + out attributes); + + VertexElement[] elements = vertexDeclaration.GetVertexElements(); + if (elements.Length != attributes) + { + throw new InvalidOperationException("Mapping the VertexDeclaration " + + "onto the glsl attributes failed because we have " + + attributes + " Shader Attributes and " + elements.Length + + " elements in the vertex declaration which doesn't fit!"); + } + + foreach (VertexElement element in elements) { // TODO: element.UsageIndex? switch (element.VertexElementUsage) { case VertexElementUsage.Position: - GL.EnableClientState(ArrayCap.VertexArray); int loc = GL.GetAttribLocation(programHandle, "pos"); + ErrorHelper.Check("GetAttribLocation pos"); GL.EnableVertexAttribArray(loc); + ErrorHelper.Check("EnableVertexAttribArray pos"); GL.VertexAttribPointer(loc, 3, VertexAttribPointerType.Float, false, vertexDeclaration.VertexStride, element.Offset); - ErrorHelper.Check(); + ErrorHelper.Check("VertexAttribPointer pos"); break; case VertexElementUsage.Color: - GL.EnableClientState(ArrayCap.ColorArray); int col = GL.GetAttribLocation(programHandle, "col"); + ErrorHelper.Check("GetAttribLocation col"); GL.EnableVertexAttribArray(col); - GL.VertexAttribPointer(col, 4, VertexAttribPointerType.Float, - false, vertexDeclaration.VertexStride, element.Offset); - ErrorHelper.Check(); + ErrorHelper.Check("EnableVertexAttribArray col"); + GL.VertexAttribPointer(col, 1, VertexAttribPointerType.UnsignedInt, + false, vertexDeclaration.VertexStride, element.Offset); + ErrorHelper.Check("VertexAttribPointer col"); break; case VertexElementUsage.TextureCoordinate: - GL.EnableClientState(ArrayCap.TextureCoordArray); int tex = GL.GetAttribLocation(programHandle, "tex"); + ErrorHelper.Check("GetAttribLocation tex"); GL.EnableVertexAttribArray(tex); + ErrorHelper.Check("EnableVertexAttribArray tex"); GL.VertexAttribPointer(tex, 2, VertexAttribPointerType.Float, - false, vertexDeclaration.VertexStride, element.Offset); - ErrorHelper.Check(); + false, vertexDeclaration.VertexStride, element.Offset); + ErrorHelper.Check("VertexAttribPointer tex"); break; // TODO @@ -226,6 +253,7 @@ namespace ANX.Framework.Windows.GL3 public void Dispose() { GL.DeleteBuffers(1, ref bufferHandle); + ErrorHelper.Check("DeleteBuffers"); } #endregion } diff --git a/Samples/SimpleSprite/Game1.cs b/Samples/SimpleSprite/Game1.cs index 2538e299..b553c3f0 100644 --- a/Samples/SimpleSprite/Game1.cs +++ b/Samples/SimpleSprite/Game1.cs @@ -71,6 +71,11 @@ namespace WindowsGame1 float[] y = new float[] { 10f, 10f, 10f, 10f, 10f, 10f }; Random r = new Random(); + + private float elapsedLastSecond = 0f; + private int fpsCount = 0; + private int lastFps = 60; + public Game1() : base("OpenGL3") { @@ -120,6 +125,17 @@ namespace WindowsGame1 /// Provides a snapshot of timing values. protected override void Update(GameTime gameTime) { + elapsedLastSecond += (float)gameTime.ElapsedGameTime.TotalSeconds; + fpsCount++; + if (elapsedLastSecond >= 1f) + { + elapsedLastSecond -= 1f; + lastFps = fpsCount; + fpsCount = 0; + + Window.Title = "FPS=" + lastFps; + } + // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit();