Всем привет. Во многих местах, где я вижу сумму diffuse и specular часто встречается такая конструкция: diffuse * (1 - metallic) + D * F * G / (...), где F меняется по Френелю в пределе [F0, 1] в зависимости от угла. Диффузная часть при этом остается без изменений. (Например, здесь
https://github.com/knightcrawler25/GLSL-PathTracer/blob/master/PathTracer/shaders/common/UE4BRDF.glsl в самой последней строке). Но вот что мне непонятно, это почему мы не умножаем diffuse на 1-F? В противном случае, так как diffuse-brdf нормализована, сумма будет выдавать избыточную энергию. Причем на угловых случаях эта энергия будет в 2 раза больше необходимой, так как specular стремится к 100% а diffuse и так эмитит обратно 100% энергии. О перерасчете diffuse говорит еще Sébastien Lagarde
https://seblagarde.wordpress.com/2011/08/17/hello-world (c_newdiff = (1-c_spec)*c_diff). Да, такое умножение не правильно, так как френель для диффуза должен быть перерасчитан для каждого направления отдельно. Но это сложно, и поэтому невозможно в реалтайме. Но неужели оставить 1 перед diffuse лучше, чем умножить на 1-F?