Нарисуй все кривые с калькулятора для тестирования или дерни их с фотошопа после цветокоррекции. Нужно же понимать что в шейдере считается.
Читать полностью…Привет. Спасибо за совет.
Я в предыдущей реализации заметил артефакты смешивания цветов и поменял немного на
vec4 texture = texture2D(nightSky, uv);Читать полностью…
vec4 color = clamp(vec4(retColor.rgb, alpha), 0.0, 1.0);
vec4 nightSkyColor;
if (uv.y < 0.5) {
nightSkyColor = texture;
}
float luminance = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722;
float darkness = 1.0 - luminance;
nightSkyColor *= darkness;
color += nightSkyColor;
секьюрное html+css to canvas изобретают 🤞
https://x.com/fserb/status/1794058245901824349
а чего просто в дебаге не посмореть как настроен канвас и буфер отдельно, и сравнить отличия
кажется это самый быстрый вариант был бы
соответственно, когда я стал юзать blendFuncSeparate я пофиксил это лишнее умножение src_alpha на саму себя, и всё стало хорошо
Читать полностью…Нет, ключевая информация в моем ответе - про режим блендинга и деление на альфу в шейдере. Проблема вызвана тем, как декодировалась текстура с precomputed alpha. В некоторых случаях графический редактор не готовит значения как надо, а webgl декодер png или один из этапов конвертации текстуры при загрузке думает, что там все ок, поэтому надо делить каждый цветовой канал на альфу, чтобы все отрисовалось без гало.
Читать полностью…ещё подкорректировать
color *= 1. - pow( (nightSkyColor.r+nightSkyColor.g+nightSkyColor.b)/3., 1.5 );
или
color *= 1. - pow( (nightSkyColor.r+nightSkyColor.g+nightSkyColor.b)/3., .75 );
и если
nightSkyColor *= luminance;
nightSkyColor *= darkness;
Попробуйcolor = mix(color, 1.-nightSkyColor, delta);
или
color *= 1.-nightSkyColor.g;
что касается самого бага, то суть простая. я использовал blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA)
допустим, у меня черный непрозрачный фон, на который я рисую красный пиксель с alpha 0.4
то получается, что src_alpha приводит к тому, что (1,0,0,0.4) умножается на 0.4 ещё раз, и получается (0.4,0,0,0.16).
фон умножается на ONE_MINUS_SRC_ALPHA, то есть на (1-0.4) = 0.6 и получается (0,0,0,1) * 0.6 = (0,0,0,0.6).
дальше цвета складываются - (0.4,0,0,0.16) + (0,0,0,0.6) = (0.4,0,0,0.76) - вуаля, в альфе значение 0.76, часть прозрачности "утекла" в подложку, и теперь она стала прозрачной
короче, я, кажется, прохавал. канвас и фреймбуффер ничем принципиально не отличались, просто у меня у канваса альфа бэкбуффера была выключена, поэтому то, что я его так же точно "проедал" своим рисованием не было заметно. а в случае фреймбуффера это уже было заметно, т.к. цвет самого канваса вылезал наружу
Читать полностью…Это бленда для PMA как раз, но если клинишь фреймбуфер - очищац его с умножением в на А
Читать полностью…