MixMaterial 类
class MixMaterial : public Material {
public:
// MixMaterial Public Methods
MixMaterial(Reference<Material> mat1, Reference<Material> mat2,
Reference<Texture<Spectrum> > sc)
: m1(mat1), m2(mat2), scale(sc) {
}
BSDF *GetBSDF(const DifferentialGeometry &dgGeom,
const DifferentialGeometry &dgShading,
MemoryArena &arena) const;
private:
// MixMaterial Private Data
Reference<Material> m1, m2;
Reference<Texture<Spectrum> > scale;
};
作用:
(混合两个材质,参数 Texture scale 保存的是混合的权重)
It’s useful to be able to combine two Materials with a varying weight. The MixMaterial
takes two other Materials and a Spectrum-valued texture; it uses the Spectrum returned
by the texture to blend between the two materials at the point being shaded.
1. BSDF *GetBSDF(const DifferentialGeometry &dgGeom,
const DifferentialGeometry &dgShading,
MemoryArena &arena) const;
BSDF *MixMaterial::GetBSDF(const DifferentialGeometry &dgGeom,
const DifferentialGeometry &dgShading,
MemoryArena &arena) const {
BSDF *b1 = m1->GetBSDF(dgGeom, dgShading, arena);
BSDF *b2 = m2->GetBSDF(dgGeom, dgShading, arena);
Spectrum s1 = scale->Evaluate(dgShading).Clamp();
Spectrum s2 = (Spectrum(1.f) - s1).Clamp();
int n1 = b1->NumComponents(), n2 = b2->NumComponents();
for (int i = 0; i < n1; ++i)
b1->bxdfs[i] = BSDF_ALLOC(arena, ScaledBxDF)(b1->bxdfs[i], s1);
for (int i = 0; i < n2; ++i)
b1->Add(BSDF_ALLOC(arena, ScaledBxDF)(b2->bxdfs[i], s2));
return b1;
}
作用:
(思路:先利用 s1 来 缩放 第一个材质的所有BxDF,第二个材质的所有BxDF经过 s2 缩放的,再添加到第一个材质中,最后返回第一个材质,这样就形成了混合的效果)
MixMaterial::GetBSDF() gets BSDF *s from the two materials. It scales BxDFs in the BSDF
from the first material, b1, using the ScaledBxDF adapter class, and then scales the BxDFs
from the second BSDF, adding them to b1. It may appear that there’s a lurking memory
leak in this code, in that the BxDF *s in b1->bxdfs are clobbered by newly allocated
ScaledBxDFs. However, recall that those BxDFs, like the new ones here, were allocated
through a MemoryArena and will thus be freed when the MemoryArena frees its entire block
of memory.