Well, maybe you can just pick the main light source - like in that image, the strip lights are the main source, so you could work out the camera angles, and affect the alpha of an overlay sprite with that. So, when you look at the light source the alpha of the sprite will be at maximum, then when you look away the sprite would fade out.
Like... say your light source is at lx#,ly#,lz#
dx#=camera position x()-lx#
dy#=camera position y()-ly#
dz#=camera position z()-lz#
Now, the next bit can be simplified, solved by different methods, really it's a matter of how accurate it needs to be. Like, I'd probably check the distance between the camera and light source, then move the camera forward 1 unit, and calculate the distance again - so I end up with a difference between -1.0 and 1.0 - anything >0.0 is closer to the camera. Anyway, to work out the distance using dx#,dy#,dz#
d#=sqrt((dx#*dx#)+(dy#*dy#)+(dz#*dz#))
Then move the camera forward 1 unit:
Move camera 1.0
Get the distance again, store it in d2# for example, then the difference between them is what to use for the alpha of your dirt sprite.
Then move the camera back -1.0 so it isn't flying forward the whole time.
Alp=(d2#-d#)*255
if alp<0 then alp=0
if alp>255 then alp=255
Set sprite alpha dirtsprite,alp
The dirtsprite, would be just dirt, greasy fingerprints even, but something that can overlay on top of the 3D stuff with that sort of texture. Maybe you could even do a ray collision check to the light source and include that - so the light has to actually hit the camera to affect the lens dirt.
I think a plain old sprite would be better than a normal map - you can make it subtle with a sprite, but a normal map might not let you fade and stuff the way you'd like. The sprite technique is easy to test at least, easier than having to make a normal map for dirt!

I am the one who knocks...
