Allow/require renderers to enable alpha blending when needed. Fixes voxel shadow issues.
This commit is contained in:
@@ -54,6 +54,9 @@ namespace OpenRA.FileFormats.Graphics
|
|||||||
|
|
||||||
void EnableDepthBuffer();
|
void EnableDepthBuffer();
|
||||||
void DisableDepthBuffer();
|
void DisableDepthBuffer();
|
||||||
|
|
||||||
|
void EnableAlphaBlending();
|
||||||
|
void DisableAlphaBlending();
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IVertexBuffer<T>
|
public interface IVertexBuffer<T>
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ namespace OpenRA.Graphics
|
|||||||
{
|
{
|
||||||
if (nv > 0)
|
if (nv > 0)
|
||||||
{
|
{
|
||||||
|
renderer.Device.EnableAlphaBlending();
|
||||||
shader.Render(() =>
|
shader.Render(() =>
|
||||||
{
|
{
|
||||||
var vb = renderer.GetTempVertexBuffer();
|
var vb = renderer.GetTempVertexBuffer();
|
||||||
@@ -41,7 +42,7 @@ namespace OpenRA.Graphics
|
|||||||
renderer.SetLineWidth(LineWidth * Game.viewport.Zoom);
|
renderer.SetLineWidth(LineWidth * Game.viewport.Zoom);
|
||||||
renderer.DrawBatch(vb, 0, nv, PrimitiveType.LineList);
|
renderer.DrawBatch(vb, 0, nv, PrimitiveType.LineList);
|
||||||
});
|
});
|
||||||
|
renderer.Device.DisableAlphaBlending();
|
||||||
nv = 0;
|
nv = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,12 +31,14 @@ namespace OpenRA.Graphics
|
|||||||
{
|
{
|
||||||
if (nv > 0)
|
if (nv > 0)
|
||||||
{
|
{
|
||||||
|
renderer.Device.EnableAlphaBlending();
|
||||||
shader.Render(() =>
|
shader.Render(() =>
|
||||||
{
|
{
|
||||||
var vb = renderer.GetTempVertexBuffer();
|
var vb = renderer.GetTempVertexBuffer();
|
||||||
vb.SetData(vertices, nv);
|
vb.SetData(vertices, nv);
|
||||||
renderer.DrawBatch(vb, 0, nv, PrimitiveType.QuadList);
|
renderer.DrawBatch(vb, 0, nv, PrimitiveType.QuadList);
|
||||||
});
|
});
|
||||||
|
renderer.Device.DisableAlphaBlending();
|
||||||
|
|
||||||
nv = 0;
|
nv = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,12 +33,14 @@ namespace OpenRA.Graphics
|
|||||||
if (nv > 0)
|
if (nv > 0)
|
||||||
{
|
{
|
||||||
shader.SetTexture("DiffuseTexture", currentSheet.Texture);
|
shader.SetTexture("DiffuseTexture", currentSheet.Texture);
|
||||||
|
renderer.Device.EnableAlphaBlending();
|
||||||
shader.Render(() =>
|
shader.Render(() =>
|
||||||
{
|
{
|
||||||
var vb = renderer.GetTempVertexBuffer();
|
var vb = renderer.GetTempVertexBuffer();
|
||||||
vb.SetData(vertices, nv);
|
vb.SetData(vertices, nv);
|
||||||
renderer.DrawBatch(vb, 0, nv, PrimitiveType.QuadList);
|
renderer.DrawBatch(vb, 0, nv, PrimitiveType.QuadList);
|
||||||
});
|
});
|
||||||
|
renderer.Device.DisableAlphaBlending();
|
||||||
|
|
||||||
nv = 0;
|
nv = 0;
|
||||||
currentSheet = null;
|
currentSheet = null;
|
||||||
@@ -99,7 +101,9 @@ namespace OpenRA.Graphics
|
|||||||
public void DrawVertexBuffer(IVertexBuffer<Vertex> buffer, int start, int length, PrimitiveType type, Sheet sheet)
|
public void DrawVertexBuffer(IVertexBuffer<Vertex> buffer, int start, int length, PrimitiveType type, Sheet sheet)
|
||||||
{
|
{
|
||||||
shader.SetTexture("DiffuseTexture", sheet.Texture);
|
shader.SetTexture("DiffuseTexture", sheet.Texture);
|
||||||
|
renderer.Device.EnableAlphaBlending();
|
||||||
shader.Render(() => renderer.DrawBatch(buffer, start, length, type));
|
shader.Render(() => renderer.DrawBatch(buffer, start, length, type));
|
||||||
|
renderer.Device.DisableAlphaBlending();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetPalette(ITexture palette)
|
public void SetPalette(ITexture palette)
|
||||||
|
|||||||
@@ -104,7 +104,6 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
++nextTexUnit;
|
++nextTexUnit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Render(Action a)
|
public void Render(Action a)
|
||||||
@@ -119,17 +118,9 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
Gl.glBindTexture(Gl.GL_TEXTURE_2D, ((Texture)kv.Value).ID);
|
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();
|
ErrorHandler.CheckGlError();
|
||||||
a();
|
a();
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
Gl.glDisable(Gl.GL_BLEND);
|
|
||||||
ErrorHandler.CheckGlError();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetTexture(string name, ITexture t)
|
public void SetTexture(string name, ITexture t)
|
||||||
|
|||||||
@@ -41,6 +41,9 @@ namespace OpenRA.Renderer.Null
|
|||||||
public void EnableDepthBuffer() { }
|
public void EnableDepthBuffer() { }
|
||||||
public void DisableDepthBuffer() { }
|
public void DisableDepthBuffer() { }
|
||||||
|
|
||||||
|
public void EnableAlphaBlending() { }
|
||||||
|
public void DisableAlphaBlending() { }
|
||||||
|
|
||||||
public void Clear() { }
|
public void Clear() { }
|
||||||
public void Present() { }
|
public void Present() { }
|
||||||
|
|
||||||
|
|||||||
@@ -148,6 +148,20 @@ namespace OpenRA.Renderer.SdlCommon
|
|||||||
ErrorHandler.CheckGlError();
|
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)
|
public void EnableScissor(int left, int top, int width, int height)
|
||||||
{
|
{
|
||||||
if (width < 0) width = 0;
|
if (width < 0) width = 0;
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ float4 Simple_fp(VertexOut f) : COLOR0 {
|
|||||||
|
|
||||||
technique high_quality {
|
technique high_quality {
|
||||||
pass p0 {
|
pass p0 {
|
||||||
BlendEnable = true;
|
|
||||||
DepthTestEnable = false;
|
DepthTestEnable = false;
|
||||||
//CullMode = None;
|
//CullMode = None;
|
||||||
//FillMode = Wireframe;
|
//FillMode = Wireframe;
|
||||||
@@ -44,7 +43,6 @@ technique high_quality {
|
|||||||
|
|
||||||
technique high_quality_cg21 {
|
technique high_quality_cg21 {
|
||||||
pass p0 {
|
pass p0 {
|
||||||
BlendEnable = true;
|
|
||||||
DepthTestEnable = false;
|
DepthTestEnable = false;
|
||||||
//CullMode = None;
|
//CullMode = None;
|
||||||
//FillMode = Wireframe;
|
//FillMode = Wireframe;
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ float4 Simple_fp(FragmentIn f) : COLOR0 {
|
|||||||
|
|
||||||
technique high_quality {
|
technique high_quality {
|
||||||
pass p0 {
|
pass p0 {
|
||||||
BlendEnable = true;
|
|
||||||
DepthTestEnable = false;
|
DepthTestEnable = false;
|
||||||
CullFaceEnable = false;
|
CullFaceEnable = false;
|
||||||
VertexProgram = compile latest Simple_vp();
|
VertexProgram = compile latest Simple_vp();
|
||||||
@@ -52,7 +51,6 @@ technique high_quality {
|
|||||||
|
|
||||||
technique high_quality_cg21 {
|
technique high_quality_cg21 {
|
||||||
pass p0 {
|
pass p0 {
|
||||||
BlendEnable = true;
|
|
||||||
DepthTestEnable = false;
|
DepthTestEnable = false;
|
||||||
CullFaceEnable = false;
|
CullFaceEnable = false;
|
||||||
VertexProgram = compile arbvp1 Simple_vp();
|
VertexProgram = compile arbvp1 Simple_vp();
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ float4 Palette_fp(VertexOut f) : COLOR0 {
|
|||||||
|
|
||||||
technique low_quality {
|
technique low_quality {
|
||||||
pass p0 {
|
pass p0 {
|
||||||
BlendEnable = true;
|
|
||||||
DepthTestEnable = false;
|
DepthTestEnable = false;
|
||||||
CullFaceEnable = false;
|
CullFaceEnable = false;
|
||||||
VertexProgram = compile latest Simple_vp();
|
VertexProgram = compile latest Simple_vp();
|
||||||
@@ -68,7 +67,6 @@ technique low_quality {
|
|||||||
|
|
||||||
technique low_quality_cg21 {
|
technique low_quality_cg21 {
|
||||||
pass p0 {
|
pass p0 {
|
||||||
BlendEnable = true;
|
|
||||||
DepthTestEnable = false;
|
DepthTestEnable = false;
|
||||||
CullFaceEnable = false;
|
CullFaceEnable = false;
|
||||||
VertexProgram = compile arbvp1 Simple_vp();
|
VertexProgram = compile arbvp1 Simple_vp();
|
||||||
|
|||||||
@@ -61,7 +61,6 @@ float4 Simple_fp(VertexOut f) : COLOR0 {
|
|||||||
|
|
||||||
technique high_quality {
|
technique high_quality {
|
||||||
pass p0 {
|
pass p0 {
|
||||||
BlendEnable = true;
|
|
||||||
DepthTestEnable = true;
|
DepthTestEnable = true;
|
||||||
CullFaceEnable = false;
|
CullFaceEnable = false;
|
||||||
VertexProgram = compile latest Simple_vp();
|
VertexProgram = compile latest Simple_vp();
|
||||||
@@ -74,7 +73,6 @@ technique high_quality {
|
|||||||
|
|
||||||
technique high_quality_cg21 {
|
technique high_quality_cg21 {
|
||||||
pass p0 {
|
pass p0 {
|
||||||
BlendEnable = true;
|
|
||||||
DepthTestEnable = true;
|
DepthTestEnable = true;
|
||||||
CullFaceEnable = false;
|
CullFaceEnable = false;
|
||||||
VertexProgram = compile arbvp1 Simple_vp();
|
VertexProgram = compile arbvp1 Simple_vp();
|
||||||
|
|||||||
Reference in New Issue
Block a user