Closed geextahslex closed 7 months ago
Hi, I'm looking for help with a glsl shader. I want to only output a specific srgb range with smoothstep. But I have no idea how to implement it. I need only the peak information so like smoothstep 230/245-255 srgb.
Any help would be appreciated :)
This is the shader
//!PARAM L_hdr //!TYPE float //!MINIMUM 0 //!MAXIMUM 10000 1000.0 //!PARAM L_sdr //!TYPE float //!MINIMUM 0 //!MAXIMUM 1000 203.0 //!PARAM sigma //!TYPE float //!MINIMUM 0.0 //!MAXIMUM 1.0 0.5 //!HOOK OUTPUT //!BIND HOOKED //!DESC tone mapping (reinhard) const float pq_m1 = 0.1593017578125; const float pq_m2 = 78.84375; const float pq_c1 = 0.8359375; const float pq_c2 = 18.8515625; const float pq_c3 = 18.6875; const float pq_C = 10000.0; float Y_to_ST2084(float C) { float L = C / pq_C; float Lm = pow(L, pq_m1); float N = (pq_c1 + pq_c2 * Lm) / (1.0 + pq_c3 * Lm); N = pow(N, pq_m2); return N; } float ST2084_to_Y(float N) { float Np = pow(N, 1.0 / pq_m2); float L = Np - pq_c1; if (L < 0.0 ) L = 0.0; L = L / (pq_c2 - pq_c3 * Np); L = pow(L, 1.0 / pq_m1); return L * pq_C; } vec3 RGB_to_XYZ(vec3 RGB) { mat3 M = mat3( 0.6369580483012914, 0.14461690358620832, 0.1688809751641721, 0.2627002120112671, 0.6779980715188708, 0.05930171646986196, 0.000000000000000, 0.028072693049087428, 1.060985057710791); return RGB * M; } vec3 XYZ_to_RGB(vec3 XYZ) { mat3 M = mat3( 1.716651187971268, -0.355670783776392, -0.253366281373660, -0.666684351832489, 1.616481236634939, 0.0157685458139111, 0.017639857445311, -0.042770613257809, 0.942103121235474); return XYZ * M; } vec3 XYZ_to_LMS(vec3 XYZ) { mat3 M = mat3( 0.3592832590121217, 0.6976051147779502, -0.0358915932320290, -0.1920808463704993, 1.1004767970374321, 0.0753748658519118, 0.0070797844607479, 0.0748396662186362, 0.8433265453898765); return XYZ * M; } vec3 LMS_to_XYZ(vec3 LMS) { mat3 M = mat3( 2.0701522183894223, -1.3263473389671563, 0.2066510476294053, 0.3647385209748072, 0.6805660249472273, -0.0453045459220347, -0.0497472075358123, -0.0492609666966131, 1.1880659249923042); return LMS * M; } vec3 LMS_to_ICtCp(vec3 LMS) { LMS.x = Y_to_ST2084(LMS.x); LMS.y = Y_to_ST2084(LMS.y); LMS.z = Y_to_ST2084(LMS.z); mat3 M = mat3( 2048.0 / 4096.0, 2048.0 / 4096.0, 0.0 / 4096.0, 6610.0 / 4096.0, -13613.0 / 4096.0, 7003.0 / 4096.0, 17933.0 / 4096.0, -17390.0 / 4096.0, -543.0 / 4096.0); return LMS * M; } vec3 ICtCp_to_LMS(vec3 ICtCp) { mat3 M = mat3( 0.9999999999999998, 0.0086090370379328, 0.1110296250030260, 0.9999999999999998, -0.0086090370379328, -0.1110296250030259, 0.9999999999999998, 0.5600313357106791, -0.3206271749873188); ICtCp *= M; ICtCp.x = ST2084_to_Y(ICtCp.x); ICtCp.y = ST2084_to_Y(ICtCp.y); ICtCp.z = ST2084_to_Y(ICtCp.z); return ICtCp; } vec3 RGB_to_ICtCp(vec3 color) { color *= L_sdr; color = RGB_to_XYZ(color); color = XYZ_to_LMS(color); color = LMS_to_ICtCp(color); return color; } vec3 ICtCp_to_RGB(vec3 color) { color = ICtCp_to_LMS(color); color = LMS_to_XYZ(color); color = XYZ_to_RGB(color); color /= L_sdr; return color; } float curve(float x, float w) { float simple = x / (1.0 + x); float extended = simple * (1.0 + x / (w * w)); return extended; } vec3 tone_mapping_ictcp(vec3 ICtCp) { float I2 = Y_to_ST2084(curve(ST2084_to_Y(ICtCp.x) / L_sdr, L_hdr / L_sdr) * L_sdr); ICtCp.yz *= mix(1.0, min(ICtCp.x / I2, I2 / ICtCp.x), sigma); ICtCp.x = I2; return ICtCp; } vec4 hook() { vec4 color = HOOKED_texOff(0); color.rgb = RGB_to_ICtCp(color.rgb); color.rgb = tone_mapping_ictcp(color.rgb); color.rgb = ICtCp_to_RGB(color.rgb); return color; }
hi, seems like you are not using LYGIA in this example.
Yes I know, I was only asking for help. There are not many people you can ask something about glsl
Hi, I'm looking for help with a glsl shader. I want to only output a specific srgb range with smoothstep. But I have no idea how to implement it. I need only the peak information so like smoothstep 230/245-255 srgb.
Any help would be appreciated :)
This is the shader