mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-11-15 21:04:13 +01:00
The sides of the trackbed (and grass, fences, foliage) are cut out of their textures by the alpha test, which keeps or drops whole pixels, so their edges stayed jagged at any multisampling level; only geometry edges got smoothed. With multisampling on, the alpha tested materials of the opaque colour pass now draw with GL_SAMPLE_ALPHA_TO_COVERAGE. Their shaders do the alpha test with alpha_test_fail() of glsl_common and write as alpha the coverage of the test edge: the alpha sharpened around the opacity threshold to go from 0 to 1 over about a pixel, so the edge keeps the place it had and gets the samples it covers. The renderer turns alpha to coverage on per material, only for shaders which use the helper and only in the opaque pass with a positive opacity, so translucent, water, terrain and the other shaders are unchanged. Without multisampling the shaders work as before.
70 lines
1.7 KiB
GLSL
70 lines
1.7 KiB
GLSL
in vec3 f_normal;
|
|
in vec2 f_coord;
|
|
in vec4 f_pos;
|
|
in mat3 f_tbn;
|
|
|
|
in vec4 f_clip_pos;
|
|
in vec4 f_clip_future_pos;
|
|
|
|
#include <common>
|
|
|
|
layout(location = 0) out vec4 out_color;
|
|
#if MOTIONBLUR_ENABLED
|
|
layout(location = 1) out vec4 out_motion;
|
|
#endif
|
|
|
|
#param (color, 0, 0, 4, diffuse)
|
|
#param (diffuse, 1, 0, 1, diffuse)
|
|
#param (specular, 1, 1, 1, specular)
|
|
#param (reflection, 1, 2, 1, zero)
|
|
#param (glossiness, 1, 3, 1, glossiness)
|
|
|
|
#texture (diffuse, 0, sRGB_A)
|
|
uniform sampler2D diffuse;
|
|
|
|
#texture (normalmap, 1, RGBA)
|
|
uniform sampler2D normalmap;
|
|
|
|
#define NORMALMAP
|
|
#include <light_common.glsl>
|
|
#include <apply_fog.glsl>
|
|
#include <tonemapping.glsl>
|
|
|
|
void main()
|
|
{
|
|
vec4 tex_color = texture(diffuse, f_coord);
|
|
|
|
float alphacoverage = alpha_coverage(tex_color.a);
|
|
bool alphatestfail = alpha_test_fail(tex_color.a, alphacoverage);
|
|
if(alphatestfail)
|
|
discard;
|
|
// if (tex_color.a < opacity)
|
|
// discard;
|
|
|
|
vec3 fragcolor = ambient;
|
|
|
|
vec3 normal;
|
|
normal.xy = (texture(normalmap, f_coord).rg * 2.0 - 1.0);
|
|
normal.z = sqrt(1.0 - clamp((dot(normal.xy, normal.xy)), 0.0, 1.0));
|
|
vec3 fragnormal = normalize(f_tbn * normalize(normal.xyz));
|
|
float reflectivity = param[1].z * texture(normalmap, f_coord).a;
|
|
float specularity = (tex_color.r + tex_color.g + tex_color.b) * 0.5;
|
|
glossiness = abs(param[1].w);
|
|
|
|
fragcolor = apply_lights(fragcolor, fragnormal, tex_color.rgb, reflectivity, specularity, 1.0);
|
|
vec4 color = vec4(apply_fog(fragcolor), alphacoverage * alpha_mult);
|
|
#if POSTFX_ENABLED
|
|
out_color = color;
|
|
#else
|
|
out_color = tonemap(color);
|
|
#endif
|
|
#if MOTIONBLUR_ENABLED
|
|
{
|
|
vec2 a = (f_clip_future_pos.xy / f_clip_future_pos.w) * 0.5 + 0.5;;
|
|
vec2 b = (f_clip_pos.xy / f_clip_pos.w) * 0.5 + 0.5;;
|
|
|
|
out_motion = vec4(a - b, 0.0f, 0.0f);
|
|
}
|
|
#endif
|
|
}
|