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 DisableDepthBuffer();
|
||||
|
||||
void EnableAlphaBlending();
|
||||
void DisableAlphaBlending();
|
||||
}
|
||||
|
||||
public interface IVertexBuffer<T>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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() { }
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user