*/}}
瀏覽代碼

new T matrix values from Briend

YimingWu 1 年之前
父節點
當前提交
792ade4d47
共有 1 個文件被更改,包括 35 次插入29 次删除
  1. 35 29
      ourshader.cpp

+ 35 - 29
ourshader.cpp

@@ -36,39 +36,45 @@ uniform int uBrushErasing;
 const vec4 p1_22=vec4(1.0/2.2,1.0/2.2,1.0/2.2,1.0/2.2);
 const vec4 p22=vec4(2.2,2.2,2.2,2.2);
 const float WGM_EPSILON=0.001f;
-const float T_MATRIX_SMALL[3][10] = {{0.026595621243689,0.049779426257903,0.022449850859496,-0.218453689278271
-,-0.256894883201278,0.445881722194840,0.772365886289756,0.194498761382537
-,0.014038157587820,0.007687264480513}
-,{-0.032601672674412,-0.061021043498478,-0.052490001018404
-,0.206659098273522,0.572496335158169,0.317837248815438,-0.021216624031211
-,-0.019387668756117,-0.001521339050858,-0.000835181622534}
-,{0.339475473216284,0.635401374177222,0.771520797089589,0.113222640692379
-,-0.055251113343776,-0.048222578468680,-0.012966666339586
-,-0.001523814504223,-0.000094718948810,-0.000051604594741}};
-const float spectral_r_small[10] = {0.009281362787953,0.009732627042016,0.011254252737167,0.015105578649573
-,0.024797924177217,0.083622585502406,0.977865045723212,1.000000000000000
-,0.999961046144372,0.999999992756822};
-const float spectral_g_small[10] = {0.002854127435775,0.003917589679914,0.012132151699187,0.748259205918013
-,1.000000000000000,0.865695937531795,0.037477469241101,0.022816789725717
-,0.021747419446456,0.021384940572308};
-const float spectral_b_small[10] = {0.537052150373386,0.546646402401469,0.575501819073983,0.258778829633924
-,0.041709923751716,0.012662638828324,0.007485593127390,0.006766900622462
-,0.006699764779016,0.006676219883241};
-void rgb_to_spectral (vec3 rgb, out float spectral_[10]) {
+const float T_MATRIX_SMALL[3][12] = {{0.016163474652781, 0.001420445523172, -0.054887305841183,
+  -0.065871603913166, -0.205903208273135, -0.062532921841612,
+  0.074959700955855, 0.180474083483825, 0.398778827864023,
+  0.461711312001723, 0.253843485461910, 0.001944673073610},
+ {-0.023482789468200, -0.016937259153745, 0.054365284958976,
+  0.068868972628298, 0.258888405935374, 0.412123548933354,
+  0.280003145201754, 0.029172844285245, -0.016952611829275,
+  -0.028985388398516, -0.016912989806334, -0.000181721110369},
+ {0.451833383178114, 0.622986272902632, 0.020381940564709,
+  0.015460521778453, -0.003629434201241, -0.048676538578416,
+  -0.036229432289079, -0.007323977526407, -0.005984077846982,
+  -0.005755040132913, -0.003041519739360, -0.000016761047877}};
+const float spectral_r_small[12] = {0.021146405259067, 0.000101655202080, 0.398199126291765,
+ 0.001743053489250, 0.000148554860119, 0.000146064594547,
+ 0.000328614570185, 0.910913102591031, 0.916608409655475,
+ 0.700400409331843, 0.657122476831633, 0.142235538434584};
+const float spectral_g_small[12] = {0.147994747800981, 0.000101679918159, 0.496335365339077,
+ 0.882788054089882, 0.964096335484527, 0.978765395560054,
+ 0.985895331330888, 0.076452920947158, 0.080461223658394,
+ 0.296672324245411, 0.339468867320878, 0.139019679306543};
+const float spectral_b_small[12] = {0.831573896245073, 0.998692793883148, 0.105770703333882,
+ 0.112984668836056, 0.037214012464483, 0.022337434144516,
+ 0.015090957392503, 0.010456093241942, 0.002660665934598,
+ 0.002980934458404, 0.002468909304878, 0.716325888182986};
+void rgb_to_spectral (vec3 rgb, out float spectral_[12]) {
     float offset = 1.0 - WGM_EPSILON;
     float r = rgb.r * offset + WGM_EPSILON;
     float g = rgb.g * offset + WGM_EPSILON;
     float b = rgb.b * offset + WGM_EPSILON;
-    float spec_r[10] = {0,0,0,0,0,0,0,0,0,0}; for (int i=0; i < 10; i++) {spec_r[i] = spectral_r_small[i] * r;}
-    float spec_g[10] = {0,0,0,0,0,0,0,0,0,0}; for (int i=0; i < 10; i++) {spec_g[i] = spectral_g_small[i] * g;}
-    float spec_b[10] = {0,0,0,0,0,0,0,0,0,0}; for (int i=0; i < 10; i++) {spec_b[i] = spectral_b_small[i] * b;}
-    for (int i=0; i<10; i++) {spectral_[i] = spec_r[i] + spec_g[i] + spec_b[i];}
+    float spec_r[12] = {0,0,0,0,0,0,0,0,0,0,0,0}; for (int i=0; i < 12; i++) {spec_r[i] = spectral_r_small[i] * r;}
+    float spec_g[12] = {0,0,0,0,0,0,0,0,0,0,0,0}; for (int i=0; i < 12; i++) {spec_g[i] = spectral_g_small[i] * g;}
+    float spec_b[12] = {0,0,0,0,0,0,0,0,0,0,0,0}; for (int i=0; i < 12; i++) {spec_b[i] = spectral_b_small[i] * b;}
+    for (int i=0; i<12; i++) {spectral_[i] = spec_r[i] + spec_g[i] + spec_b[i];}
 }
-vec3 spectral_to_rgb (float spectral[10]) {
+vec3 spectral_to_rgb (float spectral[12]) {
     float offset = 1.0 - WGM_EPSILON;
     // We need this tmp. array to allow auto vectorization. <-- How about on GPU?
     float tmp[3] = {0,0,0};
-    for (int i=0; i<10; i++) {
+    for (int i=0; i<12; i++) {
         tmp[0] += T_MATRIX_SMALL[0][i] * spectral[i];
         tmp[1] += T_MATRIX_SMALL[1][i] * spectral[i];
         tmp[2] += T_MATRIX_SMALL[2][i] * spectral[i];
@@ -84,10 +90,10 @@ subroutine(MixRoutines) vec4 DoMixNormal(vec4 a, vec4 b, float fac_a){
 subroutine(MixRoutines) vec4 DoMixSpectral(vec4 a, vec4 b, float fac_a){
     vec4 result = vec4(0,0,0,0);
     result.a=mix(a.a,b.a,1-fac_a);
-    float spec_a[10] = {0,0,0,0,0,0,0,0,0,0}; rgb_to_spectral(a.rgb, spec_a);
-    float spec_b[10] = {0,0,0,0,0,0,0,0,0,0}; rgb_to_spectral(b.rgb, spec_b);
-    float spectralmix[10] = {0,0,0,0,0,0,0,0,0,0};
-    for (int i=0; i < 10; i++) { spectralmix[i] = pow(spec_a[i], fac_a) * pow(spec_b[i], 1-fac_a); }
+    float spec_a[12] = {0,0,0,0,0,0,0,0,0,0,0,0}; rgb_to_spectral(a.rgb, spec_a);
+    float spec_b[12] = {0,0,0,0,0,0,0,0,0,0,0,0}; rgb_to_spectral(b.rgb, spec_b);
+    float spectralmix[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
+    for (int i=0; i < 12; i++) { spectralmix[i] = pow(spec_a[i], fac_a) * pow(spec_b[i], 1-fac_a); }
     result.rgb=spectral_to_rgb(spectralmix);
     return result;
 }