light.glsl 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. //@renderpasses 4,5
  2. varying vec2 texCoord0;
  3. varying vec2 lightPos;
  4. varying vec4 color;
  5. varying vec2 gbufferCoords;
  6. varying vec2 fragPos;
  7. //@vertex
  8. attribute vec4 mx2_Vertex;
  9. attribute vec2 mx2_TexCoord0;
  10. attribute vec2 mx2_TexCoord1;
  11. attribute vec4 mx2_Color;
  12. uniform mat4 mx2_ModelViewProjectionMatrix;
  13. uniform vec2 mx2_ViewportOrigin;
  14. uniform vec2 mx2_ViewportSize;
  15. uniform vec2 mx2_ViewportClip;
  16. uniform vec2 mx2_GBufferScale;
  17. uniform vec4 mx2_ImageColor;
  18. void main(){
  19. texCoord0=mx2_TexCoord0;
  20. lightPos=mx2_TexCoord1;
  21. color=mx2_ImageColor * mx2_Color;
  22. gl_Position=mx2_ModelViewProjectionMatrix * mx2_Vertex;
  23. vec2 vpcoords=(gl_Position.xy * 0.5 + 0.5) * mx2_ViewportSize;
  24. gbufferCoords=(vpcoords + mx2_ViewportOrigin) * mx2_GBufferScale;
  25. fragPos=vpcoords;
  26. fragPos.y=mx2_ViewportSize.y-fragPos.y;
  27. fragPos-=mx2_ViewportClip;
  28. }
  29. //@fragment
  30. uniform sampler2D mx2_ImageTexture0; //image texture
  31. uniform float mx2_LightDepth;
  32. uniform sampler2D mx2_GBuffer0; //gbuffer diffuse
  33. uniform sampler2D mx2_GBuffer1; //gbuffer normal
  34. void main(){
  35. vec3 normal=texture2D( mx2_GBuffer1,gbufferCoords ).xyz;
  36. float gloss=normal.z;
  37. normal.xy=normal.xy * 2.0 - 1.0;
  38. normal.z=sqrt( 1.0-dot( normal.xy,normal.xy ) );
  39. //diffuse...
  40. //
  41. vec3 lvec=normalize( vec3( lightPos-fragPos,mx2_LightDepth ) );
  42. float ndotl=max( dot( normal,lvec ),0.0 );
  43. vec4 tcolor=texture2D( mx2_ImageTexture0,texCoord0 ) * color;
  44. vec4 diffuse=texture2D( mx2_GBuffer0,gbufferCoords ) * tcolor * ndotl;
  45. //specular...
  46. //
  47. vec3 hvec=normalize( lvec+vec3( 0.0,0.0,1.0 ) );
  48. float ndoth=max( dot( normal,hvec ),0.0 );
  49. vec4 specular=tcolor * pow( ndoth,128.0 ) * gloss;
  50. #if MX2_RENDERPASS==5
  51. float shadow=texture2D( mx2_GBuffer0,gbufferCoords ).a;
  52. diffuse*=shadow;
  53. specular*=shadow;
  54. #endif
  55. //tada!
  56. //
  57. gl_FragColor=vec4( diffuse.rgb+vec3( specular.a ),0.0 );
  58. }