Write z data to the depth buffer.

This commit is contained in:
Paul Chote
2016-04-08 10:54:30 -04:00
parent ecebb2a844
commit 2634643d91
6 changed files with 51 additions and 20 deletions

View File

@@ -156,7 +156,7 @@ namespace OpenRA
using (new PerfTimer("NewWorld")) using (new PerfTimer("NewWorld"))
OrderManager.World = new World(map, OrderManager, type); OrderManager.World = new World(map, OrderManager, type);
worldRenderer = new WorldRenderer(OrderManager.World); worldRenderer = new WorldRenderer(ModData, OrderManager.World);
using (new PerfTimer("LoadComplete")) using (new PerfTimer("LoadComplete"))
OrderManager.World.LoadComplete(worldRenderer); OrderManager.World.LoadComplete(worldRenderer);

View File

@@ -70,6 +70,7 @@ namespace OpenRA
void EnableDepthBuffer(); void EnableDepthBuffer();
void DisableDepthBuffer(); void DisableDepthBuffer();
void ClearDepthBuffer();
void SetBlendMode(BlendMode mode); void SetBlendMode(BlendMode mode);

View File

@@ -34,8 +34,9 @@ namespace OpenRA.Graphics
readonly TerrainRenderer terrainRenderer; readonly TerrainRenderer terrainRenderer;
readonly Lazy<DeveloperMode> devTrait; readonly Lazy<DeveloperMode> devTrait;
readonly Func<string, PaletteReference> createPaletteReference; readonly Func<string, PaletteReference> createPaletteReference;
readonly bool enableDepthBuffer;
internal WorldRenderer(World world) internal WorldRenderer(ModData modData, World world)
{ {
World = world; World = world;
TileSize = World.Map.Grid.TileSize; TileSize = World.Map.Grid.TileSize;
@@ -43,6 +44,9 @@ namespace OpenRA.Graphics
createPaletteReference = CreatePaletteReference; createPaletteReference = CreatePaletteReference;
var mapGrid = modData.Manifest.Get<MapGrid>();
enableDepthBuffer = mapGrid.EnableDepthBuffer;
foreach (var pal in world.TraitDict.ActorsWithTrait<ILoadsPalettes>()) foreach (var pal in world.TraitDict.ActorsWithTrait<ILoadsPalettes>())
pal.Trait.LoadPalettes(this); pal.Trait.LoadPalettes(this);
@@ -133,18 +137,27 @@ namespace OpenRA.Graphics
var bounds = Viewport.GetScissorBounds(World.Type != WorldType.Editor); var bounds = Viewport.GetScissorBounds(World.Type != WorldType.Editor);
Game.Renderer.EnableScissor(bounds); Game.Renderer.EnableScissor(bounds);
if (enableDepthBuffer)
Game.Renderer.Device.EnableDepthBuffer();
terrainRenderer.Draw(this, Viewport); terrainRenderer.Draw(this, Viewport);
Game.Renderer.Flush(); Game.Renderer.Flush();
for (var i = 0; i < renderables.Count; i++) for (var i = 0; i < renderables.Count; i++)
renderables[i].Render(this); renderables[i].Render(this);
if (enableDepthBuffer)
Game.Renderer.ClearDepthBuffer();
foreach (var a in World.ActorsWithTrait<IPostRender>()) foreach (var a in World.ActorsWithTrait<IPostRender>())
if (a.Actor.IsInWorld && !a.Actor.Disposed) if (a.Actor.IsInWorld && !a.Actor.Disposed)
a.Trait.RenderAfterWorld(this, a.Actor); a.Trait.RenderAfterWorld(this, a.Actor);
var renderShroud = World.RenderPlayer != null ? World.RenderPlayer.Shroud : null; var renderShroud = World.RenderPlayer != null ? World.RenderPlayer.Shroud : null;
if (enableDepthBuffer)
Game.Renderer.ClearDepthBuffer();
foreach (var a in World.ActorsWithTrait<IRenderShroud>()) foreach (var a in World.ActorsWithTrait<IRenderShroud>())
a.Trait.RenderShroud(this, renderShroud); a.Trait.RenderShroud(this, renderShroud);
@@ -152,6 +165,9 @@ namespace OpenRA.Graphics
for (var i = 0; i < renderables.Count; i++) for (var i = 0; i < renderables.Count; i++)
renderables[i].RenderDebugGeometry(this); renderables[i].RenderDebugGeometry(this);
if (enableDepthBuffer)
Game.Renderer.Device.DisableDepthBuffer();
Game.Renderer.DisableScissor(); Game.Renderer.DisableScissor();
var overlayRenderables = World.Selection.Actors.Where(a => !a.Disposed) var overlayRenderables = World.Selection.Actors.Where(a => !a.Disposed)
@@ -209,6 +225,12 @@ namespace OpenRA.Graphics
return new float2(TileSize.Width * pos.X / 1024f, TileSize.Height * (pos.Y - pos.Z) / 1024f); return new float2(TileSize.Width * pos.X / 1024f, TileSize.Height * (pos.Y - pos.Z) / 1024f);
} }
public float3 Screen3DPosition(WPos pos)
{
var z = ZPosition(pos, 0) * TileSize.Height / 1024f;
return new float3(TileSize.Width * pos.X / 1024f, TileSize.Height * (pos.Y - pos.Z) / 1024f, z);
}
public int2 ScreenPxPosition(WPos pos) public int2 ScreenPxPosition(WPos pos)
{ {
// Round to nearest pixel // Round to nearest pixel

View File

@@ -255,6 +255,12 @@ namespace OpenRA
Device.DisableDepthBuffer(); Device.DisableDepthBuffer();
} }
public void ClearDepthBuffer()
{
Flush();
Device.ClearDepthBuffer();
}
public void GrabWindowMouseFocus() public void GrabWindowMouseFocus()
{ {
Device.GrabWindowMouseFocus(); Device.GrabWindowMouseFocus();

View File

@@ -213,7 +213,7 @@ namespace OpenRA.Platforms.Default
VerifyThreadAffinity(); VerifyThreadAffinity();
OpenGL.glClearColor(0, 0, 0, 1); OpenGL.glClearColor(0, 0, 0, 1);
OpenGL.CheckGLError(); OpenGL.CheckGLError();
OpenGL.glClear(OpenGL.GL_COLOR_BUFFER_BIT); OpenGL.glClear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
OpenGL.CheckGLError(); OpenGL.CheckGLError();
} }
@@ -235,6 +235,13 @@ namespace OpenRA.Platforms.Default
OpenGL.CheckGLError(); OpenGL.CheckGLError();
} }
public void ClearDepthBuffer()
{
VerifyThreadAffinity();
OpenGL.glClear(OpenGL.GL_DEPTH_BUFFER_BIT);
OpenGL.CheckGLError();
}
public void SetBlendMode(BlendMode mode) public void SetBlendMode(BlendMode mode)
{ {
VerifyThreadAffinity(); VerifyThreadAffinity();

View File

@@ -17,25 +17,20 @@ void main()
if (c.a == 0.0) if (c.a == 0.0)
discard; discard;
if (EnableDepthPreview && length(vDepthMask) > 0.0) float depth = gl_FragCoord.z;
{ if (length(vDepthMask) > 0.0)
if (abs(DepthTextureScale) > 0.0) {
{ // Preview vertex aware depth
// Preview vertex aware depth depth = depth + DepthTextureScale * dot(x, vDepthMask);
float depth = gl_FragCoord.z + DepthTextureScale * dot(x, vDepthMask); }
// Convert to window coords // Convert to window coords
depth = 0.5 * depth + 0.5; gl_FragDepth = 0.5 * depth + 0.5;
// Front of the depth buffer is at 0, but we want to render it as bright if (EnableDepthPreview)
gl_FragColor = vec4(vec3(1.0 - depth), 1.0); {
} // Front of the depth buffer is at 0, but we want to render it as bright
else gl_FragColor = vec4(vec3(1.0 - gl_FragDepth), 1.0);
{
// Preview boring sprite-only depth
float depth = dot(x, vDepthMask);
gl_FragColor = vec4(depth, depth, depth, 1.0);
}
} }
else else
gl_FragColor = c; gl_FragColor = c;