mirror of
https://github.com/ENSL/NS.git
synced 2025-02-02 05:52:03 +00:00
88 lines
2.5 KiB
GLSL
88 lines
2.5 KiB
GLSL
|
#extension GL_ARB_explicit_uniform_location : require
|
||
|
|
||
|
layout(location = 0) in vec4 inColor;
|
||
|
layout(location = 0) out vec4 color;
|
||
|
|
||
|
//There doesn't seem to be a way for us to get at the fixed-function GL_FOG enabled state, so use a manual uniform
|
||
|
uniform bool fogEnabled;
|
||
|
uniform uint fogMode; // 0: Linear, 1: Exp, 2: Exp2
|
||
|
|
||
|
#define TEXTURE_ALBEDO 0
|
||
|
#define TEXTURE_ALBEDO_MASK (1 << TEXTURE_ALBEDO)
|
||
|
|
||
|
#define TEXTURE_LIGHTMAP 1
|
||
|
#define TEXTURE_LIGHTMAP_MASK (1 << TEXTURE_LIGHTMAP)
|
||
|
|
||
|
#define TEXTURE_DETAIL 2
|
||
|
#define TEXTURE_DETAIL_MASK (1 << TEXTURE_DETAIL)
|
||
|
|
||
|
#if (TEXTURE_MASK & TEXTURE_ALBEDO_MASK)
|
||
|
layout(binding = 0) uniform sampler2D albedoSampler;
|
||
|
#endif
|
||
|
|
||
|
#if (TEXTURE_MASK & TEXTURE_LIGHTMAP_MASK)
|
||
|
layout(binding = 1) uniform sampler2D lightmapSampler;
|
||
|
#endif
|
||
|
|
||
|
#if (TEXTURE_MASK & TEXTURE_DETAIL_MASK)
|
||
|
layout(binding = 2) uniform sampler2D detailSampler;
|
||
|
#endif
|
||
|
|
||
|
void main()
|
||
|
{
|
||
|
#if (TEXTURE_MASK & TEXTURE_ALBEDO_MASK)
|
||
|
vec4 albedo = texture2D(albedoSampler, gl_TexCoord[0].xy);
|
||
|
#endif
|
||
|
|
||
|
#if (TEXTURE_MASK & TEXTURE_LIGHTMAP_MASK)
|
||
|
// Josh:
|
||
|
// Magic number from the original overbright code.
|
||
|
vec3 lightmap = texture2D(lightmapSampler, gl_TexCoord[1].xy).rgb * (128.0f / 192.0f);
|
||
|
#endif
|
||
|
|
||
|
#if ( ( TEXTURE_MASK & TEXTURE_ALBEDO_MASK ) && ( TEXTURE_MASK & TEXTURE_LIGHTMAP_MASK ) )
|
||
|
// Josh:
|
||
|
// From the original blend eqn for overbrights.
|
||
|
vec3 diffuse = albedo.rgb * lightmap.rgb + lightmap.rgb * albedo.rgb;
|
||
|
color = vec4(diffuse.rgb, albedo.a);
|
||
|
#elif ( TEXTURE_MASK & TEXTURE_LIGHTMAP_MASK )
|
||
|
color = vec4(lightmap.rgb, 1.0f);
|
||
|
#elif ( TEXTURE_MASK & TEXTURE_ALBEDO_MASK )
|
||
|
color = vec4(albedo.rgb, albedo.a);
|
||
|
#else
|
||
|
color = vec4(1.0f);
|
||
|
#endif
|
||
|
|
||
|
#if (TEXTURE_MASK & TEXTURE_DETAIL_MASK)
|
||
|
// Josh:
|
||
|
// From DetailTexture.cpp -> MODULATE and SCALE * 2
|
||
|
vec3 detail = texture2D(detailSampler, gl_TexCoord[2].xy).rgb;
|
||
|
color.rgb = color.rgb * detail * 2.0f;
|
||
|
#endif
|
||
|
|
||
|
// NS3.3 addition: 1.7 average env_gamma value in NS maps
|
||
|
color.rgb *= 1.7f;
|
||
|
|
||
|
color *= inColor;
|
||
|
|
||
|
if ( fogEnabled )
|
||
|
{
|
||
|
float fogFactor;
|
||
|
if ( fogMode == 2 ) // Exp2
|
||
|
{
|
||
|
fogFactor = exp( -pow( gl_Fog.density * gl_FogFragCoord, 2.0 ) );
|
||
|
}
|
||
|
else if ( fogMode == 1 ) // Exp
|
||
|
{
|
||
|
fogFactor = exp( -gl_Fog.density * gl_FogFragCoord );
|
||
|
}
|
||
|
else // Linear
|
||
|
{
|
||
|
fogFactor = ( gl_Fog.end - gl_FogFragCoord ) * gl_Fog.scale;
|
||
|
}
|
||
|
|
||
|
fogFactor = clamp( fogFactor, 0, 1 );
|
||
|
color.xyz = mix( gl_Fog.color.xyz, color.xyz, fogFactor );
|
||
|
}
|
||
|
}
|