From b1ed7e80fb689da5a4679e5c178f91391e55a6ff Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Thu, 4 Aug 2016 14:09:35 +0200 Subject: [PATCH] VertexShaderGen: Clip z using user-defined clipping planes. --- Source/Core/VideoBackends/OGL/Render.cpp | 1 + Source/Core/VideoCommon/ShaderGenCommon.h | 4 ++++ Source/Core/VideoCommon/VertexShaderGen.cpp | 5 +++++ 3 files changed, 10 insertions(+) diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index 26f1c8cc21..13a34ce2e1 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -724,6 +724,7 @@ Renderer::Renderer() glClearDepthf(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); + glEnable(GL_CLIP_DISTANCE0); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment diff --git a/Source/Core/VideoCommon/ShaderGenCommon.h b/Source/Core/VideoCommon/ShaderGenCommon.h index e7d0667861..434099e85e 100644 --- a/Source/Core/VideoCommon/ShaderGenCommon.h +++ b/Source/Core/VideoCommon/ShaderGenCommon.h @@ -196,6 +196,8 @@ inline void GenerateVSOutputMembers(T& object, APIType api_type, u32 texgens, DefineOutputMember(object, api_type, qualifier, "float3", "WorldPos", -1, "TEXCOORD", texgens + 2); } + + DefineOutputMember(object, api_type, qualifier, "float", "clipDist", -1, "SV_ClipDistance"); } template @@ -216,6 +218,8 @@ inline void AssignVSOutputMembers(T& object, const char* a, const char* b, u32 t object.Write("\t%s.Normal = %s.Normal;\n", a, b); object.Write("\t%s.WorldPos = %s.WorldPos;\n", a, b); } + + object.Write("\t%s.clipDist = %s.clipDist;\n", a, b); } // We use the flag "centroid" to fix some MSAA rendering bugs. With MSAA, the diff --git a/Source/Core/VideoCommon/VertexShaderGen.cpp b/Source/Core/VideoCommon/VertexShaderGen.cpp index 0863e9f17f..abb79d90fc 100644 --- a/Source/Core/VideoCommon/VertexShaderGen.cpp +++ b/Source/Core/VideoCommon/VertexShaderGen.cpp @@ -399,6 +399,10 @@ ShaderCode GenerateVertexShaderCode(APIType api_type, const vertex_shader_uid_da out.Write("o.colors_1 = color1;\n"); } + // Since we're adjusting z for the depth range before the perspective divide, we have to do our + // own clipping. + out.Write("o.clipDist = o.pos.z + o.pos.w;\n"); + // We have to handle the depth range in the vertex shader, because some games will use a depth range beyond // the normal depth range of 0..1. out.Write("o.pos.z = o.pos.w * " I_PIXELCENTERCORRECTION".w + o.pos.z * " I_PIXELCENTERCORRECTION".z;\n"); @@ -457,6 +461,7 @@ ShaderCode GenerateVertexShaderCode(APIType api_type, const vertex_shader_uid_da out.Write("colors_1 = o.colors_1;\n"); } + out.Write("gl_ClipDistance[0] = o.clipDist;\n"); out.Write("gl_Position = o.pos;\n"); } else // D3D