VertexShaderGen: Move the sonic epsilon hack to the vertex shader.
In the vertex shader we have control over the depth clipping planes, so we don't have to offset every floating point value and lose accuracy.
This commit is contained in:
parent
081cad709a
commit
debaf63fe8
|
@ -408,8 +408,11 @@ ShaderCode GenerateVertexShaderCode(APIType api_type, const vertex_shader_uid_da
|
||||||
|
|
||||||
// Since we're adjusting z for the depth range before the perspective divide, we have to do our
|
// Since we're adjusting z for the depth range before the perspective divide, we have to do our
|
||||||
// own clipping. We want to clip so that -w <= z <= 0, which matches the console -1..0 range.
|
// own clipping. We want to clip so that -w <= z <= 0, which matches the console -1..0 range.
|
||||||
out.Write("o.clipDist0 = o.pos.z + o.pos.w;\n"); // Near: z < -w
|
// We adjust our depth value for clipping purposes to match the perspective projection in the
|
||||||
out.Write("o.clipDist1 = -o.pos.z;\n"); // Far: z > 0
|
// software backend, which is a hack to fix Sonic Adventure and Unleashed games.
|
||||||
|
out.Write("float clipDepth = o.pos.z * (1.0 - 1e-7);\n");
|
||||||
|
out.Write("o.clipDist0 = clipDepth + o.pos.w;\n"); // Near: z < -w
|
||||||
|
out.Write("o.clipDist1 = -clipDepth;\n"); // Far: z > 0
|
||||||
|
|
||||||
// Adjust z for the depth range. We're using an equation which incorperates a depth inversion,
|
// Adjust z for the depth range. We're using an equation which incorperates a depth inversion,
|
||||||
// so we can map the console -1..0 range to the 0..1 range used in the depth buffer.
|
// so we can map the console -1..0 range to the 0..1 range used in the depth buffer.
|
||||||
|
|
|
@ -454,8 +454,7 @@ void VertexShaderManager::SetConstants()
|
||||||
g_fProjectionMatrix[12] = 0.0f;
|
g_fProjectionMatrix[12] = 0.0f;
|
||||||
g_fProjectionMatrix[13] = 0.0f;
|
g_fProjectionMatrix[13] = 0.0f;
|
||||||
|
|
||||||
// Hack to fix depth clipping precision issues (such as Sonic Adventure UI)
|
g_fProjectionMatrix[14] = -1.0f;
|
||||||
g_fProjectionMatrix[14] = -(1.0f + FLT_EPSILON);
|
|
||||||
g_fProjectionMatrix[15] = 0.0f;
|
g_fProjectionMatrix[15] = 0.0f;
|
||||||
|
|
||||||
// Heuristic to detect if a GameCube game is in 16:9 anamorphic widescreen mode.
|
// Heuristic to detect if a GameCube game is in 16:9 anamorphic widescreen mode.
|
||||||
|
@ -511,9 +510,7 @@ void VertexShaderManager::SetConstants()
|
||||||
g_fProjectionMatrix[13] = 0.0f;
|
g_fProjectionMatrix[13] = 0.0f;
|
||||||
|
|
||||||
g_fProjectionMatrix[14] = 0.0f;
|
g_fProjectionMatrix[14] = 0.0f;
|
||||||
|
g_fProjectionMatrix[15] = 1.0f;
|
||||||
// Hack to fix depth clipping precision issues (such as Sonic Unleashed UI)
|
|
||||||
g_fProjectionMatrix[15] = 1.0f + FLT_EPSILON;
|
|
||||||
|
|
||||||
SETSTAT_FT(stats.g2proj_0, g_fProjectionMatrix[0]);
|
SETSTAT_FT(stats.g2proj_0, g_fProjectionMatrix[0]);
|
||||||
SETSTAT_FT(stats.g2proj_1, g_fProjectionMatrix[1]);
|
SETSTAT_FT(stats.g2proj_1, g_fProjectionMatrix[1]);
|
||||||
|
|
Loading…
Reference in New Issue