Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: data/branches/Shader_HS18/programs/Example/GLSLES/pssmReceiverFp.glsles @ 12091

Last change on this file since 12091 was 12091, checked in by wiesep, 6 years ago

Updated programs and adjusted Material to work with GLSL>150

File size: 2.8 KB
Line 
1#version 100
2
3precision mediump int;
4precision mediump float;
5
6float shadowPCF(sampler2D shadowMap, vec4 shadowMapPos, vec2 offset)
7{
8        shadowMapPos = shadowMapPos / shadowMapPos.w;
9        vec2 uv = shadowMapPos.xy;
10        vec3 o = vec3(offset, -offset.x) * 0.3;
11
12        // Note: We using 2x2 PCF. Good enough and is a lot faster.
13        float c =       (shadowMapPos.z <= texture2D(shadowMap, uv.xy - o.xy).r) ? 1.0 : 0.0; // top left
14        c +=            (shadowMapPos.z <= texture2D(shadowMap, uv.xy + o.xy).r) ? 1.0 : 0.0; // bottom right
15        c +=            (shadowMapPos.z <= texture2D(shadowMap, uv.xy + o.zy).r) ? 1.0 : 0.0; // bottom left
16        c +=            (shadowMapPos.z <= texture2D(shadowMap, uv.xy - o.zy).r) ? 1.0 : 0.0; // top right
17
18        return c / 4.0;
19}
20
21uniform vec4 invShadowMapSize0;
22uniform vec4 invShadowMapSize1;
23uniform vec4 invShadowMapSize2;
24uniform vec4 pssmSplitPoints;
25uniform sampler2D diffuse;
26uniform sampler2D specular;
27uniform sampler2D normalMap;
28uniform sampler2D shadowMap0;
29uniform sampler2D shadowMap1;
30uniform sampler2D shadowMap2;
31uniform vec4 lightDiffuse;
32uniform vec4 lightSpecular;
33uniform vec4 ambient;
34
35varying vec4 oUv0;
36varying vec3 oLightDir;
37varying vec3 oHalfAngle;
38varying vec4 oLightPosition0;
39varying vec4 oLightPosition1;
40varying vec4 oLightPosition2;
41varying vec3 oNormal;
42
43// to put it simply, this does 100% per pixel diffuse lighting
44void main()
45{
46        // calculate shadow
47        float shadowing = 1.0;
48        vec4 splitColour;
49        if (oUv0.z <= pssmSplitPoints.y)
50        {
51                splitColour = vec4(0.1, 0.0, 0.0, 1.0);
52                shadowing = shadowPCF(shadowMap0, oLightPosition0, invShadowMapSize0.xy);
53        }
54        else if (oUv0.z <= pssmSplitPoints.z)
55        {
56                splitColour = vec4(0.0, 0.1, 0.0, 1.0);
57                shadowing = shadowPCF(shadowMap1, oLightPosition1, invShadowMapSize1.xy);
58        }
59        else
60        {
61                splitColour = vec4(0.1, 0.1, 0.0, 1.0);
62                shadowing = shadowPCF(shadowMap2, oLightPosition2, invShadowMapSize2.xy);
63        }
64
65        // retrieve normalised light vector, expand from range-compressed
66        vec3 lightVec = normalize(oLightDir);
67
68        // retrieve half angle and normalise through cube map
69        vec3 halfAngle = normalize(oHalfAngle);
70
71        // get diffuse colour
72        vec4 diffuseColour = texture2D(diffuse, oUv0.xy);
73
74        // specular
75        vec4 specularColour = texture2D(specular, oUv0.xy);
76        float shininess = specularColour.w;
77        specularColour.w = 1.0;
78
79        // calculate lit value.
80        float diffuseCoeff = max(dot(oNormal, lightVec), 0.0);
81        float specularCoeff = step(0.0, dot(oNormal, lightVec)) * max(dot(oNormal, halfAngle) * (shininess * 128.0), 0.0);
82        vec4 lighting;
83        lighting.y = diffuseCoeff * shadowing;
84        lighting.z = specularCoeff * shadowing;
85//      vec4 lighting = lit(dot(oNormal, lightVec), dot(oNormal, halfAngle), shininess * 128.0) * shadowing;
86
87        // final lighting with diffuse and spec
88        gl_FragColor = (diffuseColour * clamp(ambient + lightDiffuse * lighting.y, 0.0, 1.0)) + (lightSpecular * specularColour * lighting.z);
89        gl_FragColor.w = diffuseColour.w;
90
91        //oColour += splitColour;
92}
Note: See TracBrowser for help on using the repository browser.