This commit is contained in:
Uyanide committed 2026-03-27 07:06:16 +01:00
commit 1541961403
340 files changed
+151916

No files matched your search

+147
View File
@@ -0,0 +1,147 @@
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//!DESC RAVU-Lite-AR (step1, r2)
//!HOOK LUMA
//!BIND HOOKED
//!BIND ravu_lite_lut2
//!SAVE ravu_lite_int
//!WHEN HOOKED.w OUTPUT.w / 0.833333 < HOOKED.h OUTPUT.h / 0.833333 < *
//!COMPONENTS 4
vec4 hook() {
vec4 gather0 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(-1, -1), 0);
vec2 gather2 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(-1, 1), 0).wz;
vec2 gather6 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(1, -1), 0).wx;
float luma8 = HOOKED_texOff(vec2(1.0, 1.0)).x;
vec3 abd = vec3(0.0);
float gx, gy;
gx = (gather0.z-gather0.w);
gy = (gather0.x-gather0.w);
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163;
gx = (gather0.y-gather0.x);
gy = (gather2.x-gather0.w)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666;
gx = (gather2.y-gather2.x);
gy = (gather2.x-gather0.x);
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163;
gx = (gather6.x-gather0.w)/2.0;
gy = (gather0.y-gather0.z);
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666;
gx = (gather6.y-gather0.x)/2.0;
gy = (gather2.y-gather0.z)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.13080118386382833;
gx = (luma8-gather2.x)/2.0;
gy = (gather2.y-gather0.y);
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666;
gx = (gather6.x-gather0.z);
gy = (gather6.y-gather6.x);
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163;
gx = (gather6.y-gather0.y);
gy = (luma8-gather6.x)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666;
gx = (luma8-gather2.y);
gy = (luma8-gather6.y);
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163;
float a = abd.x, b = abd.y, d = abd.z;
float T = a + d, D = a * d - b * b;
float delta = sqrt(max(T * T / 4.0 - D, 0.0));
float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta;
float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2);
float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7);
float lambda = sqrtL1;
float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7);
float angle = floor(theta * 24.0 / 3.141592653589793);
float strength = mix(mix(0.0, 1.0, lambda >= 0.004), mix(2.0, 3.0, lambda >= 0.05), lambda >= 0.016);
float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5);
float coord_y = ((angle * 4.0 + strength) * 3.0 + coherence + 0.5) / 288.0;
vec4 res = vec4(0.0), w;
vec4 lo = vec4(0.0), hi = vec4(0.0), lo2 = vec4(0.0), hi2 = vec4(0.0), wg, cg4, cg4_1;
w = texture(ravu_lite_lut2, vec2(0.1, coord_y));
wg = max(vec4(0.0), w);
res += gather0.w * w + luma8 * w.wzyx;
cg4 = vec4(0.1 + gather0.w, 1.1 - gather0.w, 0.1 + luma8, 1.1 - luma8);
cg4_1 = cg4;
cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;
hi += cg4.x * wg + cg4.z * wg.wzyx;
lo += cg4.y * wg + cg4.w * wg.wzyx;
cg4 *= cg4_1;
hi2 += cg4.x * wg + cg4.z * wg.wzyx;
lo2 += cg4.y * wg + cg4.w * wg.wzyx;
w = texture(ravu_lite_lut2, vec2(0.3, coord_y));
wg = max(vec4(0.0), w);
res += gather0.x * w + gather6.y * w.wzyx;
cg4 = vec4(0.1 + gather0.x, 1.1 - gather0.x, 0.1 + gather6.y, 1.1 - gather6.y);
cg4_1 = cg4;
cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;
hi += cg4.x * wg + cg4.z * wg.wzyx;
lo += cg4.y * wg + cg4.w * wg.wzyx;
cg4 *= cg4_1;
hi2 += cg4.x * wg + cg4.z * wg.wzyx;
lo2 += cg4.y * wg + cg4.w * wg.wzyx;
w = texture(ravu_lite_lut2, vec2(0.5, coord_y));
wg = max(vec4(0.0), w);
res += gather2.x * w + gather6.x * w.wzyx;
cg4 = vec4(0.1 + gather2.x, 1.1 - gather2.x, 0.1 + gather6.x, 1.1 - gather6.x);
cg4_1 = cg4;
cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;
hi += cg4.x * wg + cg4.z * wg.wzyx;
lo += cg4.y * wg + cg4.w * wg.wzyx;
cg4 *= cg4_1;
hi2 += cg4.x * wg + cg4.z * wg.wzyx;
lo2 += cg4.y * wg + cg4.w * wg.wzyx;
w = texture(ravu_lite_lut2, vec2(0.7, coord_y));
wg = max(vec4(0.0), w);
res += gather0.z * w + gather2.y * w.wzyx;
cg4 = vec4(0.1 + gather0.z, 1.1 - gather0.z, 0.1 + gather2.y, 1.1 - gather2.y);
cg4_1 = cg4;
cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;
hi += cg4.x * wg + cg4.z * wg.wzyx;
lo += cg4.y * wg + cg4.w * wg.wzyx;
cg4 *= cg4_1;
hi2 += cg4.x * wg + cg4.z * wg.wzyx;
lo2 += cg4.y * wg + cg4.w * wg.wzyx;
w = texture(ravu_lite_lut2, vec2(0.9, coord_y));
wg = max(vec4(0.0), w);
res += gather0.y * w;
vec2 cg2 = vec2(0.1 + gather0.y, 1.1 - gather0.y);
vec2 cg2_1 = cg2;
cg2 *= cg2;cg2 *= cg2;cg2 *= cg2;cg2 *= cg2;cg2 *= cg2;
hi += cg2.x * wg;
lo += cg2.y * wg;
cg2 *= cg2_1;
hi2 += cg2.x * wg;
lo2 += cg2.y * wg;
lo = 1.1 - lo2 / lo;
hi = hi2 / hi - 0.1;
res = mix(res, clamp(res, lo, hi), 0.800000);
return res;
}
//!DESC RAVU-Lite-AR (step2, r2)
//!HOOK LUMA
//!BIND HOOKED
//!BIND ravu_lite_int
//!WIDTH 2 HOOKED.w *
//!HEIGHT 2 HOOKED.h *
//!WHEN HOOKED.w OUTPUT.w / 0.833333 < HOOKED.h OUTPUT.h / 0.833333 < *
//!COMPONENTS 1
vec4 hook() {
vec2 dir = fract(HOOKED_pos * HOOKED_size) - 0.5;
int idx = int(dir.x > 0.0) * 2 + int(dir.y > 0.0);
return vec4(ravu_lite_int_texOff(-dir)[idx], 0.0, 0.0, 0.0);
}
//!TEXTURE ravu_lite_lut2
//!SIZE 5 288
//!FORMAT rgba16f
//!FILTER NEAREST
a7ca113dc4d036bce1a84abc5bea31bbd9a7a13d5919a13dfe79febd3b27febd413532bcfac2123d7d6836bb8f0153bcea82a53d68fc00be04efa43da85201be296f8a3fb56e8a3fb56e8a3f296f8a3fd1f5eb3c034d0cbcc3ae80bc1b27b93b62d5b23de39bb43dda1608bee95607bec937f8bb69aff43cb8e19d3b4ba98bbc1e4ac43db7f50dbe5d40be3d62760fbe8e258a3f803e8a3f803e8a3f8e258a3f37a6c63cb645e0bb44ec7dbc68fd283c06a7b53d411fba3d7f680abe19ca07be6104b73a6a56003da4264e3bedb3c8bc5a2ce93df64d11be0d58c83db04d21be3bbe893fa8c1893fa8c1893f3bbe893f5bc10a3d2d513dbc606aa6bc834b2a3c1dfcc93d18fbc53d5f9b11be400312be1a7834bc1de0143d7606113c3447b5bc8207de3daa0c19bee054d43d58921bbeb2c5893f23fb893f23fb893fb2c5893f1185d73c60cc1fbc3386a8bc091f903c5adccd3dd874c73dbc3313be44c111be7fa92fbbb3cb143dcd97133ce37ef5bce225fc3dc9cc1dbe53b5dc3de6f429beaf65893f73f1893f73f1893faf65893f4d9e973c425f85bcfba620bc11f0c73cb4c2c43d703bbc3d733c0ebe31600cbe361ccc3b86f3393d265edebae9f212bd0882093ef2a609be20f3ae3dae5837bed847893f10088a3f10088a3fd847893f39cb113df3dbe6bba64a05bde2d7813c364ae93dca05df3d87701ebe26211cbed29264bbe284353de61d2f3c5bf524bd92c3143ec15f34bea5ae063e46663cbe5ae6883f059a893f059a893f5ae6883f49e7bb3cfb8d0bbb13f3e7bcee84a83cebcbd43da3fec23ddc5814bef0eb0fbe687a7a3cee154b3d7e6873ba734957bdde60253e07b928be75d1f23dc7904abec389883f08ef893f08ef893fc389883fe53a88bb3492f0bc0436ab3b48f53b3d11a5b43d9623a13d56ab06be80b3febda9e6333dac979f3d113b05bdecff9ebde41e463ebed1d6bd8103603d6bf96cbea974883f8a758a3f8a758a3fa974883f67590a3d58003f3bc4153bbd1414ac3c46e9013e0487ec3d85c32bbeacef24be53e98f3cc7786e3dd8bc873b564d8ebd210b393e57cc41beecd50f3e99305bbe3741883fbd6a8a3fbd6a8a3f3741883fc24a673c84fb293c019bdabc0e71833c0256e83d76eebd3d0afc20be1bf40ebea8cd513de403903de42cebbc30aba9bdc1104a3e3d8f0cbec85fad3d240365be10e4863fccb98b3fccb98b3f10e4863fe6d792bd8d43a7bd7797953d5791d23d4df4b33da1d7603dbe960abec5d9d2bd09be063e625a2a3ecb72f9bdf6bb32be45e7ab3ee0a0e23cb9dab7bd994fb3be074b853f80998d3f80998d3f074b853f723d0e3d683b29bced1c4bbc63960dbb728c9f3d8746a13d5748febd852efdbd338115bcc758123d528a68bb74645cbc6361ae3d9b4403be138aab3dc7ac06be5b828a3f2b4a8a3f2b4a8a3f5b828a3fc322fa3c51b004bcf18384bc1ac48d3b5e3ca63dbaa2ad3de3bd05beac5a00be49f889bbdf1a103d0376e93aaccfb8bc3920d63d44a30bbe1a24b53d715a16bebe078a3ff05f8a3ff05f8a3fbe078a3fbe503f3c240eb2bcb487deba391dcd3c4374983d74eda33dff9dfebd435bf4bdb042f93cc334723d81cad4bc202158bd14c3153e5043fabdbe9b9d3d775b42be6d7a893fc7368a3fc7368a3f6d7a893f85a7003d3ed953bcb76a8dbcaba53e3cb497cc3dabacc33d241013be3ec910be4ac138bcb6e5243d5cdeed3b457cc8bcd1abe73ddc3418beed24cd3d4d5a1dbec290893fed238a3fed238a3fc290893f137a8d3c02c876bc095f4ebc648acc3c3dcad33d4b82c23da7f514be135f10be50b10a3be33b3a3dab493b3bc2451ebdf1a80c3e13c114be9396c03d806e33bea5ec883fd35f8a3fd35f8a3fa5ec883f47b562ba2f7cfbbc401dd63b008a323d7d8cd73d11bebc3da75714be3c240fbe1409843c8f65743d7e2452bc9aa04ebd1c90223eb813f2bd73df863da33d4dbe59ae883ff68a8a3ff68a8a3f59ae883f8e59d83cf5bf1dbccc1fcdbc87f5ab3c4598f73dbf2ed63d555422beb10f1bbe31fd46bb93ff543d4c72f43b18e73abdc466203eb91330bed4b2f53d11bc40be891b883f77618a3f77618a3f891b883f4ef3013ade507bbc0ee006bc7a001b3d2868ea3d1b6db33d21131abed8540cbef550cb3c7bd78f3dca5d6ebc9e5790bd9a47483e334813be43bead3d988d60bec3dc863f8e7a8b3f8e7a8b3fc3dc863fc14f20bdf86f52bd9982173d7aec983dd6a2db3d402b963dec7c13be0af4febdae136a3d0256d23d987a4bbd5ea0cdbdadf9793e5a7b92bd4c4df53bfbb889be7f61863fd54a8c3fd54a8c3f7f61863ff0c5293c2d1fefbb7594c5bc5bce103d9c70103e37cfd73d592c35becfe31fbea117e73c9e93a03d60d3f3bb5a68b7bdbe105c3e98a72cbe56c4d23d4b9d6dbe1716863f61848c3f61848c3f1716863f2689f0bcac974dbcef00763c8401383d5505ff3dba1c5b3d307624bec8c8ddbdc5b39d3dc467f33d4a2b77bdf08302be5a9d943e21e9a2bd0f2704bcdbb590be5367813fb519913fb519913f5367813f9775dfbd227889bd0535dd3d87a7c93d553be93d76f4ecbbcccb1ebeb5aa59bdb677e73dad162e3e2e46debda59d2dbebaaee13e4b85853d7d393cbef562cfbe268c783f02cb963f02cb963f268c783f74be0c3dfeb033bcfbba2ebc72b236bb938d9e3d89e9a23dc71101be990cfabd7a7e26bc4419133d112200bb34fe6abcb374ad3dccb003bef007a63db41c03be9d5c8a3f53758a3f53758a3f9d5c8a3fb657ed3c7adf44bc633a35bc72a7a73bfd1f9e3d1024ac3d126a05bed883f6bd018c9839a7292c3dafe691bb9e0ceebc6e06dd3d0fb40ebe4c3ab83d970718be72088a3f9e628a3f9e628a3f72088a3fbbfa2d3c792cd1bc661d993b7e01c73c5b97b83d4d05af3de4ba10be5c64fcbd31f1243c984b7a3d908fa0bc38aa2fbda68b173e635306be07b1ab3d69e541be6b43893fdb918a3fdb918a3f6b43893fab40f23cd43c63bc232b72bc30ca483cb6b2d03d2536c13d5b2a14be5c8110bea51b44bce4342d3d6c0bd53bb29bcfbc8679ea3dcced15be6485c43d27cb1cbe9b62893f61538a3f61538a3f9b62893f8d71293cfe978ebc4357e1bb24e6ee3c3d55e03d299dbd3d8ed917be01c610be8b649c3a4360513dbdf27f38cc832abd946b143e486e12becef7b23da84d36be3e6e883f14ce8a3f14ce8a3f3e6e883fde1903bc35db01bdbe50353c0bad453d15d2e93dfab4b93d49ec18be6f9c11be0051473ceda7823ddacf59bc052954bd92852d3e8cbef5bd89df7a3ddaa250bea3e5873f19348b3f19348b3fa3e5873fd6d5a13caf174fbc388c9abc007cce3c53c8033e3835d23d7d3e27bedb2a1cbedcbec4bbb8c1653d3f570f3cedb245bda589273e3ee02cbe9183e13d292041bebe6e873f71038b3f71038b3fbe6e873fbced56bce50d94bc79f7bf3a6c4f3b3d2660023Line truncated
+186
View File
@@ -0,0 +1,186 @@
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//!DESC RAVU-Lite-AR (step1, r3)
//!HOOK LUMA
//!BIND HOOKED
//!BIND ravu_lite_lut3
//!SAVE ravu_lite_int
//!WHEN HOOKED.w OUTPUT.w / 0.833333 < HOOKED.h OUTPUT.h / 0.833333 < *
//!COMPONENTS 4
vec4 hook() {
vec4 gather0 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(-2, -2), 0);
vec4 gather2 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(-2, 0), 0);
vec2 gather4 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(-2, 2), 0).wz;
vec4 gather10 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(0, -2), 0);
vec4 gather12 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(0, 0), 0);
vec2 gather14 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(0, 2), 0).wz;
vec2 gather20 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(2, -2), 0).wx;
vec2 gather22 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(2, 0), 0).wx;
float luma24 = HOOKED_texOff(vec2(2.0, 2.0)).x;
vec3 abd = vec3(0.0);
float gx, gy;
gx = (gather10.x-gather0.x)/2.0;
gy = (gather2.z-gather0.z)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163;
gx = (gather12.w-gather2.w)/2.0;
gy = (gather2.y-gather0.y)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666;
gx = (gather12.x-gather2.x)/2.0;
gy = (gather4.y-gather2.z)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163;
gx = (gather10.y-gather0.y)/2.0;
gy = (gather12.w-gather10.w)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666;
gx = (gather12.z-gather2.z)/2.0;
gy = (gather12.x-gather10.x)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.13080118386382833;
gx = (gather12.y-gather2.y)/2.0;
gy = (gather14.x-gather12.w)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666;
gx = (gather20.y-gather10.x)/2.0;
gy = (gather12.z-gather10.z)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163;
gx = (gather22.x-gather12.w)/2.0;
gy = (gather12.y-gather10.y)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666;
gx = (gather22.y-gather12.x)/2.0;
gy = (gather14.y-gather12.z)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163;
float a = abd.x, b = abd.y, d = abd.z;
float T = a + d, D = a * d - b * b;
float delta = sqrt(max(T * T / 4.0 - D, 0.0));
float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta;
float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2);
float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7);
float lambda = sqrtL1;
float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7);
float angle = floor(theta * 24.0 / 3.141592653589793);
float strength = mix(mix(0.0, 1.0, lambda >= 0.004), mix(2.0, 3.0, lambda >= 0.05), lambda >= 0.016);
float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5);
float coord_y = ((angle * 4.0 + strength) * 3.0 + coherence + 0.5) / 288.0;
vec4 res = vec4(0.0), w;
vec4 lo = vec4(0.0), hi = vec4(0.0), lo2 = vec4(0.0), hi2 = vec4(0.0), wg, cg4, cg4_1;
w = texture(ravu_lite_lut3, vec2(0.038461538461538464, coord_y));
res += gather0.w * w + luma24 * w.wzyx;
w = texture(ravu_lite_lut3, vec2(0.11538461538461539, coord_y));
res += gather0.x * w + gather22.y * w.wzyx;
w = texture(ravu_lite_lut3, vec2(0.19230769230769232, coord_y));
wg = max(vec4(0.0), w);
res += gather2.w * w + gather22.x * w.wzyx;
cg4 = vec4(0.1 + gather2.w, 1.1 - gather2.w, 0.1 + gather22.x, 1.1 - gather22.x);
cg4_1 = cg4;
cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;
hi += cg4.x * wg + cg4.z * wg.wzyx;
lo += cg4.y * wg + cg4.w * wg.wzyx;
cg4 *= cg4_1;
hi2 += cg4.x * wg + cg4.z * wg.wzyx;
lo2 += cg4.y * wg + cg4.w * wg.wzyx;
w = texture(ravu_lite_lut3, vec2(0.2692307692307692, coord_y));
res += gather2.x * w + gather20.y * w.wzyx;
w = texture(ravu_lite_lut3, vec2(0.34615384615384615, coord_y));
res += gather4.x * w + gather20.x * w.wzyx;
w = texture(ravu_lite_lut3, vec2(0.4230769230769231, coord_y));
res += gather0.z * w + gather14.y * w.wzyx;
w = texture(ravu_lite_lut3, vec2(0.5, coord_y));
wg = max(vec4(0.0), w);
res += gather0.y * w + gather12.y * w.wzyx;
cg4 = vec4(0.1 + gather0.y, 1.1 - gather0.y, 0.1 + gather12.y, 1.1 - gather12.y);
cg4_1 = cg4;
cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;
hi += cg4.x * wg + cg4.z * wg.wzyx;
lo += cg4.y * wg + cg4.w * wg.wzyx;
cg4 *= cg4_1;
hi2 += cg4.x * wg + cg4.z * wg.wzyx;
lo2 += cg4.y * wg + cg4.w * wg.wzyx;
w = texture(ravu_lite_lut3, vec2(0.5769230769230769, coord_y));
wg = max(vec4(0.0), w);
res += gather2.z * w + gather12.z * w.wzyx;
cg4 = vec4(0.1 + gather2.z, 1.1 - gather2.z, 0.1 + gather12.z, 1.1 - gather12.z);
cg4_1 = cg4;
cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;
hi += cg4.x * wg + cg4.z * wg.wzyx;
lo += cg4.y * wg + cg4.w * wg.wzyx;
cg4 *= cg4_1;
hi2 += cg4.x * wg + cg4.z * wg.wzyx;
lo2 += cg4.y * wg + cg4.w * wg.wzyx;
w = texture(ravu_lite_lut3, vec2(0.6538461538461539, coord_y));
wg = max(vec4(0.0), w);
res += gather2.y * w + gather10.y * w.wzyx;
cg4 = vec4(0.1 + gather2.y, 1.1 - gather2.y, 0.1 + gather10.y, 1.1 - gather10.y);
cg4_1 = cg4;
cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;
hi += cg4.x * wg + cg4.z * wg.wzyx;
lo += cg4.y * wg + cg4.w * wg.wzyx;
cg4 *= cg4_1;
hi2 += cg4.x * wg + cg4.z * wg.wzyx;
lo2 += cg4.y * wg + cg4.w * wg.wzyx;
w = texture(ravu_lite_lut3, vec2(0.7307692307692307, coord_y));
res += gather4.y * w + gather10.z * w.wzyx;
w = texture(ravu_lite_lut3, vec2(0.8076923076923077, coord_y));
wg = max(vec4(0.0), w);
res += gather10.w * w + gather14.x * w.wzyx;
cg4 = vec4(0.1 + gather10.w, 1.1 - gather10.w, 0.1 + gather14.x, 1.1 - gather14.x);
cg4_1 = cg4;
cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;
hi += cg4.x * wg + cg4.z * wg.wzyx;
lo += cg4.y * wg + cg4.w * wg.wzyx;
cg4 *= cg4_1;
hi2 += cg4.x * wg + cg4.z * wg.wzyx;
lo2 += cg4.y * wg + cg4.w * wg.wzyx;
w = texture(ravu_lite_lut3, vec2(0.8846153846153846, coord_y));
wg = max(vec4(0.0), w);
res += gather10.x * w + gather12.x * w.wzyx;
cg4 = vec4(0.1 + gather10.x, 1.1 - gather10.x, 0.1 + gather12.x, 1.1 - gather12.x);
cg4_1 = cg4;
cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;
hi += cg4.x * wg + cg4.z * wg.wzyx;
lo += cg4.y * wg + cg4.w * wg.wzyx;
cg4 *= cg4_1;
hi2 += cg4.x * wg + cg4.z * wg.wzyx;
lo2 += cg4.y * wg + cg4.w * wg.wzyx;
w = texture(ravu_lite_lut3, vec2(0.9615384615384616, coord_y));
wg = max(vec4(0.0), w);
res += gather12.w * w;
vec2 cg2 = vec2(0.1 + gather12.w, 1.1 - gather12.w);
vec2 cg2_1 = cg2;
cg2 *= cg2;cg2 *= cg2;cg2 *= cg2;cg2 *= cg2;cg2 *= cg2;
hi += cg2.x * wg;
lo += cg2.y * wg;
cg2 *= cg2_1;
hi2 += cg2.x * wg;
lo2 += cg2.y * wg;
lo = 1.1 - lo2 / lo;
hi = hi2 / hi - 0.1;
res = mix(res, clamp(res, lo, hi), 0.800000);
return res;
}
//!DESC RAVU-Lite-AR (step2, r3)
//!HOOK LUMA
//!BIND HOOKED
//!BIND ravu_lite_int
//!WIDTH 2 HOOKED.w *
//!HEIGHT 2 HOOKED.h *
//!WHEN HOOKED.w OUTPUT.w / 0.833333 < HOOKED.h OUTPUT.h / 0.833333 < *
//!COMPONENTS 1
vec4 hook() {
vec2 dir = fract(HOOKED_pos * HOOKED_size) - 0.5;
int idx = int(dir.x > 0.0) * 2 + int(dir.y > 0.0);
return vec4(ravu_lite_int_texOff(-dir)[idx], 0.0, 0.0, 0.0);
}
//!TEXTURE ravu_lite_lut3
//!SIZE 13 288
//!FORMAT rgba16f
//!FILTER NEAREST
d8b8c339ab9780b831e9aeb810cfa4b91782da3922bf67bb9bb1603b7ef86639ce52373bc9b3333bfcd11f3b3ce91e3b433e6abbe7c23b3a81956338ac065b3b5b5927b96c56eb39fcccb5b9258016b88813bd3a9a38793b0a1b86bbdce729ba413b023db08e35bc244447bc10cbbebb5a82a03d19ef9f3d870d01bef04801bea69d32bcaae7013d5bedbabb04684bbc2963753b9033d23a4e0d35ba8b5189bbeb70633b13fbff3af286483b8daafc3a61529f3deca800bed2069f3d42de00be63808a3f00768a3f00768a3f63808a3f2cbb89b9b94a943808a23f3912d006b9e769fdba382898bb9baab43bc1d6e63acbc024ba354748ba73f9b63b2f83c73bf7b193bb8e41dfba5597df3a7705aa3b396ca638bae278b826b988b920400a398ccb243b89cec33b4f38b5bb77080ebbc7af1a3d282424bca8ef71bc4f5f1fbc789aab3d1b39ab3d9e7306bef86a06be863223bcbef41c3d6e2224bc597579bcec85e13ba92d293bc44a33bbcf41c5bb6852d93a30089e3b5dc2113aa159533be002a93d15cd04beb6fca63dc22c06be58668a3f5e5f8a3f5e5f8a3f58668a3fe65bc9b9c883b338dec198b9c4a7ce39bca248bba70b9fbb49cccf3bead31b3b9057b2bb5f31b9bb6e61123c4259163c3830cabb5b016dbb0926723bf882ec3bdce743b9e717feb96f630e3aac3a5eb778eeef395decc93b1f2fafbb8e6a38b96aa03c3d70ce0dbcc9cf67bc172f8cbc8ac9b53d9bc2b33d5da90abe0d3609bef0118abbee34493d6377adbc8b3798bcc3c8163ca0f9693b380e76bba6dc09bc8eea68ba4d9d1b3cb7b8c3bb69f9853be624c33d5b1c0bbe14e4b33d47a712be72178a3f7b738a3f7b738a3f72178a3ff6df70b625f7cab86ccf24b8709bbeb963887ebbb7a698bb6216fd3b31b97d3aa65c1cbcef8b3dbc17488c3c6a6c833c9a9cc7bb47fc56bb54df353af38e113cd957f439f6ef87b9f18fdeb9efad54b929d91fbb35541a3c18bdc8bb6c3c6aba9f20233dc6ce95bc6e4daabcbca2553b7d28f03dbfb6e93d6cce25bec14d26bec00496bc5a5b333dfe7d1c3a4149b7bc90001c3ce0a124bb087e86b9df88debb400f28bcfb71903c487a36bc90fa8a3cc2e7f93d3f8b2abecda0f03ded502cbeb4ce893feb268a3feb268a3fb4ce893f6e189d39fd806bb9cba1823950473eba19af8fbb7be605bb9e3ca23b3d32b63a150d27bcb7842fbc9cad863c01957e3cf64a94bb7fd9a0bb000b293be704e93b08a97c37cc7ac4b97fe67bb9fc2ca2390f725abb95cf123cf298aebba94179b9115f1e3d18b8a0bcc96d9fbc63e5a93b9954e93db81ede3dd4b020beb44b20be6ba875bcabfe3e3d29a11bbbe908d0bcdfb14c3c1d01873aa9a572bb0fa023bce7c8e7bbcc6ea83c267d6cbcc2e9633cd7ef033e11242abedd92ed3d533d33befb90893f84528a3f84528a3ffb90893fe8da2d3a4051b93973b400ba223159ba2c4392bb1a260abb47046d3b3868483b562de3bb94bfdfbbb728393c65ea213ced3cb9bbc258c4bb9430a83bbf97f43bdf15cd38e8f8afb956021b3988a899b80b1eeabb0ab5bd3aa0576f3a5d10cb3bec3a163d07de96bc979574bc0b70473b38bace3d48fbc13d3ae112be42cd10be27aeb4bb465e543d4b3b48bc0bc0f1bc7b3ca23cc6063e3cb39355bcef5997bcc0c0453c4b6ce33c5295b5bc723ef5bbde29fc3d9b3c19bebc17ca3da79e2ebe5c99893feb818a3feb818a3f5c99893fde5d30ba1d7c27b9cf2f07b84aeb3238c6ca9dba2e7611bb3c84dd3b6fb368bbf3f3c2bcd0cfb7bc3a7cf63c184bf33c0a9152bbf3064dbb6631dbba6e11053c0dfd20b9891360baa00ebeb80e547d3922ec99b9047a373c7857aabb2127cabb12d9fd3c7ba1ccbc627bb6bccc24a53c0265173e7e9a0e3e44c841bea9d140be3ed2ccbca2ea283dc69c5a3ca16dd7bc032e533c35481cbac2e5adbb8596f0bbc746cabcf3ec083d349fd7bcb81d043daa3a223e1a2549be7d01163e887e4dbe790d893fd3208a3fd3208a3f790d893ff3d5e7397269b4babb60763a03e90fbacf96e9baf0e1073bdafd033b4e7a2dbbc05489bc9e6184bc92bdbd3cc68cb03c6e9ebcba759d88bbc65e13b9c60bc83b880103bb0bd5c3ba531d753ae9b50b3bf3e917baeacb1d3c18495fbb1791d3bba440b33c788ad4bcbf158cbcafecd03cc0a0073eaf9af03d29612dbe253d2cbe79da9ebc78e9343d4295073c7794fabc6e2b9f3c8184d03bd31455bc803562bce78194bc9cce223d2c5f04bdd9dccc3cbf322d3e449f44bec0c50e3e93bb55be7aa1883f5f868a3f5f868a3f7aa1883f1f58c237b333bfbaaecab33a287a30b9a86ae63767c05c3b8f4f10bb7fd1b5ba6b5df6bb0cab03bcff504b3ccbd3293cb11d36ba65018cbade4d823a289ed73a3ccc99bbdcb99ebbc2528d3bcec8b73bbcc07fbc44add7bb6a2f313cf03e4e3ca76f533b388d20bd217cb73bb9be143d2993da3d49b2c23d96a914be6e4310bef8ee59bbc36e383d884de1bbc2db08bd4bf9443d406d293d2b8e2fbd3ff74abdfa88103d9fc28e3d5f3b87bd0c29d9bc3de42f3e20761ebe8da3d83d1f1f5ebe71d5883fc6a88a3fc6a88a3f71d5883f0104f13909470ebbacb30d3a86685fb802fe6bbbab842d3b1f9afa3b19dce8bb719514bd32b60dbde74f313debf1313dfb2f1db9af89f1bb5b7c28bbe44d273c79c122bbdafa18ba7b5cab368e17f33a4499abbaa162633c97a411bb41492ebc0f0fef3c8e01e4bc7febfabcac75073d70972e3ef6681f3e646156bee0f255be3821debc78c0433d4d5ea93c2e2e1dbdc4c98f3cbab947bbda6412bc1165b9bb593916bd0e57393d5b7614bdb829323d9d523a3e01275bbe623c253e410b62bee6a0883fd65a8a3fd65a8a3fe6a0883f5ad4083ac72e1dbb34718739f31693390ccbedba18457c3b60778d3bec01dabb0d9eedbc40bdc2bc0f490d3d7922093dc2e37fb9f05218bce381b63acc65163c07a9c6bb12269cbb55d6673b49bcce3b3001673b35524e3ca25316bb90166bbc78204f3cacf2debc829ca1bca8471b3dc1ca133eb175fb3d0d8438be164634bec3edfcbb87425d3dc5af4f3b760447bd79cedb3c25815d3c3f32babcca7d95bce928c8bc70bb413da0aa26bd7e56003d39d6463ed14847be5a66103e48226bbe14fa873fd1ef8a3fd1ef8a3f14fa873fd188593b14a6f33a086189bbf96713bb512a013cd4381b3cc8a9d5bb40b546bcf31715bc4e0ca8bb369c4e3cfbb6403c7cc809b9b6e264bb742a033b4429553b3c36fabc7eb7f0bc12dbfd3c994f043d30113ebde55b22bd7ebe4d3da861233deb362bbdab4e92bd40f1163d6adaab3d1c4add3d5475ae3dc3c112bed40b0abe9265eb3c344a993dbb1611bd2d6894bdf89dea3df445d93dbb22e8bd5209eabd4389ca3d91921a3ec2a419be9b04b8bd45a2843ec9ddd5bd1426623df58c98bef6b2873fa4878b3fa4878b3ff6b2873f8b8a88bLine truncated
+265
View File
@@ -0,0 +1,265 @@
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//!DESC RAVU-Lite-AR (step1, r4)
//!HOOK LUMA
//!BIND HOOKED
//!BIND ravu_lite_lut4
//!SAVE ravu_lite_int
//!WHEN HOOKED.w OUTPUT.w / 0.833333 < HOOKED.h OUTPUT.h / 0.833333 < *
//!COMPONENTS 4
vec4 hook() {
vec4 gather0 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(-3, -3), 0);
vec4 gather2 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(-3, -1), 0);
vec4 gather4 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(-3, 1), 0);
vec2 gather6 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(-3, 3), 0).wz;
vec4 gather14 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(-1, -3), 0);
vec4 gather16 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(-1, -1), 0);
vec4 gather18 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(-1, 1), 0);
vec2 gather20 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(-1, 3), 0).wz;
vec4 gather28 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(1, -3), 0);
vec4 gather30 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(1, -1), 0);
vec4 gather32 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(1, 1), 0);
vec2 gather34 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(1, 3), 0).wz;
vec2 gather42 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(3, -3), 0).wx;
vec2 gather44 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(3, -1), 0).wx;
vec2 gather46 = HOOKED_mul * textureGatherOffset(HOOKED_raw, HOOKED_pos, ivec2(3, 1), 0).wx;
float luma48 = HOOKED_texOff(vec2(3.0, 3.0)).x;
vec3 abd = vec3(0.0);
float gx, gy;
gx = (gather14.x-gather0.x)/2.0;
gy = (gather2.z-gather0.z)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437;
gx = (gather16.w-gather2.w)/2.0;
gy = (gather2.y-gather0.y)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346;
gx = (gather16.x-gather2.x)/2.0;
gy = (gather4.z-gather2.z)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906;
gx = (gather18.w-gather4.w)/2.0;
gy = (gather4.y-gather2.y)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346;
gx = (gather18.x-gather4.x)/2.0;
gy = (gather6.y-gather4.z)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437;
gx = (gather14.y-gather0.y)/2.0;
gy = (gather16.w-gather14.w)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346;
gx = (gather16.z-gather2.z)/2.0;
gy = (gather16.x-gather14.x)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137;
gx = (gather16.y-gather2.y)/2.0;
gy = (gather18.w-gather16.w)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466;
gx = (gather18.z-gather4.z)/2.0;
gy = (gather18.x-gather16.x)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137;
gx = (gather18.y-gather4.y)/2.0;
gy = (gather20.x-gather18.w)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346;
gx = (gather28.x-gather14.x)/2.0;
gy = (gather16.z-gather14.z)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906;
gx = (gather30.w-gather16.w)/2.0;
gy = (gather16.y-gather14.y)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466;
gx = (gather30.x-gather16.x)/2.0;
gy = (gather18.z-gather16.z)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06319146241026467;
gx = (gather32.w-gather18.w)/2.0;
gy = (gather18.y-gather16.y)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466;
gx = (gather32.x-gather18.x)/2.0;
gy = (gather20.y-gather18.z)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906;
gx = (gather28.y-gather14.y)/2.0;
gy = (gather30.w-gather28.w)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346;
gx = (gather30.z-gather16.z)/2.0;
gy = (gather30.x-gather28.x)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137;
gx = (gather30.y-gather16.y)/2.0;
gy = (gather32.w-gather30.w)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466;
gx = (gather32.z-gather18.z)/2.0;
gy = (gather32.x-gather30.x)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137;
gx = (gather32.y-gather18.y)/2.0;
gy = (gather34.x-gather32.w)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346;
gx = (gather42.y-gather28.x)/2.0;
gy = (gather30.z-gather28.z)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437;
gx = (gather44.x-gather30.w)/2.0;
gy = (gather30.y-gather28.y)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346;
gx = (gather44.y-gather30.x)/2.0;
gy = (gather32.z-gather30.z)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906;
gx = (gather46.x-gather32.w)/2.0;
gy = (gather32.y-gather30.y)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346;
gx = (gather46.y-gather32.x)/2.0;
gy = (gather34.y-gather32.z)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437;
float a = abd.x, b = abd.y, d = abd.z;
float T = a + d, D = a * d - b * b;
float delta = sqrt(max(T * T / 4.0 - D, 0.0));
float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta;
float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2);
float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7);
float lambda = sqrtL1;
float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7);
float angle = floor(theta * 24.0 / 3.141592653589793);
float strength = mix(mix(0.0, 1.0, lambda >= 0.004), mix(2.0, 3.0, lambda >= 0.05), lambda >= 0.016);
float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5);
float coord_y = ((angle * 4.0 + strength) * 3.0 + coherence + 0.5) / 288.0;
vec4 res = vec4(0.0), w;
vec4 lo = vec4(0.0), hi = vec4(0.0), lo2 = vec4(0.0), hi2 = vec4(0.0), wg, cg4, cg4_1;
w = texture(ravu_lite_lut4, vec2(0.02, coord_y));
res += gather0.w * w + luma48 * w.wzyx;
w = texture(ravu_lite_lut4, vec2(0.06, coord_y));
res += gather0.x * w + gather46.y * w.wzyx;
w = texture(ravu_lite_lut4, vec2(0.1, coord_y));
res += gather2.w * w + gather46.x * w.wzyx;
w = texture(ravu_lite_lut4, vec2(0.14, coord_y));
res += gather2.x * w + gather44.y * w.wzyx;
w = texture(ravu_lite_lut4, vec2(0.18, coord_y));
res += gather4.w * w + gather44.x * w.wzyx;
w = texture(ravu_lite_lut4, vec2(0.22, coord_y));
res += gather4.x * w + gather42.y * w.wzyx;
w = texture(ravu_lite_lut4, vec2(0.26, coord_y));
res += gather6.x * w + gather42.x * w.wzyx;
w = texture(ravu_lite_lut4, vec2(0.3, coord_y));
res += gather0.z * w + gather34.y * w.wzyx;
w = texture(ravu_lite_lut4, vec2(0.34, coord_y));
res += gather0.y * w + gather32.y * w.wzyx;
w = texture(ravu_lite_lut4, vec2(0.38, coord_y));
res += gather2.z * w + gather32.z * w.wzyx;
w = texture(ravu_lite_lut4, vec2(0.42, coord_y));
wg = max(vec4(0.0), w);
res += gather2.y * w + gather30.y * w.wzyx;
cg4 = vec4(0.1 + gather2.y, 1.1 - gather2.y, 0.1 + gather30.y, 1.1 - gather30.y);
cg4_1 = cg4;
cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;
hi += cg4.x * wg + cg4.z * wg.wzyx;
lo += cg4.y * wg + cg4.w * wg.wzyx;
cg4 *= cg4_1;
hi2 += cg4.x * wg + cg4.z * wg.wzyx;
lo2 += cg4.y * wg + cg4.w * wg.wzyx;
w = texture(ravu_lite_lut4, vec2(0.46, coord_y));
res += gather4.z * w + gather30.z * w.wzyx;
w = texture(ravu_lite_lut4, vec2(0.5, coord_y));
res += gather4.y * w + gather28.y * w.wzyx;
w = texture(ravu_lite_lut4, vec2(0.54, coord_y));
res += gather6.y * w + gather28.z * w.wzyx;
w = texture(ravu_lite_lut4, vec2(0.58, coord_y));
res += gather14.w * w + gather34.x * w.wzyx;
w = texture(ravu_lite_lut4, vec2(0.62, coord_y));
res += gather14.x * w + gather32.x * w.wzyx;
w = texture(ravu_lite_lut4, vec2(0.66, coord_y));
wg = max(vec4(0.0), w);
res += gather16.w * w + gather32.w * w.wzyx;
cg4 = vec4(0.1 + gather16.w, 1.1 - gather16.w, 0.1 + gather32.w, 1.1 - gather32.w);
cg4_1 = cg4;
cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;
hi += cg4.x * wg + cg4.z * wg.wzyx;
lo += cg4.y * wg + cg4.w * wg.wzyx;
cg4 *= cg4_1;
hi2 += cg4.x * wg + cg4.z * wg.wzyx;
lo2 += cg4.y * wg + cg4.w * wg.wzyx;
w = texture(ravu_lite_lut4, vec2(0.7, coord_y));
wg = max(vec4(0.0), w);
res += gather16.x * w + gather30.x * w.wzyx;
cg4 = vec4(0.1 + gather16.x, 1.1 - gather16.x, 0.1 + gather30.x, 1.1 - gather30.x);
cg4_1 = cg4;
cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;
hi += cg4.x * wg + cg4.z * wg.wzyx;
lo += cg4.y * wg + cg4.w * wg.wzyx;
cg4 *= cg4_1;
hi2 += cg4.x * wg + cg4.z * wg.wzyx;
lo2 += cg4.y * wg + cg4.w * wg.wzyx;
w = texture(ravu_lite_lut4, vec2(0.74, coord_y));
wg = max(vec4(0.0), w);
res += gather18.w * w + gather30.w * w.wzyx;
cg4 = vec4(0.1 + gather18.w, 1.1 - gather18.w, 0.1 + gather30.w, 1.1 - gather30.w);
cg4_1 = cg4;
cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;
hi += cg4.x * wg + cg4.z * wg.wzyx;
lo += cg4.y * wg + cg4.w * wg.wzyx;
cg4 *= cg4_1;
hi2 += cg4.x * wg + cg4.z * wg.wzyx;
lo2 += cg4.y * wg + cg4.w * wg.wzyx;
w = texture(ravu_lite_lut4, vec2(0.78, coord_y));
res += gather18.x * w + gather28.x * w.wzyx;
w = texture(ravu_lite_lut4, vec2(0.82, coord_y));
res += gather20.x * w + gather28.w * w.wzyx;
w = texture(ravu_lite_lut4, vec2(0.86, coord_y));
res += gather14.z * w + gather20.y * w.wzyx;
w = texture(ravu_lite_lut4, vec2(0.9, coord_y));
wg = max(vec4(0.0), w);
res += gather14.y * w + gather18.y * w.wzyx;
cg4 = vec4(0.1 + gather14.y, 1.1 - gather14.y, 0.1 + gather18.y, 1.1 - gather18.y);
cg4_1 = cg4;
cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;
hi += cg4.x * wg + cg4.z * wg.wzyx;
lo += cg4.y * wg + cg4.w * wg.wzyx;
cg4 *= cg4_1;
hi2 += cg4.x * wg + cg4.z * wg.wzyx;
lo2 += cg4.y * wg + cg4.w * wg.wzyx;
w = texture(ravu_lite_lut4, vec2(0.94, coord_y));
wg = max(vec4(0.0), w);
res += gather16.z * w + gather18.z * w.wzyx;
cg4 = vec4(0.1 + gather16.z, 1.1 - gather16.z, 0.1 + gather18.z, 1.1 - gather18.z);
cg4_1 = cg4;
cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;cg4 *= cg4;
hi += cg4.x * wg + cg4.z * wg.wzyx;
lo += cg4.y * wg + cg4.w * wg.wzyx;
cg4 *= cg4_1;
hi2 += cg4.x * wg + cg4.z * wg.wzyx;
lo2 += cg4.y * wg + cg4.w * wg.wzyx;
w = texture(ravu_lite_lut4, vec2(0.98, coord_y));
wg = max(vec4(0.0), w);
res += gather16.y * w;
vec2 cg2 = vec2(0.1 + gather16.y, 1.1 - gather16.y);
vec2 cg2_1 = cg2;
cg2 *= cg2;cg2 *= cg2;cg2 *= cg2;cg2 *= cg2;cg2 *= cg2;
hi += cg2.x * wg;
lo += cg2.y * wg;
cg2 *= cg2_1;
hi2 += cg2.x * wg;
lo2 += cg2.y * wg;
lo = 1.1 - lo2 / lo;
hi = hi2 / hi - 0.1;
res = mix(res, clamp(res, lo, hi), 0.800000);
return res;
}
//!DESC RAVU-Lite-AR (step2, r4)
//!HOOK LUMA
//!BIND HOOKED
//!BIND ravu_lite_int
//!WIDTH 2 HOOKED.w *
//!HEIGHT 2 HOOKED.h *
//!WHEN HOOKED.w OUTPUT.w / 0.833333 < HOOKED.h OUTPUT.h / 0.833333 < *
//!COMPONENTS 1
vec4 hook() {
vec2 dir = fract(HOOKED_pos * HOOKED_size) - 0.5;
int idx = int(dir.x > 0.0) * 2 + int(dir.y > 0.0);
return vec4(ravu_lite_int_texOff(-dir)[idx], 0.0, 0.0, 0.0);
}
//!TEXTURE ravu_lite_lut4
//!SIZE 25 288
//!FORMAT rgba16f
//!FILTER NEAREST
cdd62e37a650b737dd8719b950a8d038d9d96c39bbdc73bafb218d3ad9d79fb95340343ae847f4b99d82a739465c3cbaa8950cbae80da6b9031f4e393097ca39a6660dba43f5453ae07d30bad92c9739ede35fba28a8c2393f0a68b934474c3a05420ab82f19183630e50839a60dd2b8b6ac35394a30273a9ba72cba84c30ab80a59c93a684edeb86f99f5b8b5d887ba3a7f6d397fd63ebba945253b628d633a4d86873b7abe803b80fab83ae447943ae2a33bbbb06a823963e2323a6ce62c3b94e797b80077c53a5cb68cbad42f88b8af334f3a2d613d398aabe3b8e83745ba3344a03a331b3b3a88de74ba3a8a94bacb1d8e3a17c9373baab65bbbdfaaec3890ccff3c64552ebc183348bca30cc3bb2b819a3d84459a3db42dfdbdd1a0fcbdd6172dbcce6cff3c0379c0bb81ae49bc9d8c353bfbfd9d3a0a7178b848105bbbee67413a6265a63a55629dbaaf1778ba3ae50db993168139f162d8b97eb5e4b72e56983be64a5e3ab7aa933bbfe6053addc9993d2f3ffcbdd31b993d072afcbd397e8a3fbc8a8a3fbc8a8a3f397e8a3f6fdc0b3812cb0e39ad3277b8cd9905b96880cbb9642dfc39e4701cb9d3eeb33851d9003bd1096bba8ac8253a10a206bb296de7b99462b5b60aaeaeb9fcb63fb9883df5b9ab10f53a65160fbb9aead83962bb19b9092cc4b93155ee391e29a2384a388a3960eec7380eeedab818528db936fd00bb618ca0baccf97b3a2273163b9ce631bba6435aba809fc23a51ad2a3b025ed2baf54802bc45f70e3ca569103b988f95bac660bcba6f21d63b4a45de3b59c408bcd55108bbd698313b0763173cecab2cbae12e18bba8ba1f3b27b0a03a6681d2bae31b12bb9aaf153bbcfde33a9eee563b34525f3b3a5c55bb0ef95abb81983a3b5c09ef3be90ff4bb3185acba2c67383d932414bc3e4b94bcc2796fbc11cfaf3d92aeab3d43ec07be765808bec7fe00bcd9fa3e3d410484bc5235a0bc5bfa183cb66c723b18b54abb6e3011bcc4df923bdcb9b03b09dca2bbb3dca3bb47064e3a2ec78b3a609c07bb57e38fbaa8916a3b7c0ca33b7ef2533a4dde8f3ac546af3d1d4607bedf76aa3dd98d09bef64c8a3f3e7e8a3f3e7e8a3ff64c8a3f994c47394bd9a6b864912a3633c7d3b8d606fbb900f2943ab01d87ba0e08a439cb2b2b3bf0f1d9b916c265398e2b28bbf1e6423a671eda3a4765f9ba725bbcba8ca253bac1d92d3b6b5a19bbd4bb90398488003b9a123fba1785fd371b75b8ba923477b8eb269339fe4c21b9d6da76b8b16902bbd1b084ba9ed2f23a292a843a2e4ae7bb87c72a39f6a6ac3a955bcd3b8440cd398f2f64bc8235753c07df29b92c11adbb121cdebb4e85263c1878323ce16880bce93b2b3a138f623a3d23833ca93da1ba2a9020bc9513173c8bcd523bd98c26bbb2ee1dbb67e90d3b1ea43b3b8709533be7199b3afddcfeba9c4f07bb63c3723ba4303f3cbcb846bcb669b2ba9381473d6f3806bc241785bc1767a2bcd689ac3dbb2cad3db19f07be614707be0fb205bb4a445b3dae94d8bc8d33afbcfc5ca93c2b6a453c721625bce8e2b1bc230ab13beaf8dc3bf14dd2bb344dbcbb7c31733bdc16f33af8db28bb7d4a90bb5c106c3b791e6a3cee2b1bbc05db1e3ace83c23d966309be6ca8ae3d962b13be45318a3f97848a3f97848a3f45318a3fc5593cbaf82a9cb86fc2973916d7f239fdcf433a23e317ba68d30b39db6088b9d1f8a0b936b85bbaf5aae739ec4724397203fc394c6ec439c514b7baaefd35baf30111b963ad5e384536073990b92cba6e663dbaa894493a438d08baf501ee3920df5b39907902ba4446f639049e83b959b5dbbadc22c438dceab0b813f2f13a68e76bba97207839ebafaf3a375bb8b91dba8fbb9ad294bbfde5ef3b034e243bbb3e05bca9be03bcb157713cbcd5713c0b44c0bb1a18a9bbd940553b6ef2113cea6982391b57cfbabcb6f139eccaa93af5138bba522d06bba45afb3a9f3bc43a5921623b568ee03a5d750fbb41e551bb2dbd82bb2b1ad63b39ff83bb43dc183b0dbe263d01aa81bc176cbbbc37d7b03ae992eb3d1e5ae23d966224be264f23beb1ce80bcc60b3e3d159e06bbb7ecd2bcd3220f3cd0ce29bbbd85933a424ed4bbfc7a5a3bbc379c3b680085bbf40b90bb7abb3f39e835433a480423bbfcda57ba5371e1bbc4f4833cc6940cbc1caa643c4367fe3d4d532bbee08ef03dc2472ebe41c0893f144e8a3f144e8a3f41c0893f0fbc27baccaf9e3699825b3ac8724cb92eadff3ac7c50d3a274bf4baada420ba5a9cfdbaafcfbdbab6ed093b46e18b3a7168043b616eef3a376c3fbbce4d0cbbd81fd6b9a7ce62ba1e723b391caa273ac3cea2395fd10f3ba8da50baa70eefbac80d093a9baf0aba30c7c8b9c2c1a63984fe63ba9e2821b8c9a9faba23dc343bf39299ba76560cbb234bad3b121709bb880d96bbd1ce42babfd2123bdf17653b90be0dbc42e514bc21b38b3c906b5d3cf5dcd6bb989eb4bbf261a63b4af3073c40b01fbb4343d0bb1377203b6bf4e03b468097bb2ab88ebbcf77cf3b53b5513b9f5d4f3ab9de75ba8196213b1d51f3bad1ea02bc1780d93b324496bb8dafe93b538c263d89dc98bcbca5a6bc46e42d3b7c56e93d887fd83d104a22be270d1fbed3a635bc444c593d2e5defbb30b801bdf49f813ca4cb7e3a642e49bb5fc257bc039b1a3cb7725b3c834f50bcff382cbc03b2e33b3cc9e43b905a2bbcbd25ccbb62deaeba8166b13c70124ebcd9fdd83ba089063e824f28be7c55e63d0d7934be7372893f659f8a3f659f8a3f7372893fb48a14b8f6bc93b9ac8b5f3908e6113909083fb9aa93233a645aebb9d8dc01389c95173a90dc60ba8772153ac2d3c2b992b6663962bc853a3a17abba1f1914babd60523a166a433a8f3780ba83a981baf3ed0b3a34f90d3a985217ba1a9f2ebab37748391a14f9386d9d2eb90bfc2bb9b989ea3afac0183b5a4e24bb9cc320bb4dd0ca392920453b41783bbb7038cfba2a2d6cba26f72abb9553a83bb5b4acba70d395bb620382bb8f33273c2eb4163ca15f21bc1f37dfbbcb0fd63bc539433c665be9bb9f5929bca4591e3c7c98133c522431bc196136bca3a43b3c4b37413c0acd46bccf3e52bc433f623ce6e45b3ca7ab6cbc6ac262bbb47b9a3b877f823c92f31b3d8b6aa6bc1d635ebc54e3653a5910cb3d3f43be3d0b0614be19a311be0a0982ba5bbf6b3d8c74aabc578005bdb29be93cd545933c121392bc7d7eebbc08ffe83cf705fd3cb633f2bcf49bfdbc64baf33cce71e53c90f1fcbc3cd7f1bcdbf6b43c3aacf03cbd4abcbc479889bce235f23d0d3d0fbe964ab93de3e42abee6b2893f08b58a3f08b58a3fe6b2893f32a1afb6e7b58a3a4cd17bbabee475b738155a3a0e0a1d39bf7aa9b940322ebab466ed3978663db93677bdb96ab56eb8db72363b014c293b61a982bb114379bbf4285b3a29e7b63ac3fa5bbadd21e5ba796d9a39f696c03a2012b6bab6f5d8b9317c623Line truncated
+206
View File
@@ -0,0 +1,206 @@
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//!DESC RAVU-Zoom-AR (luma, r2)
//!HOOK LUMA
//!BIND HOOKED
//!BIND ravu_zoom_lut2
//!BIND ravu_zoom_lut2_ar
//!WIDTH OUTPUT.w
//!HEIGHT OUTPUT.h
//!OFFSET ALIGN
//!WHEN HOOKED.w OUTPUT.w < HOOKED.h OUTPUT.h < *
#define LUTPOS(x, lut_size) mix(0.5 / (lut_size), 1.0 - 0.5 / (lut_size), (x))
vec4 hook() {
vec2 pos = HOOKED_pos * HOOKED_size;
vec2 subpix = fract(pos - 0.5);
pos -= subpix;
subpix = LUTPOS(subpix, vec2(9.0));
vec2 subpix_inv = 1.0 - subpix;
subpix /= vec2(2.0, 288.0);
subpix_inv /= vec2(2.0, 288.0);
vec4 gather0 = HOOKED_mul * textureGatherOffset(HOOKED_raw, pos * HOOKED_pt, ivec2(-1, -1), 0);
vec4 gather2 = HOOKED_mul * textureGatherOffset(HOOKED_raw, pos * HOOKED_pt, ivec2(-1, 1), 0);
vec4 gather8 = HOOKED_mul * textureGatherOffset(HOOKED_raw, pos * HOOKED_pt, ivec2(1, -1), 0);
vec4 gather10 = HOOKED_mul * textureGatherOffset(HOOKED_raw, pos * HOOKED_pt, ivec2(1, 1), 0);
vec3 abd = vec3(0.0);
float gx, gy;
gx = (gather0.z-gather0.w);
gy = (gather0.x-gather0.w);
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088;
gx = (gather0.y-gather0.x);
gy = (gather2.w-gather0.w)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959;
gx = (gather2.z-gather2.w);
gy = (gather2.x-gather0.x)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959;
gx = (gather2.y-gather2.x);
gy = (gather2.x-gather2.w);
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088;
gx = (gather8.w-gather0.w)/2.0;
gy = (gather0.y-gather0.z);
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959;
gx = (gather8.x-gather0.x)/2.0;
gy = (gather2.z-gather0.z)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994;
gx = (gather10.w-gather2.w)/2.0;
gy = (gather2.y-gather0.y)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994;
gx = (gather10.x-gather2.x)/2.0;
gy = (gather2.y-gather2.z);
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959;
gx = (gather8.z-gather0.z)/2.0;
gy = (gather8.x-gather8.w);
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959;
gx = (gather8.y-gather0.y)/2.0;
gy = (gather10.w-gather8.w)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994;
gx = (gather10.z-gather2.z)/2.0;
gy = (gather10.x-gather8.x)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994;
gx = (gather10.y-gather2.y)/2.0;
gy = (gather10.x-gather10.w);
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959;
gx = (gather8.z-gather8.w);
gy = (gather8.y-gather8.z);
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088;
gx = (gather8.y-gather8.x);
gy = (gather10.z-gather8.z)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959;
gx = (gather10.z-gather10.w);
gy = (gather10.y-gather8.y)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959;
gx = (gather10.y-gather10.x);
gy = (gather10.y-gather10.z);
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088;
float a = abd.x, b = abd.y, d = abd.z;
float T = a + d, D = a * d - b * b;
float delta = sqrt(max(T * T / 4.0 - D, 0.0));
float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta;
float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2);
float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7);
float lambda = sqrtL1;
float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7);
float angle = floor(theta * 24.0 / 3.141592653589793);
float strength = mix(mix(0.0, 1.0, lambda >= 0.004), mix(2.0, 3.0, lambda >= 0.05), lambda >= 0.016);
float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5);
float coord_y = ((angle * 4.0 + strength) * 3.0 + coherence) / 288.0;
float res = 0.0;
vec4 w;
vec4 cg, cg1;
float lo = 0.0, hi = 0.0;
float lo2 = 0.0, hi2 = 0.0;
w = texture(ravu_zoom_lut2, vec2(0.0, coord_y) + subpix);
res += gather0.w * w[0];
res += gather0.x * w[1];
res += gather2.w * w[2];
res += gather2.x * w[3];
w = texture(ravu_zoom_lut2, vec2(0.5, coord_y) + subpix);
res += gather0.z * w[0];
res += gather0.y * w[1];
res += gather2.z * w[2];
res += gather2.y * w[3];
w = texture(ravu_zoom_lut2, vec2(0.0, coord_y) + subpix_inv);
res += gather10.y * w[0];
res += gather10.z * w[1];
res += gather8.y * w[2];
res += gather8.z * w[3];
w = texture(ravu_zoom_lut2, vec2(0.5, coord_y) + subpix_inv);
res += gather10.x * w[0];
res += gather10.w * w[1];
res += gather8.x * w[2];
res += gather8.w * w[3];
w = texture(ravu_zoom_lut2_ar, vec2(0.0, coord_y) + subpix);
cg = vec4(0.1 + gather0.w, 1.1 - gather0.w, 0.1 + gather0.x, 1.1 - gather0.x);
cg1 = cg;
cg *= cg;cg *= cg;cg *= cg;cg *= cg;cg *= cg;
hi += cg[0] * w[0] + cg[2] * w[1];
lo += cg[1] * w[0] + cg[3] * w[1];
cg *= cg1;
hi2 += cg[0] * w[0] + cg[2] * w[1];
lo2 += cg[1] * w[0] + cg[3] * w[1];
cg = vec4(0.1 + gather2.w, 1.1 - gather2.w, 0.1 + gather2.x, 1.1 - gather2.x);
cg1 = cg;
cg *= cg;cg *= cg;cg *= cg;cg *= cg;cg *= cg;
hi += cg[0] * w[2] + cg[2] * w[3];
lo += cg[1] * w[2] + cg[3] * w[3];
cg *= cg1;
hi2 += cg[0] * w[2] + cg[2] * w[3];
lo2 += cg[1] * w[2] + cg[3] * w[3];
w = texture(ravu_zoom_lut2_ar, vec2(0.5, coord_y) + subpix);
cg = vec4(0.1 + gather0.z, 1.1 - gather0.z, 0.1 + gather0.y, 1.1 - gather0.y);
cg1 = cg;
cg *= cg;cg *= cg;cg *= cg;cg *= cg;cg *= cg;
hi += cg[0] * w[0] + cg[2] * w[1];
lo += cg[1] * w[0] + cg[3] * w[1];
cg *= cg1;
hi2 += cg[0] * w[0] + cg[2] * w[1];
lo2 += cg[1] * w[0] + cg[3] * w[1];
cg = vec4(0.1 + gather2.z, 1.1 - gather2.z, 0.1 + gather2.y, 1.1 - gather2.y);
cg1 = cg;
cg *= cg;cg *= cg;cg *= cg;cg *= cg;cg *= cg;
hi += cg[0] * w[2] + cg[2] * w[3];
lo += cg[1] * w[2] + cg[3] * w[3];
cg *= cg1;
hi2 += cg[0] * w[2] + cg[2] * w[3];
lo2 += cg[1] * w[2] + cg[3] * w[3];
w = texture(ravu_zoom_lut2_ar, vec2(0.0, coord_y) + subpix_inv);
cg = vec4(0.1 + gather10.y, 1.1 - gather10.y, 0.1 + gather10.z, 1.1 - gather10.z);
cg1 = cg;
cg *= cg;cg *= cg;cg *= cg;cg *= cg;cg *= cg;
hi += cg[0] * w[0] + cg[2] * w[1];
lo += cg[1] * w[0] + cg[3] * w[1];
cg *= cg1;
hi2 += cg[0] * w[0] + cg[2] * w[1];
lo2 += cg[1] * w[0] + cg[3] * w[1];
cg = vec4(0.1 + gather8.y, 1.1 - gather8.y, 0.1 + gather8.z, 1.1 - gather8.z);
cg1 = cg;
cg *= cg;cg *= cg;cg *= cg;cg *= cg;cg *= cg;
hi += cg[0] * w[2] + cg[2] * w[3];
lo += cg[1] * w[2] + cg[3] * w[3];
cg *= cg1;
hi2 += cg[0] * w[2] + cg[2] * w[3];
lo2 += cg[1] * w[2] + cg[3] * w[3];
w = texture(ravu_zoom_lut2_ar, vec2(0.5, coord_y) + subpix_inv);
cg = vec4(0.1 + gather10.x, 1.1 - gather10.x, 0.1 + gather10.w, 1.1 - gather10.w);
cg1 = cg;
cg *= cg;cg *= cg;cg *= cg;cg *= cg;cg *= cg;
hi += cg[0] * w[0] + cg[2] * w[1];
lo += cg[1] * w[0] + cg[3] * w[1];
cg *= cg1;
hi2 += cg[0] * w[0] + cg[2] * w[1];
lo2 += cg[1] * w[0] + cg[3] * w[1];
cg = vec4(0.1 + gather8.x, 1.1 - gather8.x, 0.1 + gather8.w, 1.1 - gather8.w);
cg1 = cg;
cg *= cg;cg *= cg;cg *= cg;cg *= cg;cg *= cg;
hi += cg[0] * w[2] + cg[2] * w[3];
lo += cg[1] * w[2] + cg[3] * w[3];
cg *= cg1;
hi2 += cg[0] * w[2] + cg[2] * w[3];
lo2 += cg[1] * w[2] + cg[3] * w[3];
hi = hi2 / hi - 0.1;
lo = 1.1 - lo2 / lo;
res = mix(res, clamp(res, lo, hi), 0.800000);
return vec4(res, 0.0, 0.0, 0.0);
}
//!TEXTURE ravu_zoom_lut2
//!SIZE 18 2592
//!FORMAT rgba16f
//!FILTER LINEAR
00000000000000000000000000000000f3f086bcbe9386bdabe7bebc9852343b8aa36dbc0bd882bd2059afbcddb52b3b37065abc4c6c79bd34fe9fbc4db3523ba6ca43bc04a945bd4f9c86bcd494e83a89bb3cbce4cf30bd24aa76bcbf718f3ac3da1bbcc62308bdb70c2ebc878f353b8ceba3bb96f39dbc7ec3f5bbe8ab55ba00000000000000000000000000000000000000000000803f000000000000000017e25abc70f18a3f6c8ed6bb6b2c92bbb82fd3ba07b7673fb387593ab28c02bb4ab0dc3ad2da3e3f911b283b43db08bbc5054337f497133f19f753b92be9d0ba111e34bb77a3d83eb3a9acbb56dc06bb62e9fbbbb33a883e8ee147bc21532ebb158896bc91cee83d98089bbcea3b4abb000000000000000000000000000000005b663ebc0864f2bc251895bccbdc06bbb7987bbc3aca84bd3563ebbcc07aa83a25b863bcb1ad8fbd41ede1bcfb07f63af33457bc6c998bbd6c87e8bcd00c063b522f29bc915759bdd120b9bc7fa0b13ab4e920bc2b9f4bbd17b09fbc80782f3bdd96d6bb217810bde3a967bc96b6923a6e1a6eba961d94bcc3f5d7bbf6ac753bd9dfcd3aceed31bbf339f6b9da37df39b2cd3dbdee69893f43f7fc3df056b8bc10bb3cbd6883813f53dbf33dacdcb8bc33d5cdbce9675a3f4be7dd3d7dc25fbcfbc391bcd8ff333f5560bb3d277549bc09855dbc6064093f66ec8e3dd6811cbcc0de95bc7e7fcc3e4ce2433dd36a31bc29aca5bcf04c803ef531b53c122f1dbcce3be3bce149d93d610744bb0be128bcfc35b8bc1e6187bc54be9fbcd148f7bb267e23bcc08d91bc565466bc071e8fbb6aa948bc99ab37bd2614e7bc3afd09bb866c16bcc5e958bd41b6f7bc57566bb8753a09bc4ec266bd0d3101bd445aab3a2cd9d7bb70352cbd6aaab8bc1009b93a07bacdbbc93a2cbddbb8bdbc52e1a63abaa76dbbc4c5e3bcbdb579bcd0db9b3aa26a373a025664bcceb301bc7b83c83a62f7073bd6c5ccb9e30c92b9b5f3923ac39b61bd814b683f75818d3e39d10fbdd4f976bd4be15d3f3e3f863e0c0917bdcd451dbd1fd53a3f1ea86b3e6a7bdebce2fa03bdcb781d3fe5b8453e5c4bb9bc0d51bdbcc45ded3ec0aa163e7bad8abcc856d8bc8eabb33e3e34da3d377a97bcf06ccbbc9d9a613effc87f3de31184bce2bde3bcf3d5cb3d52f29e3cb3f181bced5facbc34cbdabb533658bced373ebc46ab0cbc3dea51bc68f030bc3e8499bb9fec0cbc7d4214bd0c37e0bc917088bb7fe1e0bb252a3cbdff7f0dbdbb14acba313cb6bbedcf42bded4f0fbd8f28f938f14bf1ba7a4c1fbd408702bd24998bbad2341bbb36450cbd82acdcbc71e9c83a40e7dbb9e914d5bc53f693bc238ea03ac329993aada742bc142015bccea4b63a2721103b867ed5b9206f07ba45cfa23a398f5dbdd6863f3f77aadc3e977733bd885b77bd397e363fec59d23effdb47bde08b36bdc0141d3fed89b63eae0a11bd598816bd36f5023f6974983e038dfebcea6cf1bc8e06ca3edc226c3e108ac2bc58adf4bceac5953e98062e3ecbdcbfbca801e3bc35383e3eb98bd53dac99afbc7674ddbc83c0ac3dd1952f3df13ba5bc9cd09fbc05317ebb96000abc45b56dbc1913febb191733bc7ff631bcc683cfbb35e1f7bbc5a7f3bc585fedbc2f05aabb70fa9abb5c6d13bdccc70ebd959219bb41c69abb768925bd2fe120bdf8e4c1ba106412bb747cdcbc8564d4bc4a6286ba9281e7ba8b23f8bcba03f0bc3a1592b9a8855cba9d7ca0bc68be9cbccf536939bbdd0e3b5f5f21bc764d16bc3b676e3a65ee283b7be6d0b9cfbddd3a248fb93a224b46bd2359163fb14f163f4da547bd4fba5ebdeaa70e3f2b950e3f03ef5dbd39591dbd36bcf33e8360f33ed98e1abd982b0ebdc7e4ce3e264dce3e39850dbd3351b4bc2ea1993e513b993ef3f8adbc76c1e2bc7e186e3ecabe6c3ebb0ad7bcb8a0bfbce3f6133ebd03133ea058b9bc3289c8bc3056843d5213833db5b6b7bce27991bc595ab3bbff47b7bb909292bca05ae5bb986947bcec7f49bcd419e7bbace7b8bbc14eecbccfd310bd9e61d8bb642e41bb817512bdff8937bd9eb86dbbfb8b04bbb2fb19bd170a42bd27e280bb9c033ebb94d2f7bcf9f716bd77b9abba8002b2b85077e1bcf6150cbd70cbd3badb2f7f39d82a9dbc43fdc0bcbfc8ccb91d40d53a15ae1ebc6cef39bcda1e973aa8d2c33ab35f9cbae64824bae4f05c3b79f531bd5f01dd3ed0653f3fe03b5bbda40f48bdaaa3d23e525d363f9eff75bd304418bdd53eb73e73fb1c3ffef735bdb46604bd508d993e95ea023f0c2d10bd2f62c7bcfd196d3e6c6bca3e71fef1bcb808c9bce2802e3e9ea9953e7243e7bc8a9cb8bc82d3d73d5e4f3d3eee8dd7bcc54cafbc9b43323db4cbaa3d6d7dd0bcef3c7ebca6bb0bbc60d19cbbf60398bcf700abbb1cd36cbc5d7092bcdc65fdbb748f64bb273ceebc71c239bda72d0dbc915dd2bad69702bdb4e852bd3fb3bcbb1ad6f0b977f909bd0eb663bde65cbdbbec4adcb9b08ed0bcc7d828bdf9f491bbe5c387ba4f73c2bce1df28bd329231bb873d893a10a087bce90fdbbcce5507bbf848443bd69415bc938b67bc40e9c43a5ac0c33afb859eb977b6f33894ddff3a9d990fbdd9bc8d3ea6b9683fac8563bdaaee1bbd31ce863e8a755d3fdc5f73bd3c02dbbc3a246b3e43d73a3f2be31cbdaf45c1bc3d83463e5a8d1d3f375605bd92248ebc7aee163e81feec3ed7afb6bc8d1fadbcddd8db3d6893b33eae76dabc6d6f85bcbeaa813d4fb2603ecc69c5bc8a9a8abc2a2aa33c71c4c93de120debce31d45bc9d784abc9c42dbbb7643a0bc7a860abb19d2a7bc110ff6bc182d1cbc6e70533a6b30fdbc608883bd7de949bc4e55763a31a9fabcfd898dbd11d728bc3bed923afd7ef9bc05d289bd7c5a44bc2361683a720fc3bca80757bd7a85fdbbf455c43ac063b2bc5b9546bd5524f7bbe960a03a999a7cbcafa40ebda302a1bb0e1f213bb189e9bb7e5a94bc4bbe4bbada58f7390dcd84baa8db03bb87471c3acc2cc4bcbb0c003e1999893ff6373fbd1962b0bcacdff53d1382813fcf0640bd21d276bc42ede03d1ad4593f98bdc9bc9f3250bcbde1bf3d78dc333f6e7488bc758224bc7bb8903d0662093fbe4153bcade124bc1605433d2a24cc3e2ad889bc4fcd27bc54e7b63c33567f3ee980a7bcbde81cbc8e7f3abb5fe6da3dabded0bcfc9df2bbf488a3bc47d585bcce0fadbc000000000000000000000000000000004d6fe439f357cebc760385bd5f1958bcfc48263bba54c6bcee7785bd26f758bcf609ba3ae76ab3bc596b75bd5dc526bceea18c3aaf1394bc1f1445bd543a22bc911e463a325587bc313e34bd678c13bcf8614f3ae32c3ebc29cf04bd532ae9bb77fd5d3a1e57d7bb0b9f9fbc2150acbb0000000000000000000000000000000000000000000000000000803f000000001d5795bb2310dbbb650e8b3f7bf953bc07f9cab93b2fef3a2753683f0662e7ba7801d8bLine truncated
//!TEXTURE ravu_zoom_lut2_ar
//!SIZE 18 2592
//!FORMAT rgba16f
//!FILTER LINEAR
00000000000000000000000000000000c6e5233672c21636ef1d2536c2c12436e9284b36ec8a103633985b36fe9700375dfee23534dcbf3511efe33579922b36292a8236dcff09362ecd9b36c5a77c37574725367d90253624892e36c1c335378055563622c8f9355ff02f36220e3c3726377b361c3cf135e51f2736a5dae63600000000000000000000000000000000000000000000803f0000000000000000739e2136fe567f3f2a51b5374a508c3663e63a377e7c533fd71cc237d55831372b933837cf6a2a3f10c0c837d5a88e3657a79f372ee3ff3ec33de23783267437397a8a372d3aab3eb5aec637a4c825375a6a53371464303ecc5d9237ad141837b7837836fa44be3adb8d0d370a0409360000000000000000000000000000000068e47c365b146136b422933657a057378f3f1f3615330b36c8c11f36a780233632a90e361270f635b3fe0f36a9b51136dff91435a6e7ff3414422335ecb92535b82d0c3614fc003647eb0a36981e0936ec8bcf359552be354f38d4351c9810372c5232355e712c357dea3e350208433571f43536541824363f5d36369c4e393603d47936bc5c823636cba3366f2cb0366dac453670d57b3ffda6843c974e1737a6e20c36e5c2723fcab6043d88482d3608c40736c0b04a3f412fef3c2f9d1636006e0d35bede253f3ec97d3c57872535081e033686d8f93e33da383cf07910368cc5c83529a6ab3e75a32c38bf35a9365c952e35ac42373e3cb30337cbe24235b4c81a363aa5963c62c45a375df4363635803e36a46a9f36a85a8f3642068b362acf9036ba3e903648749e3686ada936ad6fe535e512b835b5f9f135125610366f4d113629760136d4bd0e3674643936380b3536ccc32736a98e3736e9e43936c1948f356f8f8235be309b355558993599fd4536d9ac40365f88473670734736ebc94736fbd82436af37433636a93e37c073373529c03b35f3c93a35e45b3b352cdabc360a14ec364ec80e3792bb133795ba4636092c523f843a373e683d9136157ca935299c4d3fca783f3e189c0036f853053685902d3f12742a3e6c502636c1482e3669050e3f97fbfe3d64353b3672128735202cd23ee841b73db80499353743423659a7913e66d4133d89444a36b5c52a3661ac1f3ed6ae233854165636a39434355b332a3c24b198374d45393565fe9136fbed5a37c8263b3725b0a2369be3d036ea03d636e70edc3660a7e0368f80dc35b3a5ad35e1f5c835a1e5fd3562777035c6cc2535557d3b35818ea3352cb21e36d2031736147f1e3639822836afa21d36f1a94035098553358e72ab364bc76036e2f72536a1222b360250f63676a28536657b3c3666a7733666d5bd365bc0143671410e3622701b3654f94136ce1ae43639fb02377e05073745101537ab4ca9368fad293f889aac3e9e21be36c992a835713b273f93d7af3ea150b63544cd2635aec30d3f55b7953ed0e9463563a8193641a8e53e3e526b3e003f223678da3b35a710aa3eb8262b3e9cbca9352230233613ac643e9bf7c83d4ffc2736a6c22f368560f13d5a270f3dd7a76036bf0aea35032e463b93b4cd37da6b0036dd849e3522d39837d576703730b4ad35fee8ac36e95dab368191ac36badbb13666cb773637477136794e703626137b36088ccf350864c8356550ca354d10cb35b7bae935cb71e2351e98e8358b50ee35ec67413724ff1f366b33303635bc673779a6ee35af01eb35f5baee356290ec35e31cce35bd10ca35d799cf35e8dcd13523a1f536347e8936f9e69c3623a6f8363835e5360e05ec36ce55e3368edfd73654a59836f807003f64e7ff3e827199364a0266361200003f97efff3ed46e6d36631cca35c429d73e0670d73e697bc735709de6356835ad3eec1dad3ea9d5e935bd7b5d36772c803ef79c7f3ef8a98d367a33ed35bc2e263e2524253ec034ea35fd56cc356485a33d36f8a13d2acbcf350e9e853682fa3238e219253879cc8336cc1cb13673668137b7bf75376032af36c508c3351a2ab835baeaa635cda3a83590dad9358ddea63525238e35d981c7358e37313657c02a363c2e263615192e363c4a2636310c1f3671d51d367d0d2436ce329536ef074935bbec453508575c365f90933641092536c0d02036b06f4b3671063a36cef9b03570389a3511edf835de007d3656cf2c36f2e52136d3c837368238f33618f3ee369b9bec36c281ed3623510335459dad3e7f2a293fb1d2d234d8ab95358a19b03e0d2b273f2f5a8335fecd2d36fcc5953ef0fb0d3f4ce82536718c2336678a6b3e3ba6e53e2eeb1936baf68735255f2b3e85a7aa3e5c523935946f2536eaaec83de6fd643eaa582036ea6ab03524dd133dff10f13dba628135c9c4173660cce1374388563b349408364c4de03695844d3728286b379efbd536d59aaa36b25ca13674459636b5079b361c20343516882e3572dc2b351153303526283d3689bd103645e2ba35d5e020365c0c48362da04436a9fc3b36a8524336b67d9f35406d96359c858a3540018d350c655f3646ec40362f573a36051a3e363492ee366b7e4c36301126360e965236de2ab3360b512636d1f71b36b00e1e365cf3b036426dae36c822ad369923ad3635268f365072363e1d5e523f0f855536d97e3235155f3f3e977d4d3fb47728350bfc2b36e19d283ec5e92d3f67e6f835a9bd46367e78fd3d863e0e3f773e3f36b8a89c35bd03b83d5d01d23efe2c8735130a423613d8113d98f8913ef7ce3736ac27633687181e38b53a1f3e15482936213c1d366c0dc1378fcb203c9cf00b366f9aa436cac2ee366ebe2b37435a91363911773666c1553628952336d2783936364d1a36134ae83515ce86359f93d03542b83d35be3d3b350ea8223569663135f1c1d435ec17ca35359cb135f644ce3502961036ac3e0f367f3b0436af370a3663062735657a2735f8061a35b5b61d35624a18362209133677f41136a8121536c541d736a6743536039e34363ee42e36869c6d37c346573771403f37d9e136371f05693673b88d3cf5907b3f6b0300361ecc1c365679033d5b11733f52d09d35a5b142350a92e53c3eff4a3f13c92835c2e408365a698b3ce3cb253ff7bbc135b9840f36b690433ca040fa3e46d00636c01f2935761a0138454cac3eea91173581641736f8e30b37084a373ef0ef1136c87a3436519ea9370df39d3ce7e62b36357b353726a35a3721c97837ed93853600000000000000000000000000000000fd31ce35d818c335f2cf9a350005c4354c126b36e61bfc354eebe0351bedf535fafcf23632482636760d1c36197226360ac85837fe6449365cda0736429993362d679736d43a06363098d33559fb0c36e6c66e37dcbcb33616055c36e0f00437fd283f3754e2b136864691369b0cfe360000000000000000000000000000000000000000000000000000803f0000000055bbdd35c84464377e9b7f3f72b6c035b619ef36143ada371de0533f6f710a376a61173Line truncated
+239
View File
@@ -0,0 +1,239 @@
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//!DESC RAVU-Zoom-AR (luma, r3)
//!HOOK LUMA
//!BIND HOOKED
//!BIND ravu_zoom_lut3
//!BIND ravu_zoom_lut3_ar
//!WIDTH OUTPUT.w
//!HEIGHT OUTPUT.h
//!OFFSET ALIGN
//!WHEN HOOKED.w OUTPUT.w < HOOKED.h OUTPUT.h < *
#define LUTPOS(x, lut_size) mix(0.5 / (lut_size), 1.0 - 0.5 / (lut_size), (x))
vec4 hook() {
vec2 pos = HOOKED_pos * HOOKED_size;
vec2 subpix = fract(pos - 0.5);
pos -= subpix;
subpix = LUTPOS(subpix, vec2(9.0));
vec2 subpix_inv = 1.0 - subpix;
vec2 subpix_ar = subpix / vec2(2.0, 288.0);
vec2 subpix_inv_ar = subpix_inv / vec2(2.0, 288.0);
subpix /= vec2(5.0, 288.0);
subpix_inv /= vec2(5.0, 288.0);
vec4 gather0 = HOOKED_mul * textureGatherOffset(HOOKED_raw, pos * HOOKED_pt, ivec2(-2, -2), 0);
vec4 gather2 = HOOKED_mul * textureGatherOffset(HOOKED_raw, pos * HOOKED_pt, ivec2(-2, 0), 0);
vec4 gather4 = HOOKED_mul * textureGatherOffset(HOOKED_raw, pos * HOOKED_pt, ivec2(-2, 2), 0);
vec4 gather12 = HOOKED_mul * textureGatherOffset(HOOKED_raw, pos * HOOKED_pt, ivec2(0, -2), 0);
vec4 gather14 = HOOKED_mul * textureGatherOffset(HOOKED_raw, pos * HOOKED_pt, ivec2(0, 0), 0);
vec4 gather16 = HOOKED_mul * textureGatherOffset(HOOKED_raw, pos * HOOKED_pt, ivec2(0, 2), 0);
vec4 gather24 = HOOKED_mul * textureGatherOffset(HOOKED_raw, pos * HOOKED_pt, ivec2(2, -2), 0);
vec4 gather26 = HOOKED_mul * textureGatherOffset(HOOKED_raw, pos * HOOKED_pt, ivec2(2, 0), 0);
vec4 gather28 = HOOKED_mul * textureGatherOffset(HOOKED_raw, pos * HOOKED_pt, ivec2(2, 2), 0);
vec3 abd = vec3(0.0);
float gx, gy;
gx = (gather12.x-gather0.x)/2.0;
gy = (gather2.z-gather0.z)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088;
gx = (gather14.w-gather2.w)/2.0;
gy = (-gather4.z+8.0*gather2.y-8.0*gather0.y+gather0.z)/12.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959;
gx = (gather14.x-gather2.x)/2.0;
gy = (-gather4.y+8.0*gather4.z-8.0*gather2.z+gather0.y)/12.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959;
gx = (gather16.w-gather4.w)/2.0;
gy = (gather4.y-gather2.y)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088;
gx = (-gather24.x+8.0*gather12.y-8.0*gather0.y+gather0.x)/12.0;
gy = (gather14.w-gather12.w)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959;
gx = (-gather26.w+8.0*gather14.z-8.0*gather2.z+gather2.w)/12.0;
gy = (-gather16.w+8.0*gather14.x-8.0*gather12.x+gather12.w)/12.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994;
gx = (-gather26.x+8.0*gather14.y-8.0*gather2.y+gather2.x)/12.0;
gy = (-gather16.x+8.0*gather16.w-8.0*gather14.w+gather12.x)/12.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994;
gx = (-gather28.w+8.0*gather16.z-8.0*gather4.z+gather4.w)/12.0;
gy = (gather16.x-gather14.x)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959;
gx = (-gather24.y+8.0*gather24.x-8.0*gather12.x+gather0.y)/12.0;
gy = (gather14.z-gather12.z)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959;
gx = (-gather26.z+8.0*gather26.w-8.0*gather14.w+gather2.z)/12.0;
gy = (-gather16.z+8.0*gather14.y-8.0*gather12.y+gather12.z)/12.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994;
gx = (-gather26.y+8.0*gather26.x-8.0*gather14.x+gather2.y)/12.0;
gy = (-gather16.y+8.0*gather16.z-8.0*gather14.z+gather12.y)/12.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994;
gx = (-gather28.z+8.0*gather28.w-8.0*gather16.w+gather4.z)/12.0;
gy = (gather16.y-gather14.y)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959;
gx = (gather24.y-gather12.y)/2.0;
gy = (gather26.w-gather24.w)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088;
gx = (gather26.z-gather14.z)/2.0;
gy = (-gather28.w+8.0*gather26.x-8.0*gather24.x+gather24.w)/12.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959;
gx = (gather26.y-gather14.y)/2.0;
gy = (-gather28.x+8.0*gather28.w-8.0*gather26.w+gather24.x)/12.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959;
gx = (gather28.z-gather16.z)/2.0;
gy = (gather28.x-gather26.x)/2.0;
abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088;
float a = abd.x, b = abd.y, d = abd.z;
float T = a + d, D = a * d - b * b;
float delta = sqrt(max(T * T / 4.0 - D, 0.0));
float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta;
float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2);
float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7);
float lambda = sqrtL1;
float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7);
float angle = floor(theta * 24.0 / 3.141592653589793);
float strength = mix(mix(0.0, 1.0, lambda >= 0.004), mix(2.0, 3.0, lambda >= 0.05), lambda >= 0.016);
float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5);
float coord_y = ((angle * 4.0 + strength) * 3.0 + coherence) / 288.0;
float res = 0.0;
vec4 w;
vec4 cg, cg1;
float lo = 0.0, hi = 0.0;
float lo2 = 0.0, hi2 = 0.0;
w = texture(ravu_zoom_lut3, vec2(0.0, coord_y) + subpix);
res += gather0.w * w[0];
res += gather0.x * w[1];
res += gather2.w * w[2];
res += gather2.x * w[3];
w = texture(ravu_zoom_lut3, vec2(0.2, coord_y) + subpix);
res += gather4.w * w[0];
res += gather4.x * w[1];
res += gather0.z * w[2];
res += gather0.y * w[3];
w = texture(ravu_zoom_lut3, vec2(0.4, coord_y) + subpix);
res += gather2.z * w[0];
res += gather2.y * w[1];
res += gather4.z * w[2];
res += gather4.y * w[3];
w = texture(ravu_zoom_lut3, vec2(0.6, coord_y) + subpix);
res += gather12.w * w[0];
res += gather12.x * w[1];
res += gather14.w * w[2];
res += gather14.x * w[3];
w = texture(ravu_zoom_lut3, vec2(0.8, coord_y) + subpix);
res += gather16.w * w[0];
res += gather16.x * w[1];
w = texture(ravu_zoom_lut3, vec2(0.0, coord_y) + subpix_inv);
res += gather28.y * w[0];
res += gather28.z * w[1];
res += gather26.y * w[2];
res += gather26.z * w[3];
w = texture(ravu_zoom_lut3, vec2(0.2, coord_y) + subpix_inv);
res += gather24.y * w[0];
res += gather24.z * w[1];
res += gather28.x * w[2];
res += gather28.w * w[3];
w = texture(ravu_zoom_lut3, vec2(0.4, coord_y) + subpix_inv);
res += gather26.x * w[0];
res += gather26.w * w[1];
res += gather24.x * w[2];
res += gather24.w * w[3];
w = texture(ravu_zoom_lut3, vec2(0.6, coord_y) + subpix_inv);
res += gather16.y * w[0];
res += gather16.z * w[1];
res += gather14.y * w[2];
res += gather14.z * w[3];
w = texture(ravu_zoom_lut3, vec2(0.8, coord_y) + subpix_inv);
res += gather12.y * w[0];
res += gather12.z * w[1];
w = texture(ravu_zoom_lut3_ar, vec2(0.0, coord_y) + subpix_ar);
cg = vec4(0.1 + gather0.y, 1.1 - gather0.y, 0.1 + gather2.z, 1.1 - gather2.z);
cg1 = cg;
cg *= cg;cg *= cg;cg *= cg;cg *= cg;cg *= cg;
hi += cg[0] * w[0] + cg[2] * w[1];
lo += cg[1] * w[0] + cg[3] * w[1];
cg *= cg1;
hi2 += cg[0] * w[0] + cg[2] * w[1];
lo2 += cg[1] * w[0] + cg[3] * w[1];
cg = vec4(0.1 + gather2.y, 1.1 - gather2.y, 0.1 + gather4.z, 1.1 - gather4.z);
cg1 = cg;
cg *= cg;cg *= cg;cg *= cg;cg *= cg;cg *= cg;
hi += cg[0] * w[2] + cg[2] * w[3];
lo += cg[1] * w[2] + cg[3] * w[3];
cg *= cg1;
hi2 += cg[0] * w[2] + cg[2] * w[3];
lo2 += cg[1] * w[2] + cg[3] * w[3];
w = texture(ravu_zoom_lut3_ar, vec2(0.5, coord_y) + subpix_ar);
cg = vec4(0.1 + gather12.x, 1.1 - gather12.x, 0.1 + gather14.w, 1.1 - gather14.w);
cg1 = cg;
cg *= cg;cg *= cg;cg *= cg;cg *= cg;cg *= cg;
hi += cg[0] * w[0] + cg[2] * w[1];
lo += cg[1] * w[0] + cg[3] * w[1];
cg *= cg1;
hi2 += cg[0] * w[0] + cg[2] * w[1];
lo2 += cg[1] * w[0] + cg[3] * w[1];
cg = vec4(0.1 + gather14.x, 1.1 - gather14.x, 0.1 + gather16.w, 1.1 - gather16.w);
cg1 = cg;
cg *= cg;cg *= cg;cg *= cg;cg *= cg;cg *= cg;
hi += cg[0] * w[2] + cg[2] * w[3];
lo += cg[1] * w[2] + cg[3] * w[3];
cg *= cg1;
hi2 += cg[0] * w[2] + cg[2] * w[3];
lo2 += cg[1] * w[2] + cg[3] * w[3];
w = texture(ravu_zoom_lut3_ar, vec2(0.0, coord_y) + subpix_inv_ar);
cg = vec4(0.1 + gather28.w, 1.1 - gather28.w, 0.1 + gather26.x, 1.1 - gather26.x);
cg1 = cg;
cg *= cg;cg *= cg;cg *= cg;cg *= cg;cg *= cg;
hi += cg[0] * w[0] + cg[2] * w[1];
lo += cg[1] * w[0] + cg[3] * w[1];
cg *= cg1;
hi2 += cg[0] * w[0] + cg[2] * w[1];
lo2 += cg[1] * w[0] + cg[3] * w[1];
cg = vec4(0.1 + gather26.w, 1.1 - gather26.w, 0.1 + gather24.x, 1.1 - gather24.x);
cg1 = cg;
cg *= cg;cg *= cg;cg *= cg;cg *= cg;cg *= cg;
hi += cg[0] * w[2] + cg[2] * w[3];
lo += cg[1] * w[2] + cg[3] * w[3];
cg *= cg1;
hi2 += cg[0] * w[2] + cg[2] * w[3];
lo2 += cg[1] * w[2] + cg[3] * w[3];
w = texture(ravu_zoom_lut3_ar, vec2(0.5, coord_y) + subpix_inv_ar);
cg = vec4(0.1 + gather16.z, 1.1 - gather16.z, 0.1 + gather14.y, 1.1 - gather14.y);
cg1 = cg;
cg *= cg;cg *= cg;cg *= cg;cg *= cg;cg *= cg;
hi += cg[0] * w[0] + cg[2] * w[1];
lo += cg[1] * w[0] + cg[3] * w[1];
cg *= cg1;
hi2 += cg[0] * w[0] + cg[2] * w[1];
lo2 += cg[1] * w[0] + cg[3] * w[1];
cg = vec4(0.1 + gather14.z, 1.1 - gather14.z, 0.1 + gather12.y, 1.1 - gather12.y);
cg1 = cg;
cg *= cg;cg *= cg;cg *= cg;cg *= cg;cg *= cg;
hi += cg[0] * w[2] + cg[2] * w[3];
lo += cg[1] * w[2] + cg[3] * w[3];
cg *= cg1;
hi2 += cg[0] * w[2] + cg[2] * w[3];
lo2 += cg[1] * w[2] + cg[3] * w[3];
hi = hi2 / hi - 0.1;
lo = 1.1 - lo2 / lo;
res = mix(res, clamp(res, lo, hi), 0.800000);
return vec4(res, 0.0, 0.0, 0.0);
}
//!TEXTURE ravu_zoom_lut3
//!SIZE 45 2592
//!FORMAT rgba16f
//!FILTER LINEAR
0000000000000000000000000000000005a1fb3aa25ee63adb9d8a3b6930c43aa920073bdd1a153b4e31993bb12c003beaea473a6c56f93ae9a5ab3b4ce2053b7632173a2411ca3af160963b6146f43a69721b3a79a0cd3a754da33b7a66073b29c8e8398bb1c73a46ca963b86ae003b1e44ba390570f63a4ab0953bf292bc3a00000000000000000000000000000000000000000000000000000000000000008cb6d939544729b981e1a939472fd4bcd5b48e3a8bdfa0ba5af6cebad3e8bcbc56a109b90201cebadeec17b99878aabc8d6130ba5857ddb901779eb886e589bcb139c4b9ffa60dba0b7cfb391a5c7bbc4995e9b9f5c4edb98ab5fb39dedf2ebcd18ad8b955754eb9cf1ca33a2a56febb0000000000000000000000000000000000000000000000000000000000000000c96d7bbdd16ad4bcee20f4bac0206838922580bd93d1bcbc5c4109bbc781c9ba9bd16abd89f7b0bc75dcb9ba952ddbb9c16f3cbdf6f58ebc7accbcbaa66cecb9170b2cbd377383bcae019fba353e22ba827201bdb11241bc24733fbac78e28baa481a0bc0610f1bb219c12ba24085dba0000000000000000000000000000000000000000000000000000803f00000000b97a513b4267b1bc9c9d893fd75acabb47196b3b482f03bc7257663f04ec113b96a8293b9854b5bbf53e3d3f31854e3b7ae1f03ae9db99bb6c53123f1b7eea3a95e54e3afd0a04bcb5c2d73e6fee36bbd3aafd39c86549bc8889883e8c660cbc590cd7b63ca7a3bc8972ec3d324d86bc0000000000000000000000000000000000000000000000000000000000000000fbf35d3a8524753b0000000000000000b6477e3b88e3973b0000000000000000e4bf193bbbb6793b000000000000000035e8bd3a514f5d3b00000000000000004c4ed939cf36353b0000000000000000e2f59dbae8ea1c3b0000000000000000d71133bb9d20a53a0000000000000000000000000000000000000000000000001bba0f3b42266d3aabd5d53a27d4c839aafa1e3b20c13a3b1a41f73bd47a1d3b8eaac03a4c4d2f3b3afad83b21d9773bcb90b63a3a7d423b4d71023c578c663b0af2fe39a7ac0f3b938ecd3bfba2463b1fcf083a38762b3ba60aed3b7154753be745f238acc0583bd1eef33bee227e3b0440273a444ca83abbceb13b1de01c3ba8ee35b85eb5a73a6862873b4cd06739602ba33a12d7a3387124e53a1ffdc3bc473e883a8ae6e9b9ca08093b128df7bc05464c3a439688b984bf553a4e6fcebcfac89eb9aaded9b9bf3a2e3a6486c6bc6874e9b9d24953baeb6d8139b0d992bc66a09fb959042dba0b903e3a0f3587bc9af1013ae820abbac0b0833a60743fbc49147cb91393d5b94ec2d73a00b7a9bbf74b5e39ba826438dced513a0261a1ba18b8e1bc3464a2bcd734b0bb195ec43a4ca87fbdc0b001bdb73c81bb1441043ab09088bdc551f7bc164ab1bb1202173a683c87bd7758f6bc97a382bb865a7eb9371b4ebd5ee9bbbcb04846bb0eb8d5b8fc8f44bde283b2bca92030bb5d1a01babc1e0cbd556189bcc53104bb626d223a3ff8a1bc1ffc17bc36448dba0953e3b9301c0bbb75b03dbb395d9738e589a3ba79d8993bee3c63bde078883f78ebfe3d6e0fe73b93575fbdae8c803fa6dcef3d07beba3b3a3b08bdc007583f5cdbdb3d1ce2a33be28fd7bca65c323f2364bc3de19c5a3bcbb49ebc45ac073f4ef2903d91704e3b576cbbbcc154ca3e4b33453df731de3a5c79d3bc77ff7e3e7cfbbe3cc314223bf0dbf6bc3678dc3d7b72cfbacdd9a239e856c8bc4cb14fbc8bf993bc7d7f8bbc84e3973b00000000000000003dc677bce615be3b000000000000000086482fbcfdac983b000000000000000038cffbbbb318ad3b0000000000000000a4f4bdbbbd25933b00000000000000002e39f7bb52d38f3b0000000000000000747810bc684e463b000000000000000042ce15bc36b93f3b0000000000000000dcd20cbc5173153b0000000000000000a180003b8d50833a1612e83ad063aa3997b0ee3a5747133b0af4a23b7ca5263ba1128a3abbc3013b8ed1cd3b96fe5b3bfde4c4b7da40323b0b08f83b683d903b978603b9dfe0843aadd7ee3bfacb503b0172a838dfb3ed3a3994df3b53f38d3bf2eb523a3109e93a93e8dd3b833a903bbb3841b97f45aa397e1ab43bc2d34c3bcb2950b9fa36dfb85dbd663be3140a3bdd31823aa232e7392cc40c3b9cf2aabc18acc73a2e0b7bb8e201453bf447d9bc655b2c3aa36029ba0b88d23a2f41b7bccfd3da395f84eab80eddc1b90c26a9bc868b32b9dfe34dba5ab2de3aa23172bc37783f38003b08bac6585a3a99d860bc211c35bafb4f86ba5d42adba2e571ebc52e836b987fe0dba0487953a7ecb92bbbaae9db9388c03ba5a883a3a87bdefb9254b75bc808d71bce4291bbc04a8053b748e33bd1815ffbc73302abcc003003b6c1555bd8f0702bd4220f7bbef105f3a8c1260bd498506bd1a7ce3bbd9e6bb3933d624bd7a24c7bc976b9abb0f892839e31d26bd5e88c7bcf6da8cbbbba01cb68c9de7bc3a3390bc706156bba81b0cba865b75bcb6601bbcf836c7ba4fed94b817fec2ba6475d5bafd01aab9714f2ab96a8fd43b398174bd6632663fed998c3e15922d3c57988ebd1df95b3fb6e8843e3515063cfa443fbda2e1393f02bf673eb933f53b8b0f23bd83b81b3f63c7433e22da8f3b30a5e6bc5c7fea3e6768153eef5bb03b19e804bdade6b13eef32db3dfcb5b03b7d21edbc9b70613eaa42803deecd803b743104bde98fcc3d30c2ae3cf1f1103bf11cbfbc34549abb7c7c32bc44befebcfc2cbb3b00000000000000007bb70bbd31e5043c00000000000000007196bdbc97e9f23b0000000000000000d142a5bcbb6de63b00000000000000009cf86ebc3952ad3b0000000000000000296689bc0113b03b0000000000000000102779bc249f723b00000000000000008c0b82bc14ae863b0000000000000000fbd139bca886103b0000000000000000374d95394dd0573a65ca973a22ba2c3a83a7743ae4fb453a800f563b8c057d3b6d68983a26dfd63ad42ea63bc8a5a23b8b9c6f3af40a6a39a2decc3b8b55923b801002badf812f3aa295e23b9138733befa9ed3adff79d3a9457c53b07e6993b186164bad3708138c7e8ce3bb543a63b3d2f67b70908ea39206e743b742f703b968e7e370a56ef38c79b693bc04f053b6988983a783d203a93c9323b60f79abc2df3b73a50a8ea3847fe2e3bc45cb4bce4e4bb39c9d206bab3ec393bfccba5bce7728b3a5ad2b3bac82cac3ad0c88abc5358e8b99e4ed63872cef73a60ca5ebcda57e5b8b4e9b4ba2155053b837835bc6435ac3af6b089babe628339eda5d9bb4db14538aafec5b9c2e0653a252273bb85560db8396640ba07fd7cba088e22ba199b38bc3edb45bc543048bc38190f3b5aa111bd4e30f4bc55346fbce833243ba77039bdc8dc10bdcaf937bcc51cc13ad7643dbLine truncated
//!TEXTURE ravu_zoom_lut3_ar
//!SIZE 18 2592
//!FORMAT rgba16f
//!FILTER LINEAR
00000000000000000000000000000000c6e5233672c21636ef1d2536c2c12436e9284b36ec8a103633985b36fe9700375dfee23534dcbf3511efe33579922b36292a8236dcff09362ecd9b36c5a77c37574725367d90253624892e36c1c335378055563622c8f9355ff02f36220e3c3726377b361c3cf135e51f2736a5dae63600000000000000000000000000000000000000000000803f0000000000000000739e2136fe567f3f2a51b5374a508c3663e63a377e7c533fd71cc237d55831372b933837cf6a2a3f10c0c837d5a88e3657a79f372ee3ff3ec33de23783267437397a8a372d3aab3eb5aec637a4c825375a6a53371464303ecc5d9237ad141837b7837836fa44be3adb8d0d370a0409360000000000000000000000000000000068e47c365b146136b422933657a057378f3f1f3615330b36c8c11f36a780233632a90e361270f635b3fe0f36a9b51136dff91435a6e7ff3414422335ecb92535b82d0c3614fc003647eb0a36981e0936ec8bcf359552be354f38d4351c9810372c5232355e712c357dea3e350208433571f43536541824363f5d36369c4e393603d47936bc5c823636cba3366f2cb0366dac453670d57b3ffda6843c974e1737a6e20c36e5c2723fcab6043d88482d3608c40736c0b04a3f412fef3c2f9d1636006e0d35bede253f3ec97d3c57872535081e033686d8f93e33da383cf07910368cc5c83529a6ab3e75a32c38bf35a9365c952e35ac42373e3cb30337cbe24235b4c81a363aa5963c62c45a375df4363635803e36a46a9f36a85a8f3642068b362acf9036ba3e903648749e3686ada936ad6fe535e512b835b5f9f135125610366f4d113629760136d4bd0e3674643936380b3536ccc32736a98e3736e9e43936c1948f356f8f8235be309b355558993599fd4536d9ac40365f88473670734736ebc94736fbd82436af37433636a93e37c073373529c03b35f3c93a35e45b3b352cdabc360a14ec364ec80e3792bb133795ba4636092c523f843a373e683d9136157ca935299c4d3fca783f3e189c0036f853053685902d3f12742a3e6c502636c1482e3669050e3f97fbfe3d64353b3672128735202cd23ee841b73db80499353743423659a7913e66d4133d89444a36b5c52a3661ac1f3ed6ae233854165636a39434355b332a3c24b198374d45393565fe9136fbed5a37c8263b3725b0a2369be3d036ea03d636e70edc3660a7e0368f80dc35b3a5ad35e1f5c835a1e5fd3562777035c6cc2535557d3b35818ea3352cb21e36d2031736147f1e3639822836afa21d36f1a94035098553358e72ab364bc76036e2f72536a1222b360250f63676a28536657b3c3666a7733666d5bd365bc0143671410e3622701b3654f94136ce1ae43639fb02377e05073745101537ab4ca9368fad293f889aac3e9e21be36c992a835713b273f93d7af3ea150b63544cd2635aec30d3f55b7953ed0e9463563a8193641a8e53e3e526b3e003f223678da3b35a710aa3eb8262b3e9cbca9352230233613ac643e9bf7c83d4ffc2736a6c22f368560f13d5a270f3dd7a76036bf0aea35032e463b93b4cd37da6b0036dd849e3522d39837d576703730b4ad35fee8ac36e95dab368191ac36badbb13666cb773637477136794e703626137b36088ccf350864c8356550ca354d10cb35b7bae935cb71e2351e98e8358b50ee35ec67413724ff1f366b33303635bc673779a6ee35af01eb35f5baee356290ec35e31cce35bd10ca35d799cf35e8dcd13523a1f536347e8936f9e69c3623a6f8363835e5360e05ec36ce55e3368edfd73654a59836f807003f64e7ff3e827199364a0266361200003f97efff3ed46e6d36631cca35c429d73e0670d73e697bc735709de6356835ad3eec1dad3ea9d5e935bd7b5d36772c803ef79c7f3ef8a98d367a33ed35bc2e263e2524253ec034ea35fd56cc356485a33d36f8a13d2acbcf350e9e853682fa3238e219253879cc8336cc1cb13673668137b7bf75376032af36c508c3351a2ab835baeaa635cda3a83590dad9358ddea63525238e35d981c7358e37313657c02a363c2e263615192e363c4a2636310c1f3671d51d367d0d2436ce329536ef074935bbec453508575c365f90933641092536c0d02036b06f4b3671063a36cef9b03570389a3511edf835de007d3656cf2c36f2e52136d3c837368238f33618f3ee369b9bec36c281ed3623510335459dad3e7f2a293fb1d2d234d8ab95358a19b03e0d2b273f2f5a8335fecd2d36fcc5953ef0fb0d3f4ce82536718c2336678a6b3e3ba6e53e2eeb1936baf68735255f2b3e85a7aa3e5c523935946f2536eaaec83de6fd643eaa582036ea6ab03524dd133dff10f13dba628135c9c4173660cce1374388563b349408364c4de03695844d3728286b379efbd536d59aaa36b25ca13674459636b5079b361c20343516882e3572dc2b351153303526283d3689bd103645e2ba35d5e020365c0c48362da04436a9fc3b36a8524336b67d9f35406d96359c858a3540018d350c655f3646ec40362f573a36051a3e363492ee366b7e4c36301126360e965236de2ab3360b512636d1f71b36b00e1e365cf3b036426dae36c822ad369923ad3635268f365072363e1d5e523f0f855536d97e3235155f3f3e977d4d3fb47728350bfc2b36e19d283ec5e92d3f67e6f835a9bd46367e78fd3d863e0e3f773e3f36b8a89c35bd03b83d5d01d23efe2c8735130a423613d8113d98f8913ef7ce3736ac27633687181e38b53a1f3e15482936213c1d366c0dc1378fcb203c9cf00b366f9aa436cac2ee366ebe2b37435a91363911773666c1553628952336d2783936364d1a36134ae83515ce86359f93d03542b83d35be3d3b350ea8223569663135f1c1d435ec17ca35359cb135f644ce3502961036ac3e0f367f3b0436af370a3663062735657a2735f8061a35b5b61d35624a18362209133677f41136a8121536c541d736a6743536039e34363ee42e36869c6d37c346573771403f37d9e136371f05693673b88d3cf5907b3f6b0300361ecc1c365679033d5b11733f52d09d35a5b142350a92e53c3eff4a3f13c92835c2e408365a698b3ce3cb253ff7bbc135b9840f36b690433ca040fa3e46d00636c01f2935761a0138454cac3eea91173581641736f8e30b37084a373ef0ef1136c87a3436519ea9370df39d3ce7e62b36357b353726a35a3721c97837ed93853600000000000000000000000000000000fd31ce35d818c335f2cf9a350005c4354c126b36e61bfc354eebe0351bedf535fafcf23632482636760d1c36197226360ac85837fe6449365cda0736429993362d679736d43a06363098d33559fb0c36e6c66e37dcbcb33616055c36e0f00437fd283f3754e2b136864691369b0cfe360000000000000000000000000000000000000000000000000000803f0000000055bbdd35c84464377e9b7f3f72b6c035b619ef36143ada371de0533f6f710a376a61173Line truncated