diff --git a/OpenRA.FileFormats/Graphics/IGraphicsDevice.cs b/OpenRA.FileFormats/Graphics/IGraphicsDevice.cs index bd75998507..a59f8042bd 100755 --- a/OpenRA.FileFormats/Graphics/IGraphicsDevice.cs +++ b/OpenRA.FileFormats/Graphics/IGraphicsDevice.cs @@ -54,6 +54,9 @@ namespace OpenRA.FileFormats.Graphics void EnableDepthBuffer(); void DisableDepthBuffer(); + + void EnableAlphaBlending(); + void DisableAlphaBlending(); } public interface IVertexBuffer diff --git a/OpenRA.Game/Graphics/LineRenderer.cs b/OpenRA.Game/Graphics/LineRenderer.cs index 4f21a49f55..d2d07e39a0 100644 --- a/OpenRA.Game/Graphics/LineRenderer.cs +++ b/OpenRA.Game/Graphics/LineRenderer.cs @@ -34,6 +34,7 @@ namespace OpenRA.Graphics { if (nv > 0) { + renderer.Device.EnableAlphaBlending(); shader.Render(() => { var vb = renderer.GetTempVertexBuffer(); @@ -41,7 +42,7 @@ namespace OpenRA.Graphics renderer.SetLineWidth(LineWidth * Game.viewport.Zoom); renderer.DrawBatch(vb, 0, nv, PrimitiveType.LineList); }); - + renderer.Device.DisableAlphaBlending(); nv = 0; } } diff --git a/OpenRA.Game/Graphics/QuadRenderer.cs b/OpenRA.Game/Graphics/QuadRenderer.cs index 05140a5ac6..bce702c982 100644 --- a/OpenRA.Game/Graphics/QuadRenderer.cs +++ b/OpenRA.Game/Graphics/QuadRenderer.cs @@ -31,12 +31,14 @@ namespace OpenRA.Graphics { if (nv > 0) { + renderer.Device.EnableAlphaBlending(); shader.Render(() => { var vb = renderer.GetTempVertexBuffer(); vb.SetData(vertices, nv); renderer.DrawBatch(vb, 0, nv, PrimitiveType.QuadList); }); + renderer.Device.DisableAlphaBlending(); nv = 0; } diff --git a/OpenRA.Game/Graphics/SpriteRenderer.cs b/OpenRA.Game/Graphics/SpriteRenderer.cs index 14049bb4af..b8d144bc1a 100644 --- a/OpenRA.Game/Graphics/SpriteRenderer.cs +++ b/OpenRA.Game/Graphics/SpriteRenderer.cs @@ -33,12 +33,14 @@ namespace OpenRA.Graphics if (nv > 0) { shader.SetTexture("DiffuseTexture", currentSheet.Texture); + renderer.Device.EnableAlphaBlending(); shader.Render(() => { var vb = renderer.GetTempVertexBuffer(); vb.SetData(vertices, nv); renderer.DrawBatch(vb, 0, nv, PrimitiveType.QuadList); }); + renderer.Device.DisableAlphaBlending(); nv = 0; currentSheet = null; @@ -99,7 +101,9 @@ namespace OpenRA.Graphics public void DrawVertexBuffer(IVertexBuffer buffer, int start, int length, PrimitiveType type, Sheet sheet) { shader.SetTexture("DiffuseTexture", sheet.Texture); + renderer.Device.EnableAlphaBlending(); shader.Render(() => renderer.DrawBatch(buffer, start, length, type)); + renderer.Device.DisableAlphaBlending(); } public void SetPalette(ITexture palette) diff --git a/OpenRA.Renderer.Gl/Shader.cs b/OpenRA.Renderer.Gl/Shader.cs index ea6db304d7..0892f364f9 100644 --- a/OpenRA.Renderer.Gl/Shader.cs +++ b/OpenRA.Renderer.Gl/Shader.cs @@ -104,7 +104,6 @@ namespace OpenRA.Renderer.Glsl ++nextTexUnit; } } - } public void Render(Action a) @@ -119,17 +118,9 @@ namespace OpenRA.Renderer.Glsl Gl.glBindTexture(Gl.GL_TEXTURE_2D, ((Texture)kv.Value).ID); } - /* configure blend state */ - ErrorHandler.CheckGlError(); - // TODO: Only enable alpha blending if we need it - Gl.glEnable(Gl.GL_BLEND); - ErrorHandler.CheckGlError(); - Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA); ErrorHandler.CheckGlError(); a(); ErrorHandler.CheckGlError(); - Gl.glDisable(Gl.GL_BLEND); - ErrorHandler.CheckGlError(); } public void SetTexture(string name, ITexture t) diff --git a/OpenRA.Renderer.Null/NullGraphicsDevice.cs b/OpenRA.Renderer.Null/NullGraphicsDevice.cs index a390ec6b30..dfa36f21aa 100644 --- a/OpenRA.Renderer.Null/NullGraphicsDevice.cs +++ b/OpenRA.Renderer.Null/NullGraphicsDevice.cs @@ -41,6 +41,9 @@ namespace OpenRA.Renderer.Null public void EnableDepthBuffer() { } public void DisableDepthBuffer() { } + public void EnableAlphaBlending() { } + public void DisableAlphaBlending() { } + public void Clear() { } public void Present() { } diff --git a/OpenRA.Renderer.SdlCommon/SdlGraphics.cs b/OpenRA.Renderer.SdlCommon/SdlGraphics.cs index 5c0ed284b1..2fe9891249 100644 --- a/OpenRA.Renderer.SdlCommon/SdlGraphics.cs +++ b/OpenRA.Renderer.SdlCommon/SdlGraphics.cs @@ -148,6 +148,20 @@ namespace OpenRA.Renderer.SdlCommon ErrorHandler.CheckGlError(); } + public void EnableAlphaBlending() + { + Gl.glEnable(Gl.GL_BLEND); + ErrorHandler.CheckGlError(); + Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA); + ErrorHandler.CheckGlError(); + } + + public void DisableAlphaBlending() + { + Gl.glDisable(Gl.GL_BLEND); + ErrorHandler.CheckGlError(); + } + public void EnableScissor(int left, int top, int width, int height) { if (width < 0) width = 0; diff --git a/cg/line.fx b/cg/line.fx index 7b9c3f6014..156f18f5c9 100644 --- a/cg/line.fx +++ b/cg/line.fx @@ -30,7 +30,6 @@ float4 Simple_fp(VertexOut f) : COLOR0 { technique high_quality { pass p0 { - BlendEnable = true; DepthTestEnable = false; //CullMode = None; //FillMode = Wireframe; @@ -44,7 +43,6 @@ technique high_quality { technique high_quality_cg21 { pass p0 { - BlendEnable = true; DepthTestEnable = false; //CullMode = None; //FillMode = Wireframe; diff --git a/cg/rgba.fx b/cg/rgba.fx index 18d89b7d5e..ffea272583 100644 --- a/cg/rgba.fx +++ b/cg/rgba.fx @@ -39,7 +39,6 @@ float4 Simple_fp(FragmentIn f) : COLOR0 { technique high_quality { pass p0 { - BlendEnable = true; DepthTestEnable = false; CullFaceEnable = false; VertexProgram = compile latest Simple_vp(); @@ -52,7 +51,6 @@ technique high_quality { technique high_quality_cg21 { pass p0 { - BlendEnable = true; DepthTestEnable = false; CullFaceEnable = false; VertexProgram = compile arbvp1 Simple_vp(); diff --git a/cg/shp.fx b/cg/shp.fx index c5ba7ae69b..8bca263e41 100644 --- a/cg/shp.fx +++ b/cg/shp.fx @@ -55,7 +55,6 @@ float4 Palette_fp(VertexOut f) : COLOR0 { technique low_quality { pass p0 { - BlendEnable = true; DepthTestEnable = false; CullFaceEnable = false; VertexProgram = compile latest Simple_vp(); @@ -68,7 +67,6 @@ technique low_quality { technique low_quality_cg21 { pass p0 { - BlendEnable = true; DepthTestEnable = false; CullFaceEnable = false; VertexProgram = compile arbvp1 Simple_vp(); diff --git a/cg/vxl.fx b/cg/vxl.fx index c0f8395937..efaf711432 100644 --- a/cg/vxl.fx +++ b/cg/vxl.fx @@ -61,7 +61,6 @@ float4 Simple_fp(VertexOut f) : COLOR0 { technique high_quality { pass p0 { - BlendEnable = true; DepthTestEnable = true; CullFaceEnable = false; VertexProgram = compile latest Simple_vp(); @@ -74,7 +73,6 @@ technique high_quality { technique high_quality_cg21 { pass p0 { - BlendEnable = true; DepthTestEnable = true; CullFaceEnable = false; VertexProgram = compile arbvp1 Simple_vp();