From b3f56db428f7796345fb39907a6a87ccf82336c2 Mon Sep 17 00:00:00 2001 From: Erik Abair Date: Sun, 16 Jan 2022 21:57:37 -0800 Subject: [PATCH] nv2a: Match HW behavior when dealing with infinite fog coord --- hw/xbox/nv2a/shaders.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/hw/xbox/nv2a/shaders.c b/hw/xbox/nv2a/shaders.c index bfe06c4b5f..91519068d8 100644 --- a/hw/xbox/nv2a/shaders.c +++ b/hw/xbox/nv2a/shaders.c @@ -793,14 +793,25 @@ STRUCT_VERTEX_DATA); case FOG_MODE_LINEAR_ABS: /* f = (end - d) / (end - start) - * fogParam[1] = 1 / (end - start) - * fogParam[0] = 1 + end * fogParam[1]; + * fogParam[1] = -1 / (end - start) + * fogParam[0] = 1 - end * fogParam[1]; */ + mstring_append(body, + " if (isinf(fogDistance)) {\n" + " fogDistance = 0.0;\n" + " }\n" + ); mstring_append(body, " float fogFactor = fogParam[0] + fogDistance * fogParam[1];\n"); - mstring_append(body, " fogFactor -= 1.0;\n"); /* FIXME: WHHYYY?!! */ + mstring_append(body, " fogFactor -= 1.0;\n"); break; case FOG_MODE_EXP: + mstring_append(body, + " if (isinf(fogDistance)) {\n" + " fogDistance = 0.0;\n" + " }\n" + ); + /* fallthru */ case FOG_MODE_EXP_ABS: /* f = 1 / (e^(d * density)) @@ -809,7 +820,7 @@ STRUCT_VERTEX_DATA); */ mstring_append(body, " float fogFactor = fogParam[0] + exp2(fogDistance * fogParam[1] * 16.0);\n"); - mstring_append(body, " fogFactor -= 1.5;\n"); /* FIXME: WHHYYY?!! */ + mstring_append(body, " fogFactor -= 1.5;\n"); break; case FOG_MODE_EXP2: case FOG_MODE_EXP2_ABS: @@ -820,7 +831,7 @@ STRUCT_VERTEX_DATA); */ mstring_append(body, " float fogFactor = fogParam[0] + exp2(-fogDistance * fogDistance * fogParam[1] * fogParam[1] * 32.0);\n"); - mstring_append(body, " fogFactor -= 1.5;\n"); /* FIXME: WHHYYY?!! */ + mstring_append(body, " fogFactor -= 1.5;\n"); break; default: assert(false); @@ -836,7 +847,7 @@ STRUCT_VERTEX_DATA); default: break; } - /* FIXME: What about fog alpha?! */ + mstring_append(body, " oFog.xyzw = vec4(fogFactor);\n"); } else { /* FIXME: Is the fog still calculated / passed somehow?!