mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-06 00:55:50 +00:00
c48eee4eee
Fixes a regression in which pass lighting was clamped after being passed to fragment shader. For correct FFP emulation, we need to clamp the result in vertex shader. When clamping after interpolation, negative lights in particular have a much more drastic effect.
90 lines
2.3 KiB
GLSL
90 lines
2.3 KiB
GLSL
#version 120
|
|
|
|
#if @useUBO
|
|
#extension GL_ARB_uniform_buffer_object : require
|
|
#endif
|
|
|
|
#if @useGPUShader4
|
|
#extension GL_EXT_gpu_shader4: require
|
|
#endif
|
|
|
|
#define GROUNDCOVER
|
|
|
|
#if @diffuseMap
|
|
uniform sampler2D diffuseMap;
|
|
varying vec2 diffuseMapUV;
|
|
#endif
|
|
|
|
#if @normalMap
|
|
uniform sampler2D normalMap;
|
|
varying vec2 normalMapUV;
|
|
varying vec4 passTangent;
|
|
#endif
|
|
|
|
// Other shaders respect forcePPL, but legacy groundcover mods were designed to work with vertex lighting.
|
|
// They may do not look as intended with per-pixel lighting, so ignore this setting for now.
|
|
#define PER_PIXEL_LIGHTING @normalMap
|
|
|
|
varying float euclideanDepth;
|
|
varying float linearDepth;
|
|
|
|
#if PER_PIXEL_LIGHTING
|
|
varying vec3 passViewPos;
|
|
varying vec3 passNormal;
|
|
#else
|
|
centroid varying vec3 passLighting;
|
|
centroid varying vec3 shadowDiffuseLighting;
|
|
#endif
|
|
|
|
#include "shadows_fragment.glsl"
|
|
#include "lighting.glsl"
|
|
#include "alpha.glsl"
|
|
|
|
void main()
|
|
{
|
|
#if @normalMap
|
|
vec4 normalTex = texture2D(normalMap, normalMapUV);
|
|
|
|
vec3 normalizedNormal = normalize(passNormal);
|
|
vec3 normalizedTangent = normalize(passTangent.xyz);
|
|
vec3 binormal = cross(normalizedTangent, normalizedNormal) * passTangent.w;
|
|
mat3 tbnTranspose = mat3(normalizedTangent, binormal, normalizedNormal);
|
|
|
|
vec3 viewNormal = gl_NormalMatrix * normalize(tbnTranspose * (normalTex.xyz * 2.0 - 1.0));
|
|
#endif
|
|
|
|
#if @diffuseMap
|
|
gl_FragData[0] = texture2D(diffuseMap, diffuseMapUV);
|
|
#else
|
|
gl_FragData[0] = vec4(1.0);
|
|
#endif
|
|
|
|
if (euclideanDepth > @groundcoverFadeStart)
|
|
gl_FragData[0].a *= 1.0-smoothstep(@groundcoverFadeStart, @groundcoverFadeEnd, euclideanDepth);
|
|
|
|
alphaTest();
|
|
|
|
float shadowing = unshadowedLightRatio(linearDepth);
|
|
|
|
vec3 lighting;
|
|
#if !PER_PIXEL_LIGHTING
|
|
lighting = passLighting + shadowDiffuseLighting * shadowing;
|
|
#else
|
|
vec3 diffuseLight, ambientLight;
|
|
doLighting(passViewPos, normalize(viewNormal), shadowing, diffuseLight, ambientLight);
|
|
lighting = diffuseLight + ambientLight;
|
|
clampLightingResult(lighting);
|
|
#endif
|
|
|
|
gl_FragData[0].xyz *= lighting;
|
|
|
|
#if @radialFog
|
|
float fogValue = clamp((euclideanDepth - gl_Fog.start) * gl_Fog.scale, 0.0, 1.0);
|
|
#else
|
|
float fogValue = clamp((linearDepth - gl_Fog.start) * gl_Fog.scale, 0.0, 1.0);
|
|
#endif
|
|
gl_FragData[0].xyz = mix(gl_FragData[0].xyz, gl_Fog.color.xyz, fogValue);
|
|
|
|
applyShadowDebugOverlay();
|
|
}
|