emotive_relight.frag 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * Copyright (C) 2020, Inria
  3. * GRAPHDECO research group, https://team.inria.fr/graphdeco
  4. * All rights reserved.
  5. *
  6. * This software is free for non-commercial, research and evaluation use
  7. * under the terms of the LICENSE.md file.
  8. *
  9. * For inquiries contact sibr@inria.fr and/or George.Drettakis@inria.fr
  10. */
  11. #version 420
  12. uniform vec3 lightDir;
  13. uniform vec3 cameraEye;
  14. layout(binding=0) uniform sampler2D tex;
  15. layout(binding=1) uniform sampler2D smTex;
  16. out vec4 out_color;
  17. in vec2 vertUV;
  18. in float vertAO;
  19. in vec3 VtoF_normal;
  20. in vec3 vertPos;
  21. float sRGB2LinF(float inF){
  22. if(inF<0.04045){
  23. return inF/12.92;
  24. }
  25. else{
  26. return pow((inF+0.055)/(1.055),2.4);
  27. }
  28. }
  29. float lin2sRGBF(float inF){
  30. if(inF<0.0031308){
  31. return 12.92*inF;
  32. }
  33. else{
  34. return 1.055*pow(inF,1.0/2.4)-0.055;
  35. }
  36. }
  37. vec4 sRGB2Lin(vec4 inVec){
  38. return vec4(sRGB2LinF(inVec.x),sRGB2LinF(inVec.y),sRGB2LinF(inVec.z),inVec.w);
  39. }
  40. vec4 lin2sRGB(vec4 inVec){
  41. return vec4(lin2sRGBF(inVec.x),lin2sRGBF(inVec.y),lin2sRGBF(inVec.z),inVec.w);
  42. }
  43. float getFogFactor(float d)
  44. {
  45. const float FogMax = 70.0;
  46. const float FogMin = 10.0;
  47. if (d>=FogMax) return 1;
  48. if (d<=FogMin) return 0;
  49. return 1 - (FogMax - d) / (FogMax - FogMin);
  50. }
  51. void main(void) {
  52. vec2 uv = vertUV;
  53. uv.y = 1.0 - uv.y; /// \todo TODO: Why Texture are flipped in y ?
  54. vec4 sky_color_lin = vec4(0.7,1.0,1.2,1.0)*sRGB2Lin(texture(tex, uv));
  55. float shadowVal=texture(smTex,gl_FragCoord.xy/textureSize(smTex,0).xy).x;
  56. vec4 sun_color_lin = max(0.0,dot(VtoF_normal,lightDir))*shadowVal*sRGB2Lin(texture(tex, uv))/(vertAO+0.0001);
  57. float d = distance(cameraEye, vertPos);
  58. float alpha = getFogFactor(d);
  59. vec4 composed_color = lin2sRGB(sun_color_lin+0.1*sky_color_lin);
  60. out_color = mix(composed_color, vec4(0.5,0.5,0.5,1.0), alpha);
  61. }