From 72f8e735fb4218488f6c2b0748d4ed720b18904a Mon Sep 17 00:00:00 2001 From: Glatzemann Date: Mon, 5 Dec 2011 09:39:07 +0000 Subject: [PATCH] fixed issue #475 (OpenGL3 RenderSystem SpriteBatch wrong colors) --- .../BlendStateGL3.cs | 81 +++++++++---------- .../GraphicsDeviceWindowsGL3.cs | 2 +- .../Properties/AssemblyInfo.cs | 4 +- .../ANX.Framework.Windows.GL3/Texture2DGL3.cs | 10 +-- .../VertexBufferGL3.cs | 2 +- Samples/SimpleSprite/Game1.cs | 11 ++- 6 files changed, 58 insertions(+), 52 deletions(-) diff --git a/RenderSystems/ANX.Framework.Windows.GL3/BlendStateGL3.cs b/RenderSystems/ANX.Framework.Windows.GL3/BlendStateGL3.cs index 4a5ee928..9a094b69 100644 --- a/RenderSystems/ANX.Framework.Windows.GL3/BlendStateGL3.cs +++ b/RenderSystems/ANX.Framework.Windows.GL3/BlendStateGL3.cs @@ -190,28 +190,30 @@ namespace ANX.Framework.Windows.GL3 { IsBound = true; - GL.BlendEquationSeparate( - TranslateBlendFunction(ColorBlendFunction), - TranslateBlendFunction(AlphaBlendFunction)); - ErrorHelper.Check("BlendEquationSeparate"); + GL.Enable(EnableCap.Blend); - GL.BlendFuncSeparate( - TranslateBlendSrc(ColorSourceBlend), - TranslateBlendDest(ColorDestinationBlend), - TranslateBlendSrc(AlphaSourceBlend), - TranslateBlendDest(AlphaDestinationBlend)); - ErrorHelper.Check("BlendFuncSeparate"); + GL.BlendEquationSeparate( + TranslateBlendFunction(ColorBlendFunction), + TranslateBlendFunction(AlphaBlendFunction)); + ErrorHelper.Check("BlendEquationSeparate"); - SetColorWriteChannel(0, ColorWriteChannels); - SetColorWriteChannel(1, ColorWriteChannels1); - SetColorWriteChannel(2, ColorWriteChannels2); - SetColorWriteChannel(3, ColorWriteChannels3); + GL.BlendFuncSeparate( + TranslateBlendSrc(ColorSourceBlend), + TranslateBlendDest(ColorDestinationBlend), + TranslateBlendSrc(AlphaSourceBlend), + TranslateBlendDest(AlphaDestinationBlend)); + ErrorHelper.Check("BlendFuncSeparate"); - GL.BlendColor(BlendFactor.R * DatatypesMapping.ColorMultiplier, - BlendFactor.G * DatatypesMapping.ColorMultiplier, - BlendFactor.B * DatatypesMapping.ColorMultiplier, - BlendFactor.A * DatatypesMapping.ColorMultiplier); - ErrorHelper.Check("BlendColor"); + SetColorWriteChannel(0, ColorWriteChannels); + SetColorWriteChannel(1, ColorWriteChannels1); + SetColorWriteChannel(2, ColorWriteChannels2); + SetColorWriteChannel(3, ColorWriteChannels3); + + GL.BlendColor(BlendFactor.R * DatatypesMapping.ColorMultiplier, + BlendFactor.G * DatatypesMapping.ColorMultiplier, + BlendFactor.B * DatatypesMapping.ColorMultiplier, + BlendFactor.A * DatatypesMapping.ColorMultiplier); + ErrorHelper.Check("BlendColor"); // TODO: multi sample mask } @@ -245,14 +247,10 @@ namespace ANX.Framework.Windows.GL3 /// Mask channels to enable. private void SetColorWriteChannel(int index, ColorWriteChannels channels) { - bool r = (channels == Graphics.ColorWriteChannels.All || - channels == Graphics.ColorWriteChannels.Red); - bool g = (channels == Graphics.ColorWriteChannels.All || - channels == Graphics.ColorWriteChannels.Green); - bool b = (channels == Graphics.ColorWriteChannels.All || - channels == Graphics.ColorWriteChannels.Blue); - bool a = (channels == Graphics.ColorWriteChannels.All || - channels == Graphics.ColorWriteChannels.Alpha); + bool r = (channels & Graphics.ColorWriteChannels.Red) == Graphics.ColorWriteChannels.Red; + bool g = (channels & Graphics.ColorWriteChannels.Green) == Graphics.ColorWriteChannels.Green; + bool b = (channels & Graphics.ColorWriteChannels.Blue) == Graphics.ColorWriteChannels.Blue; + bool a = (channels & Graphics.ColorWriteChannels.Alpha) == Graphics.ColorWriteChannels.Alpha; GL.ColorMask(index, r, g, b, a); ErrorHelper.Check("ColorMask"); @@ -358,24 +356,25 @@ namespace ANX.Framework.Windows.GL3 /// OpenGL Blend Equation Mode. private BlendEquationMode TranslateBlendFunction(BlendFunction func) { - switch (func) - { - default: - case BlendFunction.Add: - return BlendEquationMode.FuncAdd; + switch (func) + { + case BlendFunction.Add: + return BlendEquationMode.FuncAdd; - case BlendFunction.Subtract: - return BlendEquationMode.FuncSubtract; + case BlendFunction.Subtract: + return BlendEquationMode.FuncSubtract; - case BlendFunction.ReverseSubtract: - return BlendEquationMode.FuncReverseSubtract; + case BlendFunction.ReverseSubtract: + return BlendEquationMode.FuncReverseSubtract; - case BlendFunction.Min: - return BlendEquationMode.Min; + case BlendFunction.Min: + return BlendEquationMode.Min; - case BlendFunction.Max: - return BlendEquationMode.Max; - } + case BlendFunction.Max: + return BlendEquationMode.Max; + } + + throw new ArgumentException("don't know how to translate BlendFunction '" + func.ToString() + "' to BlendEquationMode"); } #endregion } diff --git a/RenderSystems/ANX.Framework.Windows.GL3/GraphicsDeviceWindowsGL3.cs b/RenderSystems/ANX.Framework.Windows.GL3/GraphicsDeviceWindowsGL3.cs index 39a914fd..954bdd12 100644 --- a/RenderSystems/ANX.Framework.Windows.GL3/GraphicsDeviceWindowsGL3.cs +++ b/RenderSystems/ANX.Framework.Windows.GL3/GraphicsDeviceWindowsGL3.cs @@ -158,7 +158,7 @@ namespace ANX.Framework.Windows.GL3 nativeWindowInfo = Utilities.CreateWindowsWindowInfo( presentationParameters.DeviceWindowHandle); - GraphicsMode graphicsMode = new GraphicsMode( + GraphicsMode graphicsMode = new GraphicsMode( DatatypesMapping.SurfaceToColorFormat( presentationParameters.BackBufferFormat), depth, stencil, diff --git a/RenderSystems/ANX.Framework.Windows.GL3/Properties/AssemblyInfo.cs b/RenderSystems/ANX.Framework.Windows.GL3/Properties/AssemblyInfo.cs index bfd713e3..c43b02c4 100644 --- a/RenderSystems/ANX.Framework.Windows.GL3/Properties/AssemblyInfo.cs +++ b/RenderSystems/ANX.Framework.Windows.GL3/Properties/AssemblyInfo.cs @@ -32,7 +32,7 @@ using System.Runtime.InteropServices; // Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern // übernehmen, indem Sie "*" eingeben: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.5.5.0")] -[assembly: AssemblyFileVersion("0.5.5.0")] +[assembly: AssemblyVersion("0.5.6.0")] +[assembly: AssemblyFileVersion("0.5.6.0")] [assembly: InternalsVisibleTo("ANX.Framework.ContentPipeline")] diff --git a/RenderSystems/ANX.Framework.Windows.GL3/Texture2DGL3.cs b/RenderSystems/ANX.Framework.Windows.GL3/Texture2DGL3.cs index 1120c3fa..2972c674 100644 --- a/RenderSystems/ANX.Framework.Windows.GL3/Texture2DGL3.cs +++ b/RenderSystems/ANX.Framework.Windows.GL3/Texture2DGL3.cs @@ -125,7 +125,7 @@ namespace ANX.Framework.Windows.GL3 int wrapMode = (int)All.ClampToEdge; int filter = (int)(mipCount > 1 ? All.LinearMipmapLinear : All.Linear); - + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, wrapMode); GL.TexParameter(TextureTarget.Texture2D, @@ -147,7 +147,7 @@ namespace ANX.Framework.Windows.GL3 public void SetData(GraphicsDevice graphicsDevice, T[] data) where T : struct { - SetData(graphicsDevice, data, 0, data.Length); + SetData(graphicsDevice, 0, data, 0, data.Length); } public void SetData(GraphicsDevice graphicsDevice, T[] data, @@ -186,9 +186,9 @@ namespace ANX.Framework.Windows.GL3 } else { - GL.TexImage2D(TextureTarget.Texture2D, 0, nativeFormat, - width, height, 0, (PixelFormat)nativeFormat, - PixelType.UnsignedByte, dataPointer); + GL.TexImage2D(TextureTarget.Texture2D, 0, nativeFormat, + width, height, 0, (PixelFormat)nativeFormat, + PixelType.UnsignedByte, dataPointer); #if DEBUG ErrorHelper.Check("TexImage2D Format=" + nativeFormat); #endif diff --git a/RenderSystems/ANX.Framework.Windows.GL3/VertexBufferGL3.cs b/RenderSystems/ANX.Framework.Windows.GL3/VertexBufferGL3.cs index 60fd2c7c..c39b81d6 100644 --- a/RenderSystems/ANX.Framework.Windows.GL3/VertexBufferGL3.cs +++ b/RenderSystems/ANX.Framework.Windows.GL3/VertexBufferGL3.cs @@ -215,7 +215,7 @@ namespace ANX.Framework.Windows.GL3 GL.EnableVertexAttribArray(col); ErrorHelper.Check("EnableVertexAttribArray col"); GL.VertexAttribPointer(col, 4, VertexAttribPointerType.UnsignedByte, - false, vertexDeclaration.VertexStride, element.Offset); + true, vertexDeclaration.VertexStride, element.Offset); ErrorHelper.Check("VertexAttribPointer col"); break; diff --git a/Samples/SimpleSprite/Game1.cs b/Samples/SimpleSprite/Game1.cs index 6a1e24b4..5f43357e 100644 --- a/Samples/SimpleSprite/Game1.cs +++ b/Samples/SimpleSprite/Game1.cs @@ -108,10 +108,17 @@ namespace WindowsGame1 // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); - //this.texture = Content.Load(@"Textures/DotColor4x4"); + //this.alternateTexture = Content.Load(@"Textures/DotColor4x4"); this.alternateTexture = Content.Load(@"Textures/DotWhiteTopLeft5x5"); this.texture = Content.Load(@"Textures/ANX.logo"); - //this.texture = new Texture2D(GraphicsDevice, 64, 64); + + //this.alternateTexture = new Texture2D(GraphicsDevice, 64, 64); + //Color[] color = new Color[this.alternateTexture.Width * this.alternateTexture.Height]; + //for (int i = 0; i < color.Length; i++) + //{ + // color[i] = new Color(1.0f, 1.0f, 0, 0.5f); + //} + //this.alternateTexture.SetData(color); } ///