UnityStandardBRDF中GGX實(shí)現(xiàn)疑問

// Ref: http://jcgt.org/published/0003/02/03/paper.pdf
//GGX可見性項V
//G(l,v,h)=G1(l)G1(v)
inline half SmithJointGGXVisibilityTerm (half NdotL, half NdotV, half roughness)
{
//#if 0分支不會被執(zhí)行,執(zhí)行下面的簡化
#if 0
    //原始公式
    //根據(jù)GGX的G(l,v,h)公式,分子分母同時除2*NdotL/2*NdotV,最后的結(jié)果分母可以整理成(1 + sqrt(a2 * (1 - NdotL2) / NdotL2 + 1)) * 0.5f;
    //疑問:下方的值計算不一致,以及最后G的值計算是否有問題
    // Original formulation:
    //  lambda_v    = (-1 + sqrt(a2 * (1 - NdotL2) / NdotL2 + 1)) * 0.5f;
    //  lambda_l    = (-1 + sqrt(a2 * (1 - NdotV2) / NdotV2 + 1)) * 0.5f;
    //  G           = 1 / (1 + lambda_v + lambda_l);

    // Reorder code to be more optimal
    half a          = roughness; 
    half a2         = a * a;
    //重排代碼為何會出現(xiàn)NdotL,NdotV混用?
    half lambdaV    = NdotL * sqrt((-NdotV * a2 + NdotV) * NdotV + a2);
    half lambdaL    = NdotV * sqrt((-NdotL * a2 + NdotL) * NdotL + a2);
    //簡化的可見性項
    //((4.0f * NdotL * NdotV)
    // Simplify visibility term: (2.0f * NdotL * NdotV) /  ((4.0f * NdotL * NdotV) * (lambda_v + lambda_l + 1e-5f));
    return 0.5f / (lambdaV + lambdaL + 1e-5f);  // This function is not intended to be running on Mobile,
                                                // therefore epsilon is smaller than can be represented by half
#else
    //上述公式的近似,簡化了sqrt,數(shù)學(xué)不正確但足夠接近
    // Approximation of the above formulation (simplify the sqrt, not mathematically correct but close enough)
    half a = roughness;
    half lambdaV = NdotL * (NdotV * (1 - a) + a);
    half lambdaL = NdotV * (NdotL * (1 - a) + a);

    return 0.5f / (lambdaV + lambdaL + 1e-5f);
#endif
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容