probe.chunk 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include <builtin/uniforms/cc-local>
  2. vec4 GetTexData(sampler2D dataMap, float dataMapWidth, float x, float uv_y)
  3. {
  4. return vec4(
  5. decode32(texture(dataMap, vec2(((x + 0.5)/dataMapWidth), uv_y))),
  6. decode32(texture(dataMap, vec2(((x + 1.5)/dataMapWidth), uv_y))),
  7. decode32(texture(dataMap, vec2(((x + 2.5)/dataMapWidth), uv_y))),
  8. decode32(texture(dataMap, vec2(((x + 3.5)/dataMapWidth), uv_y)))
  9. );
  10. }
  11. void GetPlanarReflectionProbeData(out vec4 plane, out float planarReflectionDepthScale, out float mipCount, float probeId)
  12. {
  13. #if USE_INSTANCING
  14. float uv_y = (probeId + 0.5) / cc_probeInfo.x; //align to texel center
  15. float dataMapWidth = 12.0;
  16. vec4 texData1 = GetTexData(cc_reflectionProbeDataMap, dataMapWidth, 0.0, uv_y);
  17. vec4 texData2 = GetTexData(cc_reflectionProbeDataMap, dataMapWidth, 4.0, uv_y);
  18. plane.xyz = texData1.xyz;
  19. plane.w = texData2.x;
  20. planarReflectionDepthScale = texData2.y;
  21. mipCount = texData2.z;
  22. #else
  23. plane = cc_reflectionProbeData1;
  24. planarReflectionDepthScale = cc_reflectionProbeData2.x;
  25. mipCount = cc_reflectionProbeData2.w;
  26. #endif
  27. }
  28. void GetCubeReflectionProbeData(out vec3 centerPos, out vec3 boxHalfSize, out float mipCount, float probeId)
  29. {
  30. #if USE_INSTANCING
  31. float uv_y = (probeId + 0.5) / cc_probeInfo.x; //align to texel center
  32. float dataMapWidth = 12.0;
  33. vec4 texData1 = GetTexData(cc_reflectionProbeDataMap, dataMapWidth, 0.0, uv_y);
  34. vec4 texData2 = GetTexData(cc_reflectionProbeDataMap, dataMapWidth, 4.0, uv_y);
  35. vec4 texData3 = GetTexData(cc_reflectionProbeDataMap, dataMapWidth, 8.0, uv_y);
  36. centerPos = texData1.xyz;
  37. boxHalfSize = texData2.xyz;
  38. mipCount = texData3.x;
  39. #else
  40. centerPos = cc_reflectionProbeData1.xyz;
  41. boxHalfSize = cc_reflectionProbeData2.xyz;
  42. mipCount = cc_reflectionProbeData2.w;
  43. #endif
  44. RESTORE_REFLECTION_PROBE_MIP_COUNT(mipCount);
  45. }
  46. bool isReflectProbeUsingRGBE(float probeId)
  47. {
  48. #if USE_INSTANCING
  49. float uv_y = (probeId + 0.5) / cc_probeInfo.x; //align to texel center
  50. float dataMapWidth = 12.0;
  51. vec4 texData3 = GetTexData(cc_reflectionProbeDataMap, dataMapWidth, 8.0, uv_y);
  52. return IS_REFLECTION_PROBE_USE_RGBE(texData3.x);
  53. #else
  54. return IS_REFLECTION_PROBE_USE_RGBE(cc_reflectionProbeData2.w);
  55. #endif
  56. }
  57. bool isBlendReflectProbeUsingRGBE(float probeId)
  58. {
  59. #if USE_INSTANCING
  60. float uv_y = (probeId + 0.5) / cc_probeInfo.x; //align to texel center
  61. float dataMapWidth = 12.0;
  62. vec4 texData3 = GetTexData(cc_reflectionProbeDataMap, dataMapWidth, 8.0, uv_y);
  63. return IS_REFLECTION_PROBE_USE_RGBE(texData3.x);
  64. #else
  65. return IS_REFLECTION_PROBE_USE_RGBE(cc_reflectionProbeBlendData2.w);
  66. #endif
  67. }
  68. void GetBlendCubeReflectionProbeData(out vec3 centerPos, out vec3 boxHalfSize, out float mipCount, float probeId)
  69. {
  70. #if USE_INSTANCING
  71. float uv_y = (probeId + 0.5) / cc_probeInfo.x; //align to texel center
  72. float dataMapWidth = 12.0;
  73. vec4 texData1 = GetTexData(cc_reflectionProbeDataMap, dataMapWidth, 0.0, uv_y);
  74. vec4 texData2 = GetTexData(cc_reflectionProbeDataMap, dataMapWidth, 4.0, uv_y);
  75. vec4 texData3 = GetTexData(cc_reflectionProbeDataMap, dataMapWidth, 8.0, uv_y);
  76. centerPos = texData1.xyz;
  77. boxHalfSize = texData2.xyz;
  78. mipCount = texData3.x;
  79. #else
  80. centerPos = cc_reflectionProbeBlendData1.xyz;
  81. boxHalfSize = cc_reflectionProbeBlendData2.xyz;
  82. mipCount = cc_reflectionProbeBlendData2.w;
  83. #endif
  84. RESTORE_REFLECTION_PROBE_MIP_COUNT(mipCount);
  85. }