Allow/require renderers to enable alpha blending when needed. Fixes voxel shadow issues.

This commit is contained in:
Paul Chote
2013-06-14 06:35:38 +12:00
parent 4c22193446
commit 52335a37bf
11 changed files with 28 additions and 18 deletions

View File

@@ -54,6 +54,9 @@ namespace OpenRA.FileFormats.Graphics
void EnableDepthBuffer();
void DisableDepthBuffer();
void EnableAlphaBlending();
void DisableAlphaBlending();
}
public interface IVertexBuffer<T>

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -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<Vertex> 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)

View File

@@ -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)

View File

@@ -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() { }

View File

@@ -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;

View File

@@ -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;

View File

@@ -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();

View File

@@ -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();

View File

@@ -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();