From: Elizabeth Figura zfigura@codeweavers.com
NVidia and WARP clamp before interpolation in the oFog case; AMD clamps only after interpolation (which we also do).
On the other hand, test_fog() proves that clamping should not be done before interpolation in the FFP case, for any driver.
In order to emulate an FFP vertex shader with a real compiled shader, we need to avoid clamping before interpolation, choosing the AMD behaviour here. --- dlls/wined3d/glsl_shader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 7bf9a5a9679..6c9f308b9f8 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -7366,7 +7366,7 @@ static GLuint shader_glsl_generate_vs3_rasterizer_input_setup(struct shader_glsl } else if (shader_match_semantic(semantic_name, WINED3D_DECL_USAGE_FOG)) { - shader_addline(buffer, "%s = clamp(outputs[%u].%c, 0.0, 1.0);\n", + shader_addline(buffer, "%s = outputs[%u].%c;\n", legacy_syntax ? "gl_FogFragCoord" : "ffp_varying_fogcoord", output->register_idx, reg_mask[1]); }