mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-26 09:35:28 +00:00
4b1c009ffd
With this PR we test out osg's shader define system for a somewhat harmless feature. As we can see, our code becomes more concise and efficient in this case. Most importantly, we no longer create unneeded vertex shader objects.
104 lines
2.8 KiB
GLSL
104 lines
2.8 KiB
GLSL
#version 120
|
|
#pragma import_defines(FORCE_OPAQUE)
|
|
|
|
#if @useUBO
|
|
#extension GL_ARB_uniform_buffer_object : require
|
|
#endif
|
|
|
|
#if @useGPUShader4
|
|
#extension GL_EXT_gpu_shader4: require
|
|
#endif
|
|
|
|
#if @diffuseMap
|
|
uniform sampler2D diffuseMap;
|
|
varying vec2 diffuseMapUV;
|
|
#endif
|
|
|
|
#if @emissiveMap
|
|
uniform sampler2D emissiveMap;
|
|
varying vec2 emissiveMapUV;
|
|
#endif
|
|
|
|
#if @normalMap
|
|
uniform sampler2D normalMap;
|
|
varying vec2 normalMapUV;
|
|
varying vec4 passTangent;
|
|
#endif
|
|
|
|
varying float euclideanDepth;
|
|
varying float linearDepth;
|
|
|
|
#define PER_PIXEL_LIGHTING 1
|
|
|
|
varying vec3 passViewPos;
|
|
varying vec3 passNormal;
|
|
|
|
#include "vertexcolors.glsl"
|
|
#include "shadows_fragment.glsl"
|
|
#include "lighting.glsl"
|
|
#include "alpha.glsl"
|
|
|
|
uniform float emissiveMult;
|
|
|
|
void main()
|
|
{
|
|
#if @diffuseMap
|
|
gl_FragData[0] = texture2D(diffuseMap, diffuseMapUV);
|
|
gl_FragData[0].a *= coveragePreservingAlphaScale(diffuseMap, adjustedDiffuseUV);
|
|
#else
|
|
gl_FragData[0] = vec4(1.0);
|
|
#endif
|
|
|
|
vec4 diffuseColor = getDiffuseColor();
|
|
gl_FragData[0].a *= diffuseColor.a;
|
|
alphaTest();
|
|
|
|
#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));
|
|
#else
|
|
vec3 viewNormal = gl_NormalMatrix * normalize(passNormal);
|
|
#endif
|
|
|
|
float shadowing = unshadowedLightRatio(linearDepth);
|
|
vec3 diffuseLight, ambientLight;
|
|
doLighting(passViewPos, normalize(viewNormal), shadowing, diffuseLight, ambientLight);
|
|
vec3 emission = getEmissionColor().xyz * emissiveMult;
|
|
#if @emissiveMap
|
|
emission *= texture2D(emissiveMap, emissiveMapUV).xyz;
|
|
#endif
|
|
vec3 lighting = diffuseColor.xyz * diffuseLight + getAmbientColor().xyz * ambientLight + emission;
|
|
|
|
clampLightingResult(lighting);
|
|
|
|
gl_FragData[0].xyz *= lighting;
|
|
|
|
float shininess = gl_FrontMaterial.shininess;
|
|
vec3 matSpec = getSpecularColor().xyz;
|
|
#if @normalMap
|
|
matSpec *= normalTex.a;
|
|
#endif
|
|
|
|
if (matSpec != vec3(0.0))
|
|
gl_FragData[0].xyz += getSpecular(normalize(viewNormal), normalize(passViewPos.xyz), shininess, matSpec) * shadowing;
|
|
#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);
|
|
|
|
#if FORCE_OPAQUE
|
|
// having testing & blending isn't enough - we need to write an opaque pixel to be opaque
|
|
gl_FragData[0].a = 1.0;
|
|
#endif
|
|
|
|
applyShadowDebugOverlay();
|
|
}
|