assaultfish/engine/data/shader/shadow.fs

99 lines
2.4 KiB
Forth
Raw Permalink Normal View History

2026-01-05 18:40:10 +09:00
#version 110
2026-01-11 17:43:03 +09:00
varying vec4 vPos;
varying vec3 vNrm;
2026-02-02 18:48:39 +05:30
varying vec4 vShadowCoord0;
varying vec4 vShadowCoord1;
varying vec4 vShadowCoord2;
2026-01-12 01:03:18 +09:00
varying vec4 vColor;
2026-01-11 17:43:03 +09:00
2026-02-02 18:48:39 +05:30
uniform sampler2D shadow_map0;
uniform sampler2D shadow_map1;
uniform sampler2D shadow_map2;
2026-01-10 19:51:48 +09:00
uniform sampler2D current_texture;
2026-01-11 23:10:13 +09:00
uniform float enable_lighting;
2026-01-28 13:25:31 +09:00
uniform float enable_texture;
2026-04-08 17:09:25 +09:00
uniform float enable_shadow;
2026-02-02 23:24:12 +09:00
uniform vec3 camera;
2026-01-05 23:02:30 +09:00
2026-01-11 17:43:03 +09:00
vec4 PhongShading(void)
{
vec3 N = normalize(vNrm);
vec3 L = normalize(gl_LightSource[0].position.xyz-vPos.xyz);
2026-02-02 16:33:12 +09:00
if(gl_LightSource[0].position.w < 0.5){
2026-02-02 19:26:33 +09:00
L = normalize(gl_LightSource[0].position.xyz);
2026-02-02 16:33:12 +09:00
}
2026-01-11 17:43:03 +09:00
vec4 ambient = gl_FrontLightProduct[0].ambient;
float dcoef = max(dot(L, N), 0.0);
2026-01-11 18:27:41 +09:00
vec4 diffuse = gl_FrontLightProduct[0].diffuse * dcoef;
2026-01-05 23:02:30 +09:00
2026-01-11 17:43:03 +09:00
vec4 specular = vec4(0.0);
if(dcoef > 0.0){
vec3 V = normalize(-vPos.xyz);
2026-01-12 01:18:26 +05:30
vec3 H = normalize(L + V);
float specularLight = pow(max(dot(N, H), 0.0), gl_FrontMaterial.shininess);
2026-01-11 17:43:03 +09:00
2026-01-11 18:27:41 +09:00
specular = gl_FrontLightProduct[0].specular * specularLight;
2026-01-11 17:43:03 +09:00
}
return ambient+diffuse+specular;
}
2026-02-02 18:48:39 +05:30
float SampleShadow(sampler2D shadowMap, vec4 shadowCoord) {
vec3 shadow_c = shadowCoord.xyz / shadowCoord.w;
float view = shadow_c.z;
2026-01-11 17:43:03 +09:00
float shadow_coef = 1.0;
2026-02-02 18:48:39 +05:30
vec2 d[4];
2026-01-11 20:26:15 +09:00
int i;
2026-01-11 17:43:03 +09:00
2026-02-02 18:48:39 +05:30
if(shadow_c.z > 1.0) return 1.0;
2026-02-01 08:09:18 +09:00
2026-01-11 20:26:15 +09:00
d[0] = vec2(-0.94201624, -0.39906216);
d[1] = vec2(0.94558609, -0.76890725);
d[2] = vec2(-0.094184101, -0.92938870);
d[3] = vec2(0.34495938, 0.29387760);
for(i = 0; i < 4; i++){
2026-02-02 18:48:39 +05:30
vec2 p = shadow_c.xy + d[i] / 700.0;
2026-01-11 20:26:15 +09:00
2026-02-01 08:09:18 +09:00
if(p.x < 0.0 || p.y < 0.0 || p.x > 1.0 || p.y > 1.0) shadow_coef += 1.0;
2026-01-11 20:26:15 +09:00
2026-02-02 18:48:39 +05:30
if(texture2D(shadowMap, p).z < view){
2026-01-11 20:26:15 +09:00
shadow_coef -= 0.2;
}
2026-01-05 23:02:30 +09:00
}
2026-02-02 19:11:51 +09:00
2026-01-11 17:43:03 +09:00
return shadow_coef;
}
2026-02-02 18:48:39 +05:30
float ShadowCoef(void){
2026-02-02 23:24:12 +09:00
float dist = length(normalize(camera + gl_LightSource[0].position.xyz) - vPos.xyz);
if(gl_LightSource[0].position.w > 0.5){
if(dist >= 10.0) return 1.0;
}
2026-02-02 18:48:39 +05:30
if(dist < 10.0) return SampleShadow(shadow_map0, vShadowCoord0);
if(dist < 40.0) return SampleShadow(shadow_map1, vShadowCoord1);
return SampleShadow(shadow_map2, vShadowCoord2);
}
2026-01-11 17:43:03 +09:00
void main(void){
2026-02-01 08:09:18 +09:00
vec4 c = PhongShading();
2026-01-11 17:43:03 +09:00
vec4 ambient = gl_LightSource[0].ambient;
2026-04-08 17:09:25 +09:00
float shadow_coef = 1.0;
if(enable_shadow >= 0.5){
shadow_coef = ShadowCoef();
}
2026-01-11 17:43:03 +09:00
2026-01-28 13:25:31 +09:00
if(enable_texture >= 0.5){
c = c * texture2D(current_texture, gl_TexCoord[0].st);
}
2026-01-11 18:27:41 +09:00
2026-01-11 17:43:03 +09:00
gl_FragColor = ambient * shadow_coef * c + (1.0 - ambient) * c;
2026-01-30 23:07:23 +09:00
gl_FragColor.a = vColor.a;
2026-02-02 23:24:12 +09:00
}