gbuffer.glsl 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #ifndef _GBUFFER_GLSL_
  2. #define _GBUFFER_GLSL_
  3. vec2 octahedronWrap(const vec2 v) {
  4. return (1.0 - abs(v.yx)) * (vec2(v.x >= 0.0 ? 1.0 : -1.0, v.y >= 0.0 ? 1.0 : -1.0));
  5. }
  6. vec3 getNor(const vec2 enc) {
  7. vec3 n;
  8. n.z = 1.0 - abs(enc.x) - abs(enc.y);
  9. n.xy = n.z >= 0.0 ? enc.xy : octahedronWrap(enc.xy);
  10. n = normalize(n);
  11. return n;
  12. }
  13. vec3 getPosView(const vec3 viewRay, const float depth, const vec2 cameraProj) {
  14. float linearDepth = cameraProj.y / (cameraProj.x - depth);
  15. // float linearDepth = cameraProj.y / ((depth * 0.5 + 0.5) - cameraProj.x);
  16. return viewRay * linearDepth;
  17. }
  18. vec3 getPos(const vec3 eye, const vec3 eyeLook, const vec3 viewRay, const float depth, const vec2 cameraProj) {
  19. // eyeLook, viewRay should be normalized
  20. float linearDepth = cameraProj.y / ((depth * 0.5 + 0.5) - cameraProj.x);
  21. float viewZDist = dot(eyeLook, viewRay);
  22. vec3 wposition = eye + viewRay * (linearDepth / viewZDist);
  23. return wposition;
  24. }
  25. // GBuffer helper - Sebastien Lagarde
  26. // https://seblagarde.wordpress.com/2018/09/02/gbuffer-helper-packing-integer-and-float-together/
  27. float packFloatInt16(const float f, const uint i) {
  28. // Constant optimize by compiler
  29. const int numBitTarget = 16;
  30. const int numBitI = 4;
  31. const float prec = float(1 << numBitTarget);
  32. const float maxi = float(1 << numBitI);
  33. const float precMinusOne = prec - 1.0;
  34. const float t1 = ((prec / maxi) - 1.0) / precMinusOne;
  35. const float t2 = (prec / maxi) / precMinusOne;
  36. // Code
  37. return t1 * f + t2 * float(i);
  38. }
  39. void unpackFloatInt16(const float val, out float f, out uint i) {
  40. // Constant optimize by compiler
  41. const int numBitTarget = 16;
  42. const int numBitI = 4;
  43. const float prec = float(1 << numBitTarget);
  44. const float maxi = float(1 << numBitI);
  45. const float precMinusOne = prec - 1.0;
  46. const float t1 = ((prec / maxi) - 1.0) / precMinusOne;
  47. const float t2 = (prec / maxi) / precMinusOne;
  48. // Code
  49. // extract integer part
  50. // + rcp(precMinusOne) to deal with precision issue
  51. i = int((val / t2) + (1.0 / precMinusOne));
  52. // Now that we have i, solve formula in packFloatInt for f
  53. //f = (val - t2 * float(i)) / t1 => convert in mads form
  54. f = clamp((-t2 * float(i) + val) / t1, 0.0, 1.0); // Saturate in case of precision issue
  55. }
  56. #endif