1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
   |  
const std::string perPixLightingVertexShader =
        "#version 130 \n"
        "out mat4 invProjMat;"
        "void main () {"
                "gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;"
                "gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;"
                "gl_FrontColor = gl_Color;"
                "invProjMat = inverse(gl_ProjectionMatrix);"
        "}";
        const std::string perPixLightingFragmentShader =
        "#version 130 \n"
        "uniform sampler2D normalMap;"
        "uniform vec3 resolution;"
        "uniform vec4 lightColor;"
        "uniform sampler2D lightMap;"
        "uniform vec4 lightPos;"
        "in mat4 invProjMat;"
        "void main () { "
            "vec2 position = ( gl_FragCoord.xy / resolution.xy );"
            "vec4 bump = texture2D(normalMap, position);"
            "vec4 cBump = invProjMat * vec4(0, 0, bump.w, 0);"
            "vec3 pixPos = vec3 (gl_FragCoord.x, cBump.z, resolution.y - gl_FragCoord.y);"
            "vec4 lightMapColor = texture2D(lightMap, position);"
            "vec3 nLightPos = vec3 (lightPos.x, lightPos.z, lightPos.y);"
            "float radius = lightPos.w;"
            "if (gl_FragCoord.z >= bump.w && distance(pixPos, nLightPos) <= radius) {"
                "vec3 vertexToLight = nLightPos - pixPos;"
                "float attenuation = 1.0f - (length(vertexToLight) / radius);"
                "if (bump.x != 0 || bump.y != 0 || bump.z != 0) {"
                    "vec3 dirToLight = normalize(vertexToLight.xyz);"
                    "float nDotl = dot (dirToLight, bump.xzy);"
                    "attenuation *= nDotl;"
                "}"
                "gl_FragColor = lightColor * max(0.0f, attenuation);"
            "} else {"
                "gl_FragColor = lightMapColor;"
            "}"
        "}"; | 
Partager