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