3rb 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +2 -0
  3. data/3rb.gemspec +29 -0
  4. data/CHANGELOG.md +12 -0
  5. data/LICENSE +21 -0
  6. data/README.md +321 -0
  7. data/Rakefile +13 -0
  8. data/examples/01_hello_cube.rb +29 -0
  9. data/examples/02_basic_geometries.rb +56 -0
  10. data/examples/03_materials.rb +61 -0
  11. data/examples/04_lighting.rb +63 -0
  12. data/examples/05_animation.rb +79 -0
  13. data/examples/06_custom_shader.rb +92 -0
  14. data/examples/07_scene_graph.rb +74 -0
  15. data/examples/08_orbit_controls.rb +50 -0
  16. data/examples/09_3d_chart.rb +71 -0
  17. data/examples/10_procedural_terrain.rb +140 -0
  18. data/examples/11_particle_system.rb +68 -0
  19. data/examples/12_model_loader.rb +73 -0
  20. data/examples/13_game_prototype.rb +145 -0
  21. data/examples/14_utah_teapot.rb +291 -0
  22. data/examples/15_stanford_bunny.rb +200 -0
  23. data/examples/16_cornell_box.rb +373 -0
  24. data/examples/17_weird_fractal4.rb +130 -0
  25. data/examples/18_platonic_solids.rb +268 -0
  26. data/lib/3rb/animation/animation_clip.rb +287 -0
  27. data/lib/3rb/animation/animation_mixer.rb +366 -0
  28. data/lib/3rb/cameras/camera.rb +50 -0
  29. data/lib/3rb/cameras/orthographic_camera.rb +92 -0
  30. data/lib/3rb/cameras/perspective_camera.rb +103 -0
  31. data/lib/3rb/controls/orbit_controls.rb +341 -0
  32. data/lib/3rb/core/buffer_attribute.rb +172 -0
  33. data/lib/3rb/core/group.rb +9 -0
  34. data/lib/3rb/core/object3d.rb +298 -0
  35. data/lib/3rb/core/scene.rb +78 -0
  36. data/lib/3rb/dsl/helpers.rb +57 -0
  37. data/lib/3rb/dsl/scene_builder.rb +288 -0
  38. data/lib/3rb/ffi/glfw.rb +61 -0
  39. data/lib/3rb/ffi/opengl.rb +137 -0
  40. data/lib/3rb/ffi/platform.rb +65 -0
  41. data/lib/3rb/geometries/box_geometry.rb +101 -0
  42. data/lib/3rb/geometries/buffer_geometry.rb +345 -0
  43. data/lib/3rb/geometries/cone_geometry.rb +29 -0
  44. data/lib/3rb/geometries/cylinder_geometry.rb +149 -0
  45. data/lib/3rb/geometries/plane_geometry.rb +75 -0
  46. data/lib/3rb/geometries/sphere_geometry.rb +93 -0
  47. data/lib/3rb/geometries/torus_geometry.rb +77 -0
  48. data/lib/3rb/lights/ambient_light.rb +9 -0
  49. data/lib/3rb/lights/directional_light.rb +57 -0
  50. data/lib/3rb/lights/hemisphere_light.rb +26 -0
  51. data/lib/3rb/lights/light.rb +27 -0
  52. data/lib/3rb/lights/point_light.rb +68 -0
  53. data/lib/3rb/lights/rect_area_light.rb +35 -0
  54. data/lib/3rb/lights/spot_light.rb +88 -0
  55. data/lib/3rb/loaders/gltf_loader.rb +304 -0
  56. data/lib/3rb/loaders/loader.rb +94 -0
  57. data/lib/3rb/loaders/obj_loader.rb +186 -0
  58. data/lib/3rb/loaders/texture_loader.rb +55 -0
  59. data/lib/3rb/materials/basic_material.rb +70 -0
  60. data/lib/3rb/materials/lambert_material.rb +102 -0
  61. data/lib/3rb/materials/material.rb +114 -0
  62. data/lib/3rb/materials/phong_material.rb +106 -0
  63. data/lib/3rb/materials/shader_material.rb +104 -0
  64. data/lib/3rb/materials/standard_material.rb +106 -0
  65. data/lib/3rb/math/color.rb +246 -0
  66. data/lib/3rb/math/euler.rb +156 -0
  67. data/lib/3rb/math/math_utils.rb +132 -0
  68. data/lib/3rb/math/matrix3.rb +269 -0
  69. data/lib/3rb/math/matrix4.rb +501 -0
  70. data/lib/3rb/math/quaternion.rb +337 -0
  71. data/lib/3rb/math/vector2.rb +216 -0
  72. data/lib/3rb/math/vector3.rb +366 -0
  73. data/lib/3rb/math/vector4.rb +233 -0
  74. data/lib/3rb/native/gl.rb +382 -0
  75. data/lib/3rb/native/native.rb +55 -0
  76. data/lib/3rb/native/window.rb +111 -0
  77. data/lib/3rb/native.rb +9 -0
  78. data/lib/3rb/objects/line.rb +116 -0
  79. data/lib/3rb/objects/mesh.rb +40 -0
  80. data/lib/3rb/objects/points.rb +71 -0
  81. data/lib/3rb/renderers/opengl_renderer.rb +567 -0
  82. data/lib/3rb/renderers/renderer.rb +60 -0
  83. data/lib/3rb/renderers/shader_lib.rb +100 -0
  84. data/lib/3rb/textures/cube_texture.rb +26 -0
  85. data/lib/3rb/textures/data_texture.rb +35 -0
  86. data/lib/3rb/textures/render_target.rb +125 -0
  87. data/lib/3rb/textures/texture.rb +190 -0
  88. data/lib/3rb/version.rb +5 -0
  89. data/lib/3rb.rb +86 -0
  90. data/shaders/basic.frag +19 -0
  91. data/shaders/basic.vert +15 -0
  92. data/shaders/common/lights.glsl +53 -0
  93. data/shaders/common/uniforms.glsl +9 -0
  94. data/shaders/lambert.frag +37 -0
  95. data/shaders/lambert.vert +22 -0
  96. data/shaders/phong.frag +51 -0
  97. data/shaders/phong.vert +28 -0
  98. data/shaders/standard.frag +92 -0
  99. data/shaders/standard.vert +28 -0
  100. metadata +155 -0
@@ -0,0 +1,373 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Cornell Box - Spectral Path Tracer
5
+ # Based on https://www.shadertoy.com/view/4tVcRW
6
+
7
+ require_relative "../lib/3rb"
8
+
9
+ VERTEX_SHADER = <<~GLSL
10
+ #version 330 core
11
+
12
+ layout(location = 0) in vec3 position;
13
+ layout(location = 2) in vec2 uv;
14
+
15
+ out vec2 vUv;
16
+
17
+ void main() {
18
+ vUv = uv;
19
+ gl_Position = vec4(position.xy * 2.0, 0.0, 1.0);
20
+ }
21
+ GLSL
22
+
23
+ FRAGMENT_SHADER = <<~GLSL
24
+ #version 330 core
25
+
26
+ in vec2 vUv;
27
+
28
+ uniform float iTime;
29
+ uniform vec2 iResolution;
30
+ uniform float iFrame;
31
+
32
+ out vec4 fragColor;
33
+
34
+ #define PI 3.14159265358979
35
+ #define MAT3_ROTATE_Y(alpha) mat3(cos(alpha), 0.0, -sin(alpha), 0.0, 1.0, 0.0, sin(alpha), 0.0, cos(alpha))
36
+
37
+ #define REFLECTANCE_WHITE 0.87058, 0.87450, 0.86274
38
+ #define REFLECTANCE_GREEN 0.38431, 0.64313, 0.30196
39
+ #define REFLECTANCE_RED 0.69019, 0.25098, 0.24705
40
+ #define REFLECTANCE_LIGHT 0.89411, 0.89803, 0.88627
41
+
42
+ const mat3 XYZ_TO_RGB = transpose(mat3(
43
+ 3.2404542, -1.5371385, -0.4985314,
44
+ -0.9692660, 1.8760108, 0.0415560,
45
+ 0.0556434, -0.2040259, 1.0572252
46
+ ));
47
+
48
+ vec3 linearToSrgb(vec3 x) {
49
+ return mix(12.92 * x, 1.055 * pow(x, vec3(1.0 / 2.4)) - 0.055, step(0.0031308, x));
50
+ }
51
+
52
+ vec3 srgbToLinear(vec3 x) {
53
+ return mix(x / 12.92, pow((x + 0.055) / 1.055, vec3(2.4)), step(0.04045, x));
54
+ }
55
+
56
+ #define WL_MIN 390
57
+ #define WL_MAX 830
58
+
59
+ const float CIE2006_Y_Integral = 118.5180915;
60
+
61
+ const float[] ILLUMINANT_D65 = float[](0.0341,1.6643,3.2945,11.7652,20.236,28.6447,37.0535,38.5011,39.9488,42.4302,44.9117,45.775,46.6383,49.3637,52.0891,51.0323,49.9755,52.3118,54.6482,68.7015,82.7549,87.1204,91.486,92.4589,93.4318,90.057,86.6823,95.7736,104.865,110.936,117.008,117.41,117.812,116.336,114.861,115.392,115.923,112.367,108.811,109.082,109.354,108.578,107.802,106.296,104.79,106.239,107.689,106.047,104.405,104.225,104.046,102.023,100.0,98.1671,96.3342,96.0611,95.788,92.2368,88.6856,89.3459,90.0062,89.8026,89.5991,88.6489,87.6987,85.4936,83.2886,83.4939,83.6992,81.863,80.0268,80.1207,80.2146,81.2462,82.2778,80.281,78.2842,74.0027,69.7213,70.6652,71.6091,72.979,74.349,67.9765,61.604,65.7448,69.8856,72.4863,75.087,69.3398,63.5927,55.0054,46.4182,56.6118,66.8054,65.0941,63.3828);
62
+
63
+ const vec3[] CIE2006_CMF_XYZ = vec3[](vec3(2.952420E-03,4.076779E-04,1.318752E-02),vec3(3.577275E-03,4.977769E-04,1.597879E-02),vec3(4.332146E-03,6.064754E-04,1.935758E-02),vec3(5.241609E-03,7.370040E-04,2.343758E-02),vec3(6.333902E-03,8.929388E-04,2.835021E-02),vec3(7.641137E-03,1.078166E-03,3.424588E-02),vec3(9.199401E-03,1.296816E-03,4.129467E-02),vec3(1.104869E-02,1.553159E-03,4.968641E-02),vec3(1.323262E-02,1.851463E-03,5.962964E-02),vec3(1.579791E-02,2.195795E-03,7.134926E-02),vec3(1.879338E-02,2.589775E-03,8.508254E-02),vec3(2.226949E-02,3.036799E-03,1.010753E-01),vec3(2.627978E-02,3.541926E-03,1.195838E-01),vec3(3.087862E-02,4.111422E-03,1.408647E-01),vec3(3.611890E-02,4.752618E-03,1.651644E-01),vec3(4.204986E-02,5.474207E-03,1.927065E-01),vec3(4.871256E-02,6.285034E-03,2.236782E-01),vec3(5.612868E-02,7.188068E-03,2.582109E-01),vec3(6.429866E-02,8.181786E-03,2.963632E-01),vec3(7.319818E-02,9.260417E-03,3.381018E-01),vec3(8.277331E-02,1.041303E-02,3.832822E-01),vec3(9.295327E-02,1.162642E-02,4.316884E-01),vec3(1.037137E-01,1.289884E-02,4.832440E-01),vec3(1.150520E-01,1.423442E-02,5.379345E-01),vec3(1.269771E-01,1.564080E-02,5.957740E-01),vec3(1.395127E-01,1.712968E-02,6.568187E-01),vec3(1.526661E-01,1.871265E-02,7.210459E-01),vec3(1.663054E-01,2.038394E-02,7.878635E-01),vec3(1.802197E-01,2.212935E-02,8.563391E-01),vec3(1.941448E-01,2.392985E-02,9.253017E-01),vec3(2.077647E-01,2.576133E-02,9.933444E-01),vec3(2.207911E-01,2.760156E-02,1.059178E+00),vec3(2.332355E-01,2.945513E-02,1.122832E+00),vec3(2.452462E-01,3.133884E-02,1.184947E+00),vec3(2.570397E-01,3.327575E-02,1.246476E+00),vec3(2.688989E-01,3.529554E-02,1.308674E+00),vec3(2.810677E-01,3.742705E-02,1.372628E+00),vec3(2.933967E-01,3.967137E-02,1.437661E+00),vec3(3.055933E-01,4.201998E-02,1.502449E+00),vec3(3.173165E-01,4.446166E-02,1.565456E+00),vec3(3.281798E-01,4.698226E-02,1.624940E+00),vec3(3.378678E-01,4.956742E-02,1.679488E+00),vec3(3.465097E-01,5.221219E-02,1.729668E+00),vec3(3.543953E-01,5.491387E-02,1.776755E+00),vec3(3.618655E-01,5.766919E-02,1.822228E+00),vec3(3.693084E-01,6.047429E-02,1.867751E+00),vec3(3.770107E-01,6.332195E-02,1.914504E+00),vec3(3.846850E-01,6.619271E-02,1.961055E+00),vec3(3.918591E-01,6.906185E-02,2.005136E+00),vec3(3.980192E-01,7.190190E-02,2.044296E+00),vec3(4.026189E-01,7.468288E-02,2.075946E+00),vec3(4.052637E-01,7.738452E-02,2.098231E+00),vec3(4.062482E-01,8.003601E-02,2.112591E+00),vec3(4.060660E-01,8.268524E-02,2.121427E+00),vec3(4.052283E-01,8.538745E-02,2.127239E+00),vec3(4.042529E-01,8.820537E-02,2.132574E+00),vec3(4.034808E-01,9.118925E-02,2.139093E+00),vec3(4.025362E-01,9.431041E-02,2.144815E+00),vec3(4.008675E-01,9.751346E-02,2.146832E+00),vec3(3.979327E-01,1.007349E-01,2.142250E+00),vec3(3.932139E-01,1.039030E-01,2.128264E+00),vec3(3.864108E-01,1.069639E-01,2.103205E+00),vec3(3.779513E-01,1.099676E-01,2.069388E+00),vec3(3.684176E-01,1.129992E-01,2.030030E+00),vec3(3.583473E-01,1.161541E-01,1.988178E+00),vec3(3.482214E-01,1.195389E-01,1.946651E+00),vec3(3.383830E-01,1.232503E-01,1.907521E+00),vec3(3.288309E-01,1.273047E-01,1.870689E+00),vec3(3.194977E-01,1.316964E-01,1.835578E+00),vec3(3.103345E-01,1.364178E-01,1.801657E+00),vec3(3.013112E-01,1.414586E-01,1.768440E+00),vec3(2.923754E-01,1.468003E-01,1.735338E+00),vec3(2.833273E-01,1.524002E-01,1.701254E+00),vec3(2.739463E-01,1.582021E-01,1.665053E+00),vec3(2.640352E-01,1.641400E-01,1.625712E+00),vec3(2.534221E-01,1.701373E-01,1.582342E+00),vec3(2.420135E-01,1.761233E-01,1.534439E+00),vec3(2.299346E-01,1.820896E-01,1.482544E+00),vec3(2.173617E-01,1.880463E-01,1.427438E+00),vec3(2.044672E-01,1.940065E-01,1.369876E+00),vec3(1.914176E-01,1.999859E-01,1.310576E+00),vec3(1.783672E-01,2.060054E-01,1.250226E+00),vec3(1.654407E-01,2.120981E-01,1.189511E+00),vec3(1.527391E-01,2.183041E-01,1.129050E+00),vec3(1.403439E-01,2.246686E-01,1.069379E+00),vec3(1.283167E-01,2.312426E-01,1.010952E+00),vec3(1.167124E-01,2.380741E-01,9.541809E-01),vec3(1.056121E-01,2.451798E-01,8.995253E-01),vec3(9.508569E-02,2.525682E-01,8.473720E-01),vec3(8.518206E-02,2.602479E-01,7.980093E-01),vec3(7.593120E-02,2.682271E-01,7.516389E-01),vec3(6.733159E-02,2.765005E-01,7.082645E-01),vec3(5.932018E-02,2.850035E-01,6.673867E-01),vec3(5.184106E-02,2.936475E-01,6.284798E-01),vec3(4.486119E-02,3.023319E-01,5.911174E-01),vec3(3.836770E-02,3.109438E-01,5.549619E-01),vec3(3.237296E-02,3.194105E-01,5.198843E-01),vec3(2.692095E-02,3.278683E-01,4.862772E-01),vec3(2.204070E-02,3.365263E-01,4.545497E-01),vec3(1.773951E-02,3.456176E-01,4.249955E-01),vec3(1.400745E-02,3.554018E-01,3.978114E-01),vec3(1.082291E-02,3.660893E-01,3.730218E-01),vec3(8.168996E-03,3.775857E-01,3.502618E-01),vec3(6.044623E-03,3.896960E-01,3.291407E-01),vec3(4.462638E-03,4.021947E-01,3.093356E-01),vec3(3.446810E-03,4.148227E-01,2.905816E-01),vec3(3.009513E-03,4.273539E-01,2.726773E-01),vec3(3.090744E-03,4.398206E-01,2.555143E-01),vec3(3.611221E-03,4.523360E-01,2.390188E-01),vec3(4.491435E-03,4.650298E-01,2.231335E-01),vec3(5.652072E-03,4.780482E-01,2.078158E-01),vec3(7.035322E-03,4.915173E-01,1.930407E-01),vec3(8.669631E-03,5.054224E-01,1.788089E-01),vec3(1.060755E-02,5.197057E-01,1.651287E-01),vec3(1.290468E-02,5.343012E-01,1.520103E-01),vec3(1.561956E-02,5.491344E-01,1.394643E-01),vec3(1.881640E-02,5.641302E-01,1.275353E-01),vec3(2.256923E-02,5.792416E-01,1.163771E-01),vec3(2.694456E-02,5.944264E-01,1.061161E-01),vec3(3.199910E-02,6.096388E-01,9.682266E-02),vec3(3.778185E-02,6.248296E-01,8.852389E-02),vec3(4.430635E-02,6.399656E-01,8.118263E-02),vec3(5.146516E-02,6.550943E-01,7.463132E-02),vec3(5.912224E-02,6.702903E-01,6.870644E-02),vec3(6.714220E-02,6.856375E-01,6.327834E-02),vec3(7.538941E-02,7.012292E-01,5.824484E-02),vec3(8.376697E-02,7.171103E-01,5.353812E-02),vec3(9.233581E-02,7.330917E-01,4.914863E-02),vec3(1.011940E-01,7.489041E-01,4.507511E-02),vec3(1.104362E-01,7.642530E-01,4.131175E-02),vec3(1.201511E-01,7.788199E-01,3.784916E-02),vec3(1.303960E-01,7.923410E-01,3.467234E-02),vec3(1.411310E-01,8.048510E-01,3.175471E-02),vec3(1.522944E-01,8.164747E-01,2.907029E-02),vec3(1.638288E-01,8.273520E-01,2.659651E-02),vec3(1.756832E-01,8.376358E-01,2.431375E-02),vec3(1.878114E-01,8.474653E-01,2.220677E-02),vec3(2.001621E-01,8.568868E-01,2.026852E-02),vec3(2.126822E-01,8.659242E-01,1.849246E-02),vec3(2.253199E-01,8.746041E-01,1.687084E-02),vec3(2.380254E-01,8.829552E-01,1.539505E-02),vec3(2.507787E-01,8.910274E-01,1.405450E-02),vec3(2.636778E-01,8.989495E-01,1.283354E-02),vec3(2.768607E-01,9.068753E-01,1.171754E-02),vec3(2.904792E-01,9.149652E-01,1.069415E-02),vec3(3.046991E-01,9.233858E-01,9.753000E-03),vec3(3.196485E-01,9.322325E-01,8.886096E-03),vec3(3.352447E-01,9.412862E-01,8.089323E-03),vec3(3.513290E-01,9.502378E-01,7.359131E-03),vec3(3.677148E-01,9.587647E-01,6.691736E-03),vec3(3.841856E-01,9.665325E-01,6.083223E-03),vec3(4.005312E-01,9.732504E-01,5.529423E-03),vec3(4.166669E-01,9.788415E-01,5.025504E-03),vec3(4.325420E-01,9.832867E-01,4.566879E-03),vec3(4.481063E-01,9.865720E-01,4.149405E-03),vec3(4.633109E-01,9.886887E-01,3.769336E-03),vec3(4.781440E-01,9.897056E-01,3.423302E-03),vec3(4.927483E-01,9.899849E-01,3.108313E-03),vec3(5.073315E-01,9.899624E-01,2.821650E-03),vec3(5.221315E-01,9.900731E-01,2.560830E-03),vec3(5.374170E-01,9.907500E-01,2.323578E-03),vec3(5.534217E-01,9.922826E-01,2.107847E-03),vec3(5.701242E-01,9.943837E-01,1.911867E-03),vec3(5.874093E-01,9.966221E-01,1.734006E-03),vec3(6.051269E-01,9.985649E-01,1.572736E-03),vec3(6.230892E-01,9.997775E-01,1.426627E-03),vec3(6.410999E-01,9.999440E-01,1.294325E-03),vec3(6.590659E-01,9.992200E-01,1.174475E-03),vec3(6.769436E-01,9.978793E-01,1.065842E-03),vec3(6.947143E-01,9.961934E-01,9.673215E-04),vec3(7.123849E-01,9.944304E-01,8.779264E-04),vec3(7.299978E-01,9.927831E-01,7.967847E-04),vec3(7.476478E-01,9.911578E-01,7.231502E-04),vec3(7.654250E-01,9.893925E-01,6.563501E-04),vec3(7.834009E-01,9.873288E-01,5.957678E-04),vec3(8.016277E-01,9.848127E-01,5.408385E-04),vec3(8.201041E-01,9.817253E-01,4.910441E-04),vec3(8.386843E-01,9.780714E-01,4.459046E-04),vec3(8.571936E-01,9.738860E-01,4.049826E-04),vec3(8.754652E-01,9.692028E-01,3.678818E-04),vec3(8.933408E-01,9.640545E-01,3.342429E-04),vec3(9.106772E-01,9.584409E-01,3.037407E-04),vec3(9.273554E-01,9.522379E-01,2.760809E-04),vec3(9.432502E-01,9.452968E-01,2.509970E-04),vec3(9.582244E-01,9.374773E-01,2.282474E-04),vec3(9.721304E-01,9.286495E-01,2.076129E-04),vec3(9.849237E-01,9.187953E-01,1.888948E-04),vec3(9.970067E-01,9.083014E-01,1.719127E-04),vec3(1.008907E+00,8.976352E-01,1.565030E-04),vec3(1.021163E+00,8.872401E-01,1.425177E-04),vec3(1.034327E+00,8.775360E-01,1.298230E-04),vec3(1.048753E+00,8.687920E-01,1.182974E-04),vec3(1.063937E+00,8.607474E-01,1.078310E-04),vec3(1.079166E+00,8.530233E-01,9.832455E-05),vec3(1.093723E+00,8.452535E-01,8.968787E-05),vec3(1.106886E+00,8.370838E-01,8.183954E-05),vec3(1.118106E+00,8.282409E-01,7.470582E-05),vec3(1.127493E+00,8.187320E-01,6.821991E-05),vec3(1.135317E+00,8.086352E-01,6.232132E-05),vec3(1.141838E+00,7.980296E-01,5.695534E-05),vec3(1.147304E+00,7.869950E-01,5.207245E-05),vec3(1.151897E+00,7.756040E-01,4.762781E-05),vec3(1.155582E+00,7.638996E-01,4.358082E-05),vec3(1.158284E+00,7.519157E-01,3.989468E-05),vec3(1.159934E+00,7.396832E-01,3.653612E-05),vec3(1.160477E+00,7.272309E-01,3.347499E-05),vec3(1.159890E+00,7.145878E-01,3.068400E-05),vec3(1.158259E+00,7.017926E-01,2.813839E-05),vec3(1.155692E+00,6.888866E-01,2.581574E-05),vec3(1.152293E+00,6.759103E-01,2.369574E-05),vec3(1.148163E+00,6.629035E-01,2.175998E-05),vec3(1.143345E+00,6.498911E-01,1.999179E-05),vec3(1.137685E+00,6.368410E-01,1.837603E-05),vec3(1.130993E+00,6.237092E-01,1.689896E-05),vec3(1.123097E+00,6.104541E-01,1.554815E-05),vec3(1.113846E+00,5.970375E-01,1.431231E-05),vec3(1.103152E+00,5.834395E-01,1.318119E-05),vec3(1.091121E+00,5.697044E-01,1.214548E-05),vec3(1.077902E+00,5.558892E-01,1.119673E-05),vec3(1.063644E+00,5.420475E-01,1.032727E-05),vec3(1.048485E+00,5.282296E-01,9.530130E-06),vec3(1.032546E+00,5.144746E-01,8.798979E-06),vec3(1.015870E+00,5.007881E-01,8.128065E-06),vec3(9.984859E-01,4.871687E-01,7.512160E-06),vec3(9.804227E-01,4.736160E-01,6.946506E-06),vec3(9.617111E-01,4.601308E-01,6.426776E-06),vec3(9.424119E-01,4.467260E-01,0.0),vec3(9.227049E-01,4.334589E-01,0.0),vec3(9.027804E-01,4.203919E-01,0.0),vec3(8.828123E-01,4.075810E-01,0.0),vec3(8.629581E-01,3.950755E-01,0.0),vec3(8.432731E-01,3.828894E-01,0.0),vec3(8.234742E-01,3.709190E-01,0.0),vec3(8.032342E-01,3.590447E-01,0.0),vec3(7.822715E-01,3.471615E-01,0.0),vec3(7.603498E-01,3.351794E-01,0.0),vec3(7.373739E-01,3.230562E-01,0.0),vec3(7.136470E-01,3.108859E-01,0.0),vec3(6.895336E-01,2.987840E-01,0.0),vec3(6.653567E-01,2.868527E-01,0.0),vec3(6.413984E-01,2.751807E-01,0.0),vec3(6.178723E-01,2.638343E-01,0.0),vec3(5.948484E-01,2.528330E-01,0.0),vec3(5.723600E-01,2.421835E-01,0.0),vec3(5.504353E-01,2.318904E-01,0.0),vec3(5.290979E-01,2.219564E-01,0.0),vec3(5.083728E-01,2.123826E-01,0.0),vec3(4.883006E-01,2.031698E-01,0.0),vec3(4.689171E-01,1.943179E-01,0.0),vec3(4.502486E-01,1.858250E-01,0.0),vec3(4.323126E-01,1.776882E-01,0.0),vec3(4.150790E-01,1.698926E-01,0.0),vec3(3.983657E-01,1.623822E-01,0.0),vec3(3.819846E-01,1.550986E-01,0.0),vec3(3.657821E-01,1.479918E-01,0.0),vec3(3.496358E-01,1.410203E-01,0.0),vec3(3.334937E-01,1.341614E-01,0.0),vec3(3.174776E-01,1.274401E-01,0.0),vec3(3.017298E-01,1.208887E-01,0.0),vec3(2.863684E-01,1.145345E-01,0.0),vec3(2.714900E-01,1.083996E-01,0.0),vec3(2.571632E-01,1.025007E-01,0.0),vec3(2.434102E-01,9.684588E-02,0.0),vec3(2.302389E-01,9.143944E-02,0.0),vec3(2.176527E-01,8.628318E-02,0.0),vec3(2.056507E-01,8.137687E-02,0.0),vec3(1.942251E-01,7.671708E-02,0.0),vec3(1.833530E-01,7.229404E-02,0.0),vec3(1.730097E-01,6.809696E-02,0.0),vec3(1.631716E-01,6.411549E-02,0.0),vec3(1.538163E-01,6.033976E-02,0.0),vec3(1.449230E-01,5.676054E-02,0.0),vec3(1.364729E-01,5.336992E-02,0.0),vec3(1.284483E-01,5.016027E-02,0.0),vec3(1.208320E-01,4.712405E-02,0.0),vec3(1.136072E-01,4.425383E-02,0.0),vec3(1.067579E-01,4.154205E-02,0.0),vec3(1.002685E-01,3.898042E-02,0.0),vec3(9.412394E-02,3.656091E-02,0.0),vec3(8.830929E-02,3.427597E-02,0.0),vec3(8.281010E-02,3.211852E-02,0.0),vec3(7.761208E-02,3.008192E-02,0.0),vec3(7.270064E-02,2.816001E-02,0.0),vec3(6.806167E-02,2.634698E-02,0.0),vec3(6.368176E-02,2.463731E-02,0.0),vec3(5.954815E-02,2.302574E-02,0.0),vec3(5.564917E-02,2.150743E-02,0.0),vec3(5.197543E-02,2.007838E-02,0.0),vec3(4.851788E-02,1.873474E-02,0.0),vec3(4.526737E-02,1.747269E-02,0.0),vec3(4.221473E-02,1.628841E-02,0.0),vec3(3.934954E-02,1.517767E-02,0.0),vec3(3.665730E-02,1.413473E-02,0.0),vec3(3.412407E-02,1.315408E-02,0.0),vec3(3.173768E-02,1.223092E-02,0.0),vec3(2.948752E-02,1.136106E-02,0.0),vec3(2.736717E-02,1.054190E-02,0.0),vec3(2.538113E-02,9.775050E-03,0.0),vec3(2.353356E-02,9.061962E-03,0.0),vec3(2.182558E-02,8.402962E-03,0.0),vec3(2.025590E-02,7.797457E-03,0.0),vec3(1.881892E-02,7.243230E-03,0.0),vec3(1.749930E-02,6.734381E-03,0.0),vec3(1.628167E-02,6.265001E-03,0.0),vec3(1.515301E-02,5.830085E-03,0.0),vec3(1.410230E-02,5.425391E-03,0.0),vec3(1.312106E-02,5.047634E-03,0.0),vec3(1.220509E-02,4.695140E-03,0.0),vec3(1.135114E-02,4.366592E-03,0.0),vec3(1.055593E-02,4.060685E-03,0.0),vec3(9.816228E-03,3.776140E-03,0.0),vec3(9.128517E-03,3.511578E-03,0.0),vec3(8.488116E-03,3.265211E-03,0.0),vec3(7.890589E-03,3.035344E-03,0.0),vec3(7.332061E-03,2.820496E-03,0.0),vec3(6.809147E-03,2.619372E-03,0.0),vec3(6.319204E-03,2.430960E-03,0.0),vec3(5.861036E-03,2.254796E-03,0.0),vec3(5.433624E-03,2.090489E-03,0.0),vec3(5.035802E-03,1.937586E-03,0.0),vec3(4.666298E-03,1.795595E-03,0.0),vec3(4.323750E-03,1.663989E-03,0.0),vec3(4.006709E-03,1.542195E-03,0.0),vec3(3.713708E-03,1.429639E-03,0.0),vec3(3.443294E-03,1.325752E-03,0.0),vec3(3.194041E-03,1.229980E-03,0.0),vec3(2.964424E-03,1.141734E-03,0.0),vec3(2.752492E-03,1.060269E-03,0.0),vec3(2.556406E-03,9.848854E-04,0.0),vec3(2.374564E-03,9.149703E-04,0.0),vec3(2.205568E-03,8.499903E-04,0.0),vec3(2.048294E-03,7.895158E-04,0.0),vec3(1.902113E-03,7.333038E-04,0.0),vec3(1.766485E-03,6.811458E-04,0.0),vec3(1.640857E-03,6.328287E-04,0.0),vec3(1.524672E-03,5.881375E-04,0.0),vec3(1.417322E-03,5.468389E-04,0.0),vec3(1.318031E-03,5.086349E-04,0.0),vec3(1.226059E-03,4.732403E-04,0.0),vec3(1.140743E-03,4.404016E-04,0.0),vec3(1.061495E-03,4.098928E-04,0.0),vec3(9.877949E-04,3.815137E-04,0.0),vec3(9.191847E-04,3.550902E-04,0.0),vec3(8.552568E-04,3.304668E-04,0.0),vec3(7.956433E-04,3.075030E-04,0.0),vec3(7.400120E-04,2.860718E-04,0.0),vec3(6.880980E-04,2.660718E-04,0.0),vec3(6.397864E-04,2.474586E-04,0.0),vec3(5.949726E-04,2.301919E-04,0.0),vec3(5.535291E-04,2.142225E-04,0.0),vec3(5.153113E-04,1.994949E-04,0.0),vec3(4.801234E-04,1.859336E-04,0.0),vec3(4.476245E-04,1.734067E-04,0.0),vec3(4.174846E-04,1.617865E-04,0.0),vec3(3.894221E-04,1.509641E-04,0.0),vec3(3.631969E-04,1.408466E-04,0.0),vec3(3.386279E-04,1.313642E-04,0.0),vec3(3.156452E-04,1.224905E-04,0.0),vec3(2.941966E-04,1.142060E-04,0.0),vec3(2.742235E-04,1.064886E-04,0.0),vec3(2.556624E-04,9.931439E-05,0.0),vec3(2.384390E-04,9.265512E-05,0.0),vec3(2.224525E-04,8.647225E-05,0.0),vec3(2.076036E-04,8.072780E-05,0.0),vec3(1.938018E-04,7.538716E-05,0.0),vec3(1.809649E-04,7.041878E-05,0.0),vec3(1.690167E-04,6.579338E-05,0.0),vec3(1.578839E-04,6.148250E-05,0.0),vec3(1.474993E-04,5.746008E-05,0.0),vec3(1.378026E-04,5.370272E-05,0.0),vec3(1.287394E-04,5.018934E-05,0.0),vec3(1.202644E-04,4.690245E-05,0.0),vec3(1.123502E-04,4.383167E-05,0.0),vec3(1.049725E-04,4.096780E-05,0.0),vec3(9.810596E-05,3.830123E-05,0.0),vec3(9.172477E-05,3.582218E-05,0.0),vec3(8.579861E-05,3.351903E-05,0.0),vec3(8.028174E-05,3.137419E-05,0.0),vec3(7.513013E-05,2.937068E-05,0.0),vec3(7.030565E-05,2.749380E-05,0.0),vec3(6.577532E-05,2.573083E-05,0.0),vec3(6.151508E-05,2.407249E-05,0.0),vec3(5.752025E-05,2.251704E-05,0.0),vec3(5.378813E-05,2.106350E-05,0.0),vec3(5.031350E-05,1.970991E-05,0.0),vec3(4.708916E-05,1.845353E-05,0.0),vec3(4.410322E-05,1.728979E-05,0.0),vec3(4.133150E-05,1.620928E-05,0.0),vec3(3.874992E-05,1.520262E-05,0.0),vec3(3.633762E-05,1.426169E-05,0.0),vec3(3.407653E-05,1.337946E-05,0.0),vec3(3.195242E-05,1.255038E-05,0.0),vec3(2.995808E-05,1.177169E-05,0.0),vec3(2.808781E-05,1.104118E-05,0.0),vec3(2.633581E-05,1.035662E-05,0.0),vec3(2.469630E-05,9.715798E-06,0.0),vec3(2.316311E-05,9.116316E-06,0.0),vec3(2.172855E-05,8.555201E-06,0.0),vec3(2.038519E-05,8.029561E-06,0.0),vec3(1.912625E-05,7.536768E-06,0.0),vec3(1.794555E-05,7.074424E-06,0.0),vec3(1.683776E-05,6.640464E-06,0.0),vec3(1.579907E-05,6.233437E-06,0.0),vec3(1.482604E-05,5.852035E-06,0.0),vec3(1.391527E-05,5.494963E-06,0.0),vec3(1.306345E-05,5.160948E-06,0.0),vec3(1.226720E-05,4.848687E-06,0.0),vec3(1.152279E-05,4.556705E-06,0.0),vec3(1.082663E-05,4.283580E-06,0.0),vec3(1.017540E-05,4.027993E-06,0.0),vec3(9.565993E-06,3.788729E-06,0.0),vec3(8.995405E-06,3.564599E-06,0.0),vec3(8.460253E-06,3.354285E-06,0.0),vec3(7.957382E-06,3.156557E-06,0.0),vec3(7.483997E-06,2.970326E-06,0.0),vec3(7.037621E-06,2.794625E-06,0.0),vec3(6.616311E-06,2.628701E-06,0.0),vec3(6.219265E-06,2.472248E-06,0.0),vec3(5.845844E-06,2.325030E-06,0.0),vec3(5.495311E-06,2.186768E-06,0.0),vec3(5.166853E-06,2.057152E-06,0.0),vec3(4.859511E-06,1.935813E-06,0.0),vec3(4.571973E-06,1.822239E-06,0.0),vec3(4.302920E-06,1.715914E-06,0.0),vec3(4.051121E-06,1.616355E-06,0.0),vec3(3.815429E-06,1.523114E-06,0.0),vec3(3.594719E-06,1.435750E-06,0.0),vec3(3.387736E-06,1.353771E-06,0.0),vec3(3.193301E-06,1.276714E-06,0.0),vec3(3.010363E-06,1.204166E-06,0.0),vec3(2.837980E-06,1.135758E-06,0.0),vec3(2.675365E-06,1.071181E-06,0.0),vec3(2.522020E-06,1.010243E-06,0.0),vec3(2.377511E-06,9.527779E-07,0.0),vec3(2.241417E-06,8.986224E-07,0.0),vec3(2.113325E-06,8.476168E-07,0.0),vec3(1.992830E-06,7.996052E-07,0.0),vec3(1.879542E-06,7.544361E-07,0.0),vec3(1.773083E-06,7.119624E-07,0.0),vec3(1.673086E-06,6.720421E-07,0.0),vec3(1.579199E-06,6.345380E-07,0.0));
64
+
65
+ const vec3[] CIE2006_BASIS_RGB = vec3[](vec3(0.361396471056708,0.252275705864828,0.386327749991032),vec3(0.366205305492837,0.235416148479571,0.398378488359465),vec3(0.371266544491276,0.21551362909132,0.413219780889496),vec3(0.375826682752906,0.193361838306436,0.430811443451517),vec3(0.378931281646137,0.170213950722939,0.450854739893322),vec3(0.379486367262762,0.146935008502323,0.473578602657459),vec3(0.376593730760743,0.124520895668156,0.498885356527868),vec3(0.369558349313344,0.104513543161356,0.525928094462577),vec3(0.358873584245906,0.0873768593817381,0.553749546116267),vec3(0.345130566986974,0.072963535226373,0.581905889627497),vec3(0.328251563088163,0.0610398371212503,0.610708593091079),vec3(0.308552505415631,0.0513190921255156,0.640128397106951),vec3(0.287174624808842,0.0433949906128264,0.669430380270105),vec3(0.265201641787191,0.0368826097572261,0.6979157450652),vec3(0.243045727135127,0.0314748187061981,0.725479451241526),vec3(0.220937878555078,0.0269368109732676,0.752125308174961),vec3(0.199346669367302,0.023102088919068,0.777551239751982),vec3(0.178921019256518,0.0198804141079897,0.801198565198056),vec3(0.160082581682908,0.0171951627504054,0.822722254635495),vec3(0.143043624509629,0.0149725918056479,0.8419837825555),vec3(0.127647149539569,0.0131454383663785,0.859207411299804),vec3(0.114788573984292,0.0116487280786844,0.873562697296838),vec3(0.103316260235184,0.0104086932344483,0.886275046348654),vec3(0.0932518666479813,0.00936480867269029,0.897383323885414),vec3(0.0843664327916331,0.00847145272002132,0.907162114032132),vec3(0.0764577020390705,0.00769379991480418,0.915848497678197),vec3(0.0693845001234432,0.00700864335902012,0.923606856599652),vec3(0.0631104736138383,0.00641054210726977,0.930478984200588),vec3(0.0576046106519274,0.00589653172568395,0.936498857804),vec3(0.0528265500146353,0.00546274898698706,0.941710700798877),vec3(0.0487277455283648,0.00510516507487266,0.946167089538723),vec3(0.0452464572772848,0.00481770982409582,0.949935832819348),vec3(0.0422725820425418,0.00458608307901361,0.953141334919228),vec3(0.039703262373669,0.00439668646497515,0.955900051146983),vec3(0.037455139058216,0.0042384011939596,0.95830645982211),vec3(0.0354600372812668,0.00410184676768847,0.960438115944202),vec3(0.0336564467190598,0.00397915803696281,0.962364395327574),vec3(0.0319714709061577,0.00386435524834813,0.964164173954034),vec3(0.0303366881445415,0.00375206176074797,0.965911250170638),vec3(0.0286933099515374,0.00363728832521505,0.967669401788626),vec3(0.0269947205432021,0.00351577644591095,0.969489502991052),vec3(0.0252282217111559,0.00338580522402117,0.971385973151492),vec3(0.0234580083647742,0.00325171858372909,0.973290273119263),vec3(0.0217527228115435,0.00311853091617314,0.975128746288891),vec3(0.0201631925905153,0.00299005839993127,0.976846749143154),vec3(0.0187234576407893,0.00286884779294434,0.978407694612511),vec3(0.0174488994506994,0.00275663952405543,0.979794461148403),vec3(0.0163280904902336,0.00265565645819332,0.981016253259442),vec3(0.0153452468886244,0.00256813127759055,0.982086621981104),vec3(0.0144861780559633,0.00249614943952171,0.983017672674219),vec3(0.0137381956551172,0.00244178408164589,0.983820020431351),vec3(0.0130867474600425,0.00240592043900152,0.984507332309904),vec3(0.0125066008328427,0.00238445312895018,0.985108946336329),vec3(0.011974039235965,0.00237241835583257,0.985653542707892),vec3(0.0114695448056021,0.00236512543691745,0.986165330037658),vec3(0.0109771084042056,0.00235800437504581,0.986664887523997),vec3(0.0104892403205561,0.00234831284715694,0.987162447120292),vec3(0.0100203951870777,0.00234037259593541,0.9876392324978),vec3(0.00958680322480087,0.00234017145989162,0.988073025622264),vec3(0.00920042585973419,0.00235367021686863,0.98844590421961),vec3(0.00887973072081534,0.00238786516006445,0.988732404442236),vec3(0.00860520827065324,0.00244643706709479,0.988948354934752),vec3(0.00836732063173359,0.00252780336726841,0.989104876266163),vec3(0.00817777671420739,0.00263166056927542,0.98919056298573),vec3(0.00797728196919423,0.00275031422799895,0.989272404046558),vec3(0.00776280756773801,0.00288050327073746,0.98935668943516),vec3(0.00752322480656702,0.00301827558713578,0.989458499794256),vec3(0.00738176284055312,0.00320753131923758,0.989410706072419),vec3(0.00717964596439533,0.00336752685268753,0.989452827341526),vec3(0.00696721407329869,0.00356965698692528,0.989463129090929),vec3(0.00716956338982263,0.00393592724088271,0.988894509503006),vec3(0.00648723991847956,0.00404960604105882,0.989463154193344),vec3(0.00621620145572442,0.00432111336519908,0.989462685306371),vec3(0.0061703417349609,0.00479375415814202,0.989035904178019),vec3(0.00563348899865069,0.00495835307356082,0.989408158002329),vec3(0.00523483096796861,0.00531690945791252,0.989448259605118),vec3(0.00498377479547626,0.0058246166160886,0.989191608599878),vec3(0.004760911210281,0.00647607419329812,0.98876301457901),vec3(0.00454208151498636,0.00727757698303369,0.988180341484035),vec3(0.00432748461853859,0.00827234652401926,0.987400168773758),vec3(0.00411781951832206,0.00952326464963346,0.986358915732748),vec3(0.00391410266312994,0.01112695996682,0.984958937279945),vec3(0.00371757718278664,0.0132432651492109,0.983039157613706),vec3(0.00352930218980754,0.0161528616582408,0.980317836116817),vec3(0.00334999643313325,0.0203955708927266,0.976254432608402),vec3(0.00317999229993085,0.0271578607388973,0.969662146952061),vec3(0.00301966868590795,0.0396332002480259,0.957347131162118),vec3(0.0028705041211961,0.070325853543585,0.926803642017144),vec3(0.00273363515083904,0.24992097853778,0.747345386062212),vec3(0.00260950322849179,0.879787924982616,0.117602571707971),vec3(0.00249856306030856,0.942808059071281,0.0546933780587161),vec3(0.00240066290421108,0.961783902277145,0.0358154347561766),vec3(0.00231441511884631,0.970867923905408,0.0268176608120465),vec3(0.002238381861103,0.976185165981655,0.0215764518969246),vec3(0.00217134831811772,0.979669430483185,0.0181592209856099),vec3(0.00211227274835322,0.982122997849185,0.0157647290494959),vec3(0.0020599209693597,0.983940230816847,0.0139998478832392),vec3(0.00201189235285397,0.985344314099166,0.0126437931961052),vec3(0.00196564633691464,0.986472843092402,0.0115615102294631),vec3(0.0019188261125259,0.987415571260503,0.0106656022184081),vec3(0.00186926818990606,0.988233933976807,0.00989679742413786),vec3(0.00181574188025131,0.988967351292169,0.00921690639569143),vec3(0.00175994912822348,0.989628436356831,0.00861161406580099),vec3(0.00170413548536508,0.99022167636531,0.00807418769585527),vec3(0.00165032161433526,0.990749529062014,0.00760014882948853),vec3(0.00160029995498627,0.991213264076789,0.00718643549381231),vec3(0.00155523718724574,0.9916158354081,0.00682892692078097),vec3(0.00151452891335767,0.991968465695081,0.00651700491485177),vec3(0.00147724647237568,0.992282013932627,0.0062407391000766),vec3(0.00144256240580218,0.992565087190795,0.00599234991916047),vec3(0.00140973348628126,0.992824627795095,0.00576563823354133),vec3(0.00137819444959272,0.993065715524064,0.00555608953555029),vec3(0.00134785214360529,0.993290265822737,0.0053618815464683),vec3(0.00131872380811099,0.993499408376993,0.00518186733421665),vec3(0.00129082419404661,0.993694174648865,0.0050150006772275),vec3(0.00126416553960866,0.993875508465271,0.00486032552149924),vec3(0.00123879678964318,0.994043994807604,0.00471720794432022),vec3(0.00121490507172813,0.994199227128935,0.00458586734744344),vec3(0.00119268748968416,0.99434082146648,0.00446649061921878),vec3(0.00117231872567021,0.9944685990092,0.00435908185244806),vec3(0.00115395914029295,0.99458250229289,0.00426353773101575),vec3(0.00113765908123584,0.994682942820404,0.00417939769621543),vec3(0.00112308682297844,0.994772367251123,0.00410454554247749),vec3(0.00110983780104095,0.994853284357552,0.00403687747816938),vec3(0.00109753225709246,0.994927910792738,0.00397455660214574),vec3(0.0010858089015939,0.994998227701555,0.00391596305004663),vec3(0.00107438975803964,0.995065715237115,0.00385989467364532),vec3(0.00106327904468655,0.99513049133726,0.00380622930570586),vec3(0.00105254847301566,0.995192376992653,0.00375507423229327),vec3(0.00104226962376743,0.995251212297542,0.00370651779073142),vec3(0.00103251630213132,0.995306839002218,0.00366064442174718),vec3(0.00102336575919332,0.99535908122064,0.00361755276006225),vec3(0.0010148875099738,0.995407755600887,0.00357735664476775),vec3(0.00100714743087891,0.995452664088211,0.00354018824601941),vec3(0.00100020772645907,0.995493605880918,0.00350618616349645),vec3(0.000994125554320192,0.995530387771965,0.00347548646268983),vec3(0.000989926960592362,0.99554321506467,0.0034668577747009),vec3(0.000991948494702743,0.995497510348077,0.00351054096262953),vec3(0.00098671008139981,0.995531526937004,0.00348176278783334),vec3(0.000987616131106955,0.99554321497737,0.00346916872609295),vec3(0.000990739109245901,0.995520046419803,0.00348921429895365),vec3(0.00100095814751352,0.995423737690503,0.00357530400801253),vec3(0.000997854413296231,0.995513566484496,0.00348857893771747),vec3(0.00100025563925044,0.995543214534084,0.00345652968956841),vec3(0.00100582960564373,0.995537358480228,0.00345681178555054),vec3(0.00101103444907204,0.995543214885874,0.00344575053416357),vec3(0.00101836470571876,0.995520638106343,0.00346099706992487),vec3(0.00102583697481177,0.995497471616308,0.00347669129489027),vec3(0.00103360186414059,0.995473442631189,0.00349295540560879),vec3(0.0010418518712566,0.995447704444406,0.00351044358909034),vec3(0.00105077832995165,0.995419417709551,0.00352980387571236),vec3(0.00106057016705192,0.995387766205211,0.00355166354883467),vec3(0.00107140538599571,0.995352029022475,0.0035765655161336),vec3(0.00108346861367711,0.995311476680984,0.00360505463528331),vec3(0.00109695575857428,0.995265341928867,0.00363770225523469),vec3(0.00111207603877874,0.995212813053082,0.00367511085173541),vec3(0.00112899571787142,0.995153277871117,0.00371772635416002),vec3(0.00114766180235258,0.995087080512621,0.00376525764227259),vec3(0.00116797249435672,0.995014784310207,0.0038172431573299),vec3(0.0011898337199143,0.994936929361246,0.00387323688317441),vec3(0.00121316308520745,0.994854019433739,0.00393281745719606),vec3(0.00123798089476159,0.994766155185609,0.00399586391102516),vec3(0.00126468492671321,0.994672035539955,0.00406327952871428),vec3(0.00129386318953173,0.994569245303462,0.0041368915146827),vec3(0.00132607312406012,0.99445616654204,0.00421776035325079),vec3(0.00136199274322546,0.994330383860827,0.00430762342964648),vec3(0.00140218827558767,0.994190097607497,0.00440771416843773),vec3(0.00144657027980234,0.994036044265193,0.00451738551819895),vec3(0.0014948414463994,0.993869748034934,0.00463541058975732),vec3(0.00154664697157499,0.993692933166304,0.00476041994827885),vec3(0.00160155611031673,0.99350757585286,0.00489086813480547),vec3(0.00165934351590016,0.99331488522358,0.0050257713662265),vec3(0.00172098970224122,0.993111819487787,0.00516719092074947),vec3(0.00178799311734439,0.992893717152543,0.00531828984558922),vec3(0.00186215733594893,0.992655160595531,0.0054826822156781),vec3(0.00194567722982058,0.992389796604603,0.00566452632394037),vec3(0.00204086187457851,0.992091428392607,0.00586770989006352),vec3(0.00214886544504434,0.991758320093876,0.00609281463710752),vec3(0.00227060126556373,0.991389991655376,0.00633940725496502),vec3(0.00240710194018797,0.990986049346417,0.00660684890039683),vec3(0.00255951308567156,0.990546281797964,0.00689420534461247),vec3(0.00272961003173243,0.990069109916685,0.00720128027028609),vec3(0.00292172449778344,0.98954595110701,0.00753232463362984),vec3(0.00314209112563573,0.988964336016287,0.00789357309271495),vec3(0.00339901430740703,0.988308532045919,0.00829245388040288),vec3(0.0037036775131452,0.987559367177946,0.00873695559222785),vec3(0.00407200203530361,0.986688050028538,0.00923994823615614),vec3(0.00452541495588699,0.985665328561487,0.00980925675224465),vec3(0.00509650009960986,0.984445619212887,0.0104578809719572),vec3(0.00583624568025899,0.982963667419555,0.0112000872332953),vec3(0.00682876239517714,0.981120811222337,0.0120504266988633),vec3(0.00822405389000236,0.978747717078863,0.0130282292907272),vec3(0.0102850220872316,0.975586251520629,0.0141287269296979),vec3(0.013574328845884,0.971070041435139,0.0153556301518601),vec3(0.0193066305447665,0.96414625633196,0.0165471134285413),vec3(0.031289649321998,0.951109697178212,0.0176006555471729),vec3(0.0668370590231314,0.914977989973778,0.0181849523033105),vec3(0.47055821975157,0.511444995583411,0.0179967968958568),vec3(0.910322527198126,0.0726668485313894,0.0170106249605477),vec3(0.948080455313271,0.0361923080770627,0.0157272385852104),vec3(0.961821356060462,0.0237477481751048,0.0144308959859631),vec3(0.969199115942889,0.0175698872533994,0.0132309972432555),vec3(0.973908662984669,0.0139226460381375,0.0121686912671749),vec3(0.977209973244265,0.0115405563250229,0.0112494709794463),vec3(0.979656739520468,0.00987936539339772,0.0104638955435151),vec3(0.981533157171168,0.00866834659880336,0.00979849656878104),vec3(0.98300459261219,0.00775698136505557,0.00923842640607187),vec3(0.984186034298509,0.0070497600039875,0.00876420604257239),vec3(0.985154144725996,0.00648659344310688,0.00835926216828412),vec3(0.985960394124136,0.00602876059685385,0.00801084569654375),vec3(0.986640780839053,0.00565019506385772,0.00770902447378607),vec3(0.987219960775549,0.00533339573118596,0.00744664385732223),vec3(0.987712462684063,0.00506760323360109,0.00721993441762183),vec3(0.98812922337855,0.00484481984619499,0.00702595719156639),vec3(0.988479466505093,0.00465858261733583,0.00686195128437309),vec3(0.988771011112271,0.00450363052254957,0.00672535880950215),vec3(0.989010580213688,0.00437559807374124,0.00661382217947227),vec3(0.9892042685635,0.00427064636886897,0.00652508545411795),vec3(0.989267381249336,0.00421399837222459,0.0065186207014573),vec3(0.98926740534975,0.0041821610608368,0.00655043395806412),vec3(0.989234375147028,0.00415983508196995,0.00660579020001557),vec3(0.988677031131798,0.00429505524467431,0.00702791405273997),vec3(0.989261896340495,0.00411521650646233,0.00662288754111876),vec3(0.989216667360449,0.00410703662046563,0.00667629645389074),vec3(0.98908381615834,0.00413798119759596,0.00677820303410443),vec3(0.989159735413925,0.00410561424141076,0.00673465078490153),vec3(0.989149438069669,0.00410210406035243,0.00674845823809849),vec3(0.989267414017139,0.00407205376923983,0.00666053260312171),vec3(0.989267347297893,0.00406867675841742,0.0066639763143222),vec3(0.989149465414196,0.00410374302842169,0.00674679197440041),vec3(0.989010741739061,0.00414689990776415,0.00684235874466237),vec3(0.988851556765261,0.00419805577549299,0.00695038786462158),vec3(0.988666611701783,0.0042592412800962,0.00707414740744478),vec3(0.988449830921947,0.00433277711218761,0.00721739228664503),vec3(0.988195045723736,0.00442099331156629,0.00738396127962477),vec3(0.987895790071809,0.00452631586678535,0.00757789432283689),vec3(0.987547682812115,0.00465035300600109,0.00780196443975241),vec3(0.987156395994108,0.00479084335761819,0.00805276096208005),vec3(0.986730687865098,0.00494437506976931,0.00832493739352415),vec3(0.986280206086251,0.0051072340743429,0.00861256011031588),vec3(0.985815725823163,0.00527530812606157,0.00890896633417709),vec3(0.985346439308458,0.00544510677638383,0.00920845415055283),vec3(0.984870899926437,0.00561716707756873,0.00951193322145867),vec3(0.984384353309599,0.0057932674062179,0.00982237946648336),vec3(0.983881364727288,0.00597543537475818,0.0101432000722108),vec3(0.983355832537928,0.00616594246133098,0.0104782251474164),vec3(0.982801681826561,0.00636703393642332,0.0108312843643075),vec3(0.982214944276448,0.0065801254183601,0.0112049304064262),vec3(0.981591725416592,0.00680659697277952,0.0116016776831345),vec3(0.98092754126865,0.00704804585665008,0.0120244129683026),vec3(0.980217090262774,0.00730637615403068,0.0124765336152861),vec3(0.979453267798003,0.00758420524152908,0.0129625269257405),vec3(0.978624519621515,0.0078859723879099,0.0134895079454178),vec3(0.977717527383843,0.00821680986648768,0.01406566272648),vec3(0.976717975770224,0.00858221875205089,0.0146998053590432),vec3(0.975610130314012,0.00898824321526453,0.0154016262328342),vec3(0.974380955661223,0.00943989050166923,0.016179153503124),vec3(0.97303407501227,0.00993577225357135,0.0170301523769722),vec3(0.971579295046055,0.0104721558632539,0.0179485487499031),vec3(0.970029137485527,0.0110442972001875,0.0189265649081134),vec3(0.968399706730058,0.0116460953881084,0.0199541973030008),vec3(0.966705025849687,0.0122722369902735,0.021022736604104),vec3(0.964937629361706,0.0129255280066701,0.0221368420177389),vec3(0.963082130442705,0.0136117759302372,0.0233060928289402),vec3(0.961120546417721,0.0143377754175333,0.0245416773622041),vec3(0.9590319139876,0.0151114621734259,0.0258566227866761),vec3(0.956796175514438,0.0159404740186431,0.027263349512981),vec3(0.954407851284952,0.016827045662572,0.0287651018742996),vec3(0.951866676073972,0.0177714865078491,0.0303618362319376),vec3(0.949173892094391,0.0187735660724978,0.0320525403474783),vec3(0.946332511974346,0.0198324130524218,0.0338350735352774),vec3(0.943345001728747,0.0209473786587602,0.0357076179263381),vec3(0.940203648515703,0.0221216857161372,0.0376746637708886),vec3(0.936897409987339,0.0233598532330812,0.0397427346744222),vec3(0.933414159950306,0.0246668596885005,0.0419189783494429),vec3(0.929740524243158,0.0260482124393599,0.0442112610380524),vec3(0.925855987461467,0.027512146274089,0.0466318636851517),vec3(0.921711471921493,0.0290777114165444,0.0492108139101391),vec3(0.917243538045007,0.0307695668950082,0.0519868921571845),vec3(0.912378106804082,0.032616739271856,0.0550051506612125),vec3(0.907028952197872,0.0346533860677326,0.0583176583842104),vec3(0.901115003869107,0.0369124928322675,0.061972499429983),vec3(0.894627709019822,0.0394004375408431,0.0659718493328085),vec3(0.887588778616097,0.0421129926205522,0.0702982242094708),vec3(0.880035520058126,0.045040602520688,0.0749238723495664),vec3(0.872022572079822,0.0481669710569523,0.0798104513613239),vec3(0.863596414980893,0.0514780312477339,0.0849255479810375),vec3(0.854704135853001,0.0549973448052305,0.0902985129470983),vec3(0.845263865037901,0.0587615126664724,0.0959746151561844),vec3(0.835164234228834,0.0628159425352819,0.102019815549722),vec3(0.824272187898797,0.0672139629653747,0.108513841066305),vec3(0.81243615811694,0.0720139577867945,0.115549875361241),vec3(0.799554520195097,0.077255705344938,0.1231897643896),vec3(0.785585551400888,0.0829687581926738,0.131445679085806),vec3(0.77059797235583,0.0891658605651413,0.140236154887926),vec3(0.754760688368665,0.0958388811531214,0.149400416994105),vec3(0.738236975719522,0.102963396129037,0.158799613480885),vec3(0.721183518780123,0.110470201598867,0.168346263538835),vec3(0.703725364167222,0.11828312573515,0.177991492572075),vec3(0.686168541918471,0.126264025632914,0.187567413274633),vec3(0.6691014235548,0.134160995220305,0.196737560163804),vec3(0.653109491273661,0.141709675782503,0.205180810262307),vec3(0.638215526478275,0.148883288878905,0.212901160346387),vec3(0.624181645705891,0.155766976057149,0.220051352305384),vec3(0.610690212568645,0.162488299800432,0.226821459767806),vec3(0.597407438389556,0.169196694433434,0.233395837485818),vec3(0.584083552723607,0.176016114608081,0.239900300561521),vec3(0.570748939335397,0.182939507363671,0.246311519008544),vec3(0.557518389511387,0.189919996534704,0.252561577091982),vec3(0.544522552139376,0.196899404662466,0.258578003504021),vec3(0.531898809916482,0.203808267712451,0.264292879711033),vec3(0.519754395007152,0.210577676294061,0.269667882798696),vec3(0.50774930822063,0.21713871300938,0.275111929440529),vec3(0.49724655471009,0.223498311608695,0.279255080763256),vec3(0.486917069519072,0.2295842389745,0.283498634632749),vec3(0.47720566645071,0.235392602481688,0.287401670206982),vec3(0.468109700074472,0.240926940143867,0.290963294594973),vec3(0.459397412658735,0.246290143370965,0.294312374095256),vec3(0.450946008343407,0.251568634559499,0.297485282122744),vec3(0.442614488798001,0.256839992043789,0.300545438238409),vec3(0.434311955978638,0.262161160974956,0.303526795380919),vec3(0.426023875819186,0.267542374864477,0.306433653803779),vec3(0.417917421815236,0.27287378975905,0.309208683825244),vec3(0.410169845563115,0.278031834508319,0.31179820459365),vec3(0.402850283906071,0.282970590100404,0.314178998856179),vec3(0.396077350690941,0.287593834369213,0.316328674249106),vec3(0.389957444122094,0.291811256524333,0.318231143498422),vec3(0.384417756099057,0.295673660400157,0.319908411332678),vec3(0.37958956788575,0.299066827112916,0.321343415092933),vec3(0.375505813949727,0.301955363715723,0.322538614543891),vec3(0.372054455444386,0.304416721465106,0.323528597323951),vec3(0.369258422307495,0.306422085971136,0.324319249151433),vec3(0.366974936529127,0.308066808807225,0.324957996229284),vec3(0.365027410765379,0.309475417494957,0.325496897646785),vec3(0.363270582875766,0.310752243609656,0.325976883780891),vec3(0.361611551321096,0.311963649081228,0.32642449345612),vec3(0.360006491185019,0.313140149590384,0.326853035168552),vec3(0.358455027259584,0.314281405449835,0.327263223798044),vec3(0.356957753201009,0.315386941585728,0.327654940204382),vec3(0.355516113074104,0.316455309958497,0.328028188565432),vec3(0.354131597457431,0.317485010349718,0.328382978629746),vec3(0.352812618332759,0.318468978632809,0.328717961510659),vec3(0.351570767660263,0.319398012508374,0.329030748002959),vec3(0.350406978974473,0.320271228184325,0.329321288886345),vec3(0.349323662444366,0.321086111685236,0.329589688055097),vec3(0.3483254723968,0.321838652231916,0.329835302322305),vec3(0.347409953666681,0.322530302812563,0.330059133618807),vec3(0.346551839316617,0.323179779309591,0.330267732556819),vec3(0.345725463931662,0.323806292905732,0.330467551681723),vec3(0.344911242176026,0.324424632544639,0.330663385721125),vec3(0.344094923178749,0.325045635561157,0.330858646184776),vec3(0.343272617544637,0.325672286215913,0.331054235605566),vec3(0.34246463381076,0.326289100289123,0.331245329679247),vec3(0.341691657933856,0.326880178250347,0.331427141747785),vec3(0.340978992446758,0.327423294574038,0.331596594724302),vec3(0.340308546669854,0.327940178493338,0.331750050921398),vec3(0.339714434145185,0.328396403734122,0.331887825172607),vec3(0.339178020313029,0.328808778307809,0.332011741956555),vec3(0.338688989226496,0.329185095822886,0.332124322764153),vec3(0.338238793819259,0.32953183146608,0.332227636907457),vec3(0.337820387223979,0.329854341379531,0.332323372176796),vec3(0.337428358803245,0.33015673938345,0.33241282155364),vec3(0.337059593960997,0.330441382144034,0.332496738385965),vec3(0.336711799297235,0.330710003016331,0.332575677698766),vec3(0.336393489134285,0.330953530738308,0.33265018939778),vec3(0.336071726615592,0.331204759553083,0.332720407186174),vec3(0.335778961551176,0.331431209900532,0.332786351701114),vec3(0.335514753467587,0.331635640205613,0.332845710523242),vec3(0.335288428531529,0.331810798234289,0.332896429223342),vec3(0.335106400805813,0.331951691503971,0.332937121502569),vec3(0.334982830237101,0.332045015184259,0.332966982226614),vec3(0.33488622718803,0.33212213939852,0.332986177196332),vec3(0.334833532894243,0.332162955473576,0.332997867533508),vec3(0.334800885693187,0.332188262946562,0.333005085140322),vec3(0.334777409959641,0.332206475043291,0.333010258369814),vec3(0.334754648816851,0.332224131172513,0.333015272788072),vec3(0.334726747562834,0.3322457566078,0.3330214331626),vec3(0.334691498889229,0.332273056920239,0.333029228124995),vec3(0.334647849086408,0.332306842183399,0.333038890806484),vec3(0.334595164551481,0.332347598898901,0.333050556332937),vec3(0.334533170699357,0.332395532233052,0.333064278543963),vec3(0.334462673481989,0.332450009776818,0.333079868893349),vec3(0.334387428202622,0.332508119588588,0.333096484008189),vec3(0.334321057590764,0.332557055569046,0.333113311257929),vec3(0.334236779489025,0.332624321950136,0.333129634721204),vec3(0.334176374645139,0.332668565221611,0.333145037096858),vec3(0.334102053304267,0.332728017392087,0.33315909121194),vec3(0.334044269237699,0.332772397765162,0.333171643842437),vec3(0.334003485294713,0.332811116613815,0.333172848857627),vec3(0.333960612549575,0.332834225679941,0.33319177783655),vec3(0.333915928070901,0.332870662692583,0.333199256746151));
66
+
67
+ uint hash(uint x) {
68
+ x += (x << 10u);
69
+ x ^= (x >> 6u);
70
+ x += (x << 3u);
71
+ x ^= (x >> 11u);
72
+ x += (x << 15u);
73
+ return x;
74
+ }
75
+
76
+ uint hash(uvec3 v) {
77
+ return hash(v.x ^ hash(v.y) ^ hash(v.z));
78
+ }
79
+
80
+ float floatConstruct(uint m) {
81
+ const uint ieeeMantissa = 0x007FFFFFu;
82
+ const uint ieeeOne = 0x3F800000u;
83
+ m &= ieeeMantissa;
84
+ m |= ieeeOne;
85
+ float f = uintBitsToFloat(m);
86
+ return f - 1.0;
87
+ }
88
+
89
+ float random(inout vec3 v) {
90
+ return floatConstruct(hash(floatBitsToUint(v += 1.0)));
91
+ }
92
+
93
+ vec2 random2(inout vec3 v) {
94
+ return vec2(random(v), random(v));
95
+ }
96
+
97
+ vec3 random3(inout vec3 v) {
98
+ return vec3(random(v), random(v), random(v));
99
+ }
100
+
101
+ vec4 random4(inout vec3 v) {
102
+ return vec4(random(v), random(v), random(v), random(v));
103
+ }
104
+
105
+ float getReflectance(vec3 rgb, int wavelength) {
106
+ if (wavelength < 390 || wavelength > 780) return 0.0;
107
+ wavelength -= 390;
108
+ rgb = srgbToLinear(rgb);
109
+ vec3 coeffs = CIE2006_BASIS_RGB[wavelength];
110
+ return dot(rgb, coeffs);
111
+ }
112
+
113
+ float getEmission(int id, int wavelength) {
114
+ if (id <= 0) return 0.0;
115
+ if (wavelength <= 300 || wavelength >= 780) return 0.0;
116
+ int index = (wavelength - 300) / 5;
117
+ float t = float((wavelength - 300) - index * 5) / 5.0;
118
+ return 10.0 * mix(ILLUMINANT_D65[index], ILLUMINANT_D65[index + 1], t) / 100.0;
119
+ }
120
+
121
+ vec4 getReflectance(vec3 rgb, ivec4 w) {
122
+ return vec4(getReflectance(rgb, w.x), getReflectance(rgb, w.y),
123
+ getReflectance(rgb, w.z), getReflectance(rgb, w.w));
124
+ }
125
+
126
+ vec4 getEmission(int id, ivec4 w) {
127
+ return vec4(getEmission(id, w.x), getEmission(id, w.y),
128
+ getEmission(id, w.z), getEmission(id, w.w));
129
+ }
130
+
131
+ vec3 cosineWeightedHemisphereSample(vec2 rand) {
132
+ float cosTheta = sqrt(rand.x);
133
+ float phi = 2.0 * PI * rand.y;
134
+ float sinTheta = sqrt(1.0 - cosTheta * cosTheta);
135
+ return vec3(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta);
136
+ }
137
+
138
+ vec3 cosineWeightedHemisphereSample(vec2 rand, vec3 n) {
139
+ vec3 p = cosineWeightedHemisphereSample(rand);
140
+ vec3 t = normalize(cross(vec3(0.0, 1.0, 1.0), n));
141
+ return t * p.x + cross(t, n) * p.y + n * p.z;
142
+ }
143
+
144
+ float cosineWeightedHemispherePDF(vec3 sampleDir, vec3 n) {
145
+ return dot(sampleDir, n) / PI;
146
+ }
147
+
148
+ struct ray {
149
+ vec3 origin;
150
+ vec3 direction;
151
+ };
152
+
153
+ ray generateCameraRay(vec2 fragCoord, vec2 resolution, vec3 origin) {
154
+ float aspectRatio = resolution.x / resolution.y;
155
+ vec3 du = vec3(2.0 * aspectRatio, 0.0, 0.0) / resolution.x;
156
+ vec3 dv = vec3(0.0, 2.0, 0.0) / resolution.y;
157
+ vec3 upperLeft = vec3(-aspectRatio, -1.0, 2.8) + du * 0.5 + dv * 0.5;
158
+ vec3 direction = upperLeft + du * fragCoord.x + dv * fragCoord.y;
159
+ return ray(origin, normalize(direction));
160
+ }
161
+
162
+ struct material {
163
+ vec3 reflectance;
164
+ int emission;
165
+ };
166
+
167
+ struct intersection {
168
+ float t;
169
+ vec3 position;
170
+ vec3 normal;
171
+ bool outside;
172
+ material mat;
173
+ };
174
+
175
+ intersection noHit() {
176
+ intersection it;
177
+ it.t = -1.0;
178
+ return it;
179
+ }
180
+
181
+ material emissive(material mat) {
182
+ mat.emission = 1;
183
+ return mat;
184
+ }
185
+
186
+ material diffuse(vec3 reflectance) {
187
+ return material(reflectance, 0);
188
+ }
189
+
190
+ void insert(inout intersection closest, intersection it, material mat) {
191
+ if (it.t < 0.0) return;
192
+ if (closest.t >= 0.0 && closest.t < it.t) return;
193
+ closest = it;
194
+ closest.mat = mat;
195
+ }
196
+
197
+ intersection box(ray wr, vec3 boxPosition, vec3 boxSize, mat3 rotation) {
198
+ ray r = wr;
199
+ r.origin -= boxPosition;
200
+ r.origin = rotation * r.origin;
201
+ r.direction = rotation * r.direction;
202
+ vec3 m = 1.0 / r.direction;
203
+ vec3 n = m * r.origin;
204
+ vec3 k = abs(m) * boxSize;
205
+ vec3 t1 = -n - k;
206
+ vec3 t2 = -n + k;
207
+ float tN = max(max(t1.x, t1.y), t1.z);
208
+ float tF = min(min(t2.x, t2.y), t2.z);
209
+ if (tN > tF || tF < 0.0) return noHit();
210
+ vec3 normal = (tN > 0.0) ? step(vec3(tN), t1) : step(t2, vec3(tF));
211
+ normal *= -sign(r.direction);
212
+
213
+ intersection it;
214
+ it.outside = tN > 0.0;
215
+ it.t = it.outside ? tN : tF;
216
+ it.position = wr.origin + wr.direction * it.t;
217
+ it.normal = normal * rotation;
218
+ return it;
219
+ }
220
+
221
+ struct light_data {
222
+ vec3 center;
223
+ vec3 extent;
224
+ material mat;
225
+ };
226
+
227
+ vec3 samplePointOnLight(light_data light, inout vec3 seed) {
228
+ return light.center + light.extent * (random3(seed) * 2.0 - 1.0);
229
+ }
230
+
231
+ float lightSamplePDF(light_data light) {
232
+ if (light.extent.x == 0.0) return 1.0 / (4.0 * light.extent.y * light.extent.z);
233
+ if (light.extent.z == 0.0) return 1.0 / (4.0 * light.extent.x * light.extent.y);
234
+ return 1.0 / (4.0 * light.extent.x * light.extent.z);
235
+ }
236
+
237
+ light_data cornellBoxLight() {
238
+ light_data light;
239
+ light.center = vec3(278.0, 555.0, 279.5);
240
+ light.extent = vec3(65.0, 0.0, 52.5);
241
+ light.mat = emissive(diffuse(vec3(REFLECTANCE_LIGHT)));
242
+ return light;
243
+ }
244
+
245
+ intersection cornellBox(ray r, light_data light) {
246
+ intersection it = noHit();
247
+
248
+ material diffuseWhite = diffuse(vec3(REFLECTANCE_WHITE));
249
+ material diffuseGreen = diffuse(vec3(REFLECTANCE_GREEN));
250
+ material diffuseRed = diffuse(vec3(REFLECTANCE_RED));
251
+
252
+ const mat3 rotate15 = MAT3_ROTATE_Y(radians(15.0));
253
+ const mat3 rotateN18 = MAT3_ROTATE_Y(radians(-18.0));
254
+
255
+ insert(it, box(r, vec3(277.5, 0.0, 277.5), vec3(277.5, 0.0, 277.5), mat3(1.0)), diffuseWhite);
256
+ insert(it, box(r, vec3(277.5, 555.0, 277.5), vec3(277.5, 0.0, 277.5), mat3(1.0)), diffuseWhite);
257
+ insert(it, box(r, vec3(0.0, 277.5, 277.5), vec3(0.0, 277.5, 277.5), mat3(1.0)), diffuseRed);
258
+ insert(it, box(r, vec3(555.0, 277.5, 277.5), vec3(0.0, 277.5, 277.5), mat3(1.0)), diffuseGreen);
259
+ insert(it, box(r, vec3(277.5, 277.5, 555.0), vec3(277.5, 277.5, 0.0), mat3(1.0)), diffuseWhite);
260
+ insert(it, box(r, light.center, light.extent, mat3(1.0)), light.mat);
261
+
262
+ insert(it, box(r, vec3(190.5, 165.0, 377.5), vec3(82.5, 165.0, 82.5), rotate15), diffuseWhite);
263
+ insert(it, box(r, vec3(370.0, 82.5, 173.0), vec3(82.5), rotateN18), diffuseWhite);
264
+
265
+ return it;
266
+ }
267
+
268
+ intersection rayTrace(ray r, light_data light) {
269
+ return cornellBox(r, light);
270
+ }
271
+
272
+ light_data getLightData() {
273
+ return cornellBoxLight();
274
+ }
275
+
276
+ void main() {
277
+ vec2 fragCoord = vUv * iResolution;
278
+ vec3 seed = vec3(fragCoord / iResolution.xy, iTime + iFrame * 0.001);
279
+
280
+ ray r = generateCameraRay(fragCoord + random2(seed) - 0.5, iResolution.xy, vec3(278.0, 278.0, -1500.0));
281
+ light_data light = getLightData();
282
+
283
+ ivec4 wavelengths = ivec4(random4(seed) * float(WL_MAX - WL_MIN)) + WL_MIN;
284
+
285
+ vec4 L = vec4(0.0);
286
+ vec4 throughput = vec4(1.0);
287
+
288
+ for (int i = 0; i < 10; i++) {
289
+ intersection it = rayTrace(r, light);
290
+ if (it.t < 0.0) break;
291
+
292
+ if (i == 0)
293
+ L += throughput * getEmission(it.mat.emission, wavelengths);
294
+
295
+ vec4 reflectance = getReflectance(it.mat.reflectance, wavelengths);
296
+
297
+ vec3 nextDir = cosineWeightedHemisphereSample(random2(seed), it.normal);
298
+ float pdf = cosineWeightedHemispherePDF(nextDir, it.normal);
299
+ vec4 brdf = reflectance / PI;
300
+
301
+ vec3 pointOnLight = samplePointOnLight(light, seed);
302
+ vec3 directionToLight = normalize(pointOnLight - it.position);
303
+ intersection shadowRay = rayTrace(ray(it.position + it.normal * 0.001, directionToLight), light);
304
+ if (shadowRay.mat.emission > 0) {
305
+ vec4 d_brdf = reflectance / PI;
306
+ float d_pdf = lightSamplePDF(light);
307
+ float P = dot(shadowRay.normal, -directionToLight) / dot(pointOnLight - it.position, pointOnLight - it.position);
308
+ float d_costh = max(0.0, dot(it.normal, directionToLight));
309
+ L += throughput * getEmission(shadowRay.mat.emission, wavelengths) * d_brdf * P * d_costh / d_pdf;
310
+ }
311
+
312
+ float costh = dot(nextDir, it.normal);
313
+ throughput *= (brdf / pdf) * abs(costh);
314
+ r = ray(it.position + it.normal * (sign(costh) * 0.001), nextDir);
315
+ }
316
+
317
+ if (any(isnan(L))) L = vec4(0.0);
318
+ L *= float(WL_MAX - WL_MIN) / 4.0;
319
+
320
+ vec3 L_xyz = (CIE2006_CMF_XYZ[wavelengths.x - WL_MIN] * L.x +
321
+ CIE2006_CMF_XYZ[wavelengths.y - WL_MIN] * L.y +
322
+ CIE2006_CMF_XYZ[wavelengths.z - WL_MIN] * L.z +
323
+ CIE2006_CMF_XYZ[wavelengths.w - WL_MIN] * L.w) / CIE2006_Y_Integral;
324
+
325
+ float frameWeight = 1.0 / (iFrame + 1.0);
326
+ vec3 color = XYZ_TO_RGB * L_xyz;
327
+ color *= 6.0;
328
+ color = 1.0 - exp(-color);
329
+ color = linearToSrgb(color);
330
+
331
+ fragColor = vec4(color, 1.0);
332
+ }
333
+ GLSL
334
+
335
+ scene = Sunrb::Scene.new
336
+ scene.background = Sunrb::Color.new(0x000000)
337
+
338
+ camera = Sunrb::OrthographicCamera.new(
339
+ left: -1, right: 1, top: 1, bottom: -1, near: 0.1, far: 10
340
+ )
341
+ camera.position.z = 1
342
+
343
+ geometry = Sunrb::PlaneGeometry.new(width: 2, height: 2)
344
+
345
+ shader_material = Sunrb::ShaderMaterial.new(
346
+ vertex_shader: VERTEX_SHADER,
347
+ fragment_shader: FRAGMENT_SHADER,
348
+ uniforms: {
349
+ iTime: 0.0,
350
+ iResolution: Sunrb::Vector2.new(800, 600),
351
+ iFrame: 0.0
352
+ }
353
+ )
354
+
355
+ quad = Sunrb::Mesh.new(geometry, shader_material)
356
+ scene.add(quad)
357
+
358
+ puts "=== Cornell Box - Spectral Path Tracer ==="
359
+ puts "Physically-based rendering with CIE 2006 color matching"
360
+ puts "Press ESC to exit"
361
+
362
+ renderer = Sunrb::OpenGLRenderer.new(width: 800, height: 600, title: "Cornell Box - Spectral Path Tracer")
363
+
364
+ time = 0.0
365
+ frame = 0.0
366
+
367
+ renderer.run do |delta|
368
+ time += delta
369
+ frame += 1.0
370
+ shader_material.uniforms[:iTime] = time
371
+ shader_material.uniforms[:iFrame] = frame
372
+ renderer.render(scene, camera)
373
+ end
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Weird Fractal 4
5
+ # Based on https://www.shadertoy.com/view/MtsGzB
6
+
7
+ require_relative "../lib/3rb"
8
+
9
+ VERTEX_SHADER = <<~GLSL
10
+ #version 330 core
11
+
12
+ layout(location = 0) in vec3 position;
13
+ layout(location = 2) in vec2 uv;
14
+
15
+ out vec2 vUv;
16
+
17
+ void main() {
18
+ vUv = uv;
19
+ gl_Position = vec4(position.xy * 2.0, 0.0, 1.0);
20
+ }
21
+ GLSL
22
+
23
+ FRAGMENT_SHADER = <<~GLSL
24
+ #version 330 core
25
+
26
+ in vec2 vUv;
27
+
28
+ uniform float iTime;
29
+ uniform vec2 iResolution;
30
+
31
+ out vec4 fragColor;
32
+
33
+ mat3 getRotYMat(float a) {
34
+ return mat3(
35
+ cos(a), 0.0, sin(a),
36
+ 0.0, 1.0, 0.0,
37
+ -sin(a), 0.0, cos(a)
38
+ );
39
+ }
40
+
41
+ mat3 getRotZMat(float a) {
42
+ return mat3(
43
+ cos(a), -sin(a), 0.0,
44
+ sin(a), cos(a), 0.0,
45
+ 0.0, 0.0, 1.0
46
+ );
47
+ }
48
+
49
+ void main() {
50
+ vec2 fragCoord = vUv * iResolution;
51
+ vec2 s = iResolution.xy;
52
+ float t = iTime * 0.2;
53
+ float c, d, m;
54
+
55
+ vec3 p = vec3((2.0 * fragCoord.xy - s) / s.x, 1.0);
56
+ vec3 r = p - p;
57
+ vec3 q = r;
58
+
59
+ p *= getRotZMat(-t * 0.3);
60
+ p *= getRotYMat(-t);
61
+
62
+ q.zx += 10.0 + vec2(sin(t), cos(t)) * 3.0;
63
+
64
+ for (float i = 1.0; i > 0.0; i -= 0.01) {
65
+ c = 0.0;
66
+ d = 0.0;
67
+ m = 1.0;
68
+
69
+ for (int j = 0; j < 3; j++) {
70
+ r = mod(q * m + 1.0, 2.0) - 1.0;
71
+ r *= r;
72
+ r *= r;
73
+ r *= r;
74
+ r = max(r, r.yzx);
75
+ d = max(d, (0.29 - length(r) * 0.6) / m) * 0.8;
76
+ m *= 1.1;
77
+ }
78
+
79
+ q += p * d;
80
+ c = i;
81
+
82
+ if (d < 1e-5) break;
83
+ }
84
+
85
+ float k = dot(r, r + 0.15);
86
+ vec3 col = vec3(1.0, k, k / c) - 0.8;
87
+
88
+ col = max(col, 0.0);
89
+
90
+ col = pow(col, vec3(0.4545));
91
+
92
+ fragColor = vec4(col, 1.0);
93
+ }
94
+ GLSL
95
+
96
+ scene = Sunrb::Scene.new
97
+ scene.background = Sunrb::Color.new(0x000000)
98
+
99
+ camera = Sunrb::OrthographicCamera.new(
100
+ left: -1, right: 1, top: 1, bottom: -1, near: 0.1, far: 10
101
+ )
102
+ camera.position.z = 1
103
+
104
+ geometry = Sunrb::PlaneGeometry.new(width: 2, height: 2)
105
+
106
+ shader_material = Sunrb::ShaderMaterial.new(
107
+ vertex_shader: VERTEX_SHADER,
108
+ fragment_shader: FRAGMENT_SHADER,
109
+ uniforms: {
110
+ iTime: 0.0,
111
+ iResolution: Sunrb::Vector2.new(800, 600)
112
+ }
113
+ )
114
+
115
+ quad = Sunrb::Mesh.new(geometry, shader_material)
116
+ scene.add(quad)
117
+
118
+ puts "=== Weird Fractal 4 ==="
119
+ puts "Based on shader by coyote"
120
+ puts "Press ESC to exit"
121
+
122
+ renderer = Sunrb::OpenGLRenderer.new(width: 800, height: 600, title: "Weird Fractal 4")
123
+
124
+ time = 0.0
125
+
126
+ renderer.run do |delta|
127
+ time += delta
128
+ shader_material.uniforms[:iTime] = time
129
+ renderer.render(scene, camera)
130
+ end