PBRT_V2 总结记录 <34> Blinn 和 Anisotropic

概述

这里的两个类主要是 上一节中所说的,MicrofacetDistribution 的子类,MicrofacetDistribution 主要代表的是 D 函数,

D(wh):distribution function D(ωh) that gives the probability that a microfacet has orientation ωh (判断一个 microfacets  的法线等于 wh 的 概率)

 

1. Blinn

(D 函数的 : wh 朝向 法线的概率比较大,概率一直下降,直到 wh 朝向 切线 的时候,概率为0)

Blinn (1977) proposed a model where the distribution of microfacet normals is approximated
by an exponential falloff. The most likely microfacet orientation in this model is
in the surface normal direction, falling off to no microfacets oriented perpendicular to
the normal.
For smooth surfaces, this falloff happens very quickly; for rough surfaces, it
is more gradual.

 

Figure 8.18: The Effect of Varying the Exponent for the Blinn Microfacet Distribution Model. (a) Distribution from exponent
e = 4, (b) e = 20. The larger the exponent, the more likely it is that a microfacet will be oriented close to the surface normal, as
would be the case for a smooth surface.

 

BRDF 就是:

 

Blinn 类:

class Blinn : public MicrofacetDistribution {
public:
    Blinn(float e) { if (e > 10000.f || isnan(e)) e = 10000.f;
                     exponent = e; }
    // Blinn Public Methods
    float D(const Vector &wh) const {
        float costhetah = AbsCosTheta(wh);
        return (exponent+2) * INV_TWOPI * powf(costhetah, exponent);
    }
    virtual void Sample_f(const Vector &wi, Vector *sampled_f, float u1, float u2, float *pdf) const;
    virtual float Pdf(const Vector &wi, const Vector &wo) const;
private:
    float exponent;
};

重点主要是 D 函数,其实就是翻译上面的公式。

 

 

2. Anisotropic

Because the Blinn distribution described in the last section only depends on the angle
between the half-angle and the surface normal, it is radially symmetric and yields an
isotropic BRDF. Ashikhmin and Shirley (2000, 2002) developed a microfacet distribution
function for modeling the appearance of anisotropic(各向异性) surfaces. Recall that an anisotropic
BRDF is one where the reflection characteristics at a point vary as the surface is rotated
about that point in the plane perpendicular to the surface normal. Brushed(磨砂) metals(金属) and
some types of fabric(布) exhibit anisotropy.

Their model takes two parameters: ex, which gives an exponent for the distribution function for half-angle vectors with
an azimuthal angle that orients them exactly along the x axis, and ey, an exponent for
microfacets oriented along the y axis. Exponents for intermediate orientations are found
by considering these two values as the lengths of the axes of an ellipse and finding the
appropriate radius for the actual microfacet orientation (Figure 8.19).

 

Figure 8.19: The two exponents ex and ey for the anisotropic microfacet distribution function give
specular exponents for microfacets facing exactly along the x and y axes, respectively. For microfacets
with other orientations, the exponent e is computed by finding the radius e of the ellipse for the actual
orientation angle φ.

 

 BRDF:

 

The terms of the distribution function can be computed quite efficiently. Recall from the
beginning of the chapter that cos φ = x/ sin θ and sin φ = y/ sin θ. Since we want to
compute cos^2 φ and sin^2 φ, however, we can use the substitution sin^2 θ + cos^2 θ = 1, so
that

 

Anisotropic 类


class Anisotropic : public MicrofacetDistribution {
public:
    // Anisotropic Public Methods
    Anisotropic(float x, float y) {
        ex = x; ey = y;
        if (ex > 10000.f || isnan(ex)) ex = 10000.f;
        if (ey > 10000.f || isnan(ey)) ey = 10000.f;
    }
    float D(const Vector &wh) const {
        float costhetah = AbsCosTheta(wh);
        float d = 1.f - costhetah * costhetah;
        if (d == 0.f) return 0.f;
        float e = (ex * wh.x * wh.x + ey * wh.y * wh.y) / d;
        return sqrtf((ex+2.f) * (ey+2.f)) * INV_TWOPI * powf(costhetah, e);
    }
    void Sample_f(const Vector &wo, Vector *wi, float u1, float u2, float *pdf) const;
    float Pdf(const Vector &wo, const Vector &wi) const;
    void sampleFirstQuadrant(float u1, float u2, float *phi, float *costheta) const;
private:
    float ex, ey;
};

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值