Photon Engine 2.0.0-beta
A physically based renderer.
Loading...
Searching...
No Matches
ph::IsoBeckmann Class Reference

Isotropic Beckmann distribution. See the paper "Microfacet Models for Refraction through Rough Surfaces" by Walter et al. [18]. More...

#include <IsoBeckmann.h>

Inheritance diagram for ph::IsoBeckmann:
ph::ShapeInvariantMicrofacet ph::Microfacet

Public Member Functions

 IsoBeckmann (real alpha, EMaskingShadowing maskingShadowingType)
 
std::array< real, 2 > getAlphas (const SurfaceHit &X) const override
 
real lambda (const SurfaceHit &X, const math::Vector3R &N, const math::Vector3R &H, const math::Vector3R &unitDir, const std::array< real, 2 > &alphas) const override
 The \( \Lambda \left( a \right) \) function that appears in the masking-shadowing term. For isotropic distributions, the variable \( a \) is normally calculated as \( a = \frac{1}{\alpha \tan \left( \theta \right)} \), where \( \frac{1}{\tan \left( \theta \right)} \) is the slope of the unit direction unitDir (with respect to the macrosurface normal N. For anisotropic distributions, see the implementation of AnisoTrowbridgeReitz as an example for calculating \( a \) from the parameters.
 
real distribution (const SurfaceHit &X, const math::Vector3R &N, const math::Vector3R &H) const override
 Distribution of the microfacet normal. The \( D \) term. Also commonly knwon as the NDF (normal distribution function). This term is defined in the half-angle/microfacet space (the angle between N and H) unless otherwise noted.
 
void sampleH (const SurfaceHit &X, const math::Vector3R &N, const std::array< real, 2 > &sample, math::Vector3R *out_H) const override
 Generate a microfacet normal H for the distribution. This samples all possible H vectors for the distribution.
 
- Public Member Functions inherited from ph::ShapeInvariantMicrofacet
 ShapeInvariantMicrofacet (EMaskingShadowing maskingShadowingType)
 
real geometry (const SurfaceHit &X, const math::Vector3R &N, const math::Vector3R &H, const math::Vector3R &L, const math::Vector3R &V) const override
 Masking and shadowing due to nearby microfacets. The \( G \) term.
 
lta::PDF pdfSampleH (const SurfaceHit &X, const math::Vector3R &N, const math::Vector3R &H) const override
 
- Public Member Functions inherited from ph::Microfacet
virtual ~Microfacet ()=default
 
virtual void sampleVisibleH (const SurfaceHit &X, const math::Vector3R &N, const math::Vector3R &V, const std::array< real, 2 > &sample, math::Vector3R *out_H) const
 Same as sampleH(), but tries to take geometry term into consideration. This samples only potentially visible H vectors for the distribution. If unable to fully or partly incorporate visibility information from the geometry term, this method will fallback to sampleH().
 
virtual lta::PDF pdfSampleVisibleH (const SurfaceHit &X, const math::Vector3R &N, const math::Vector3R &H, const math::Vector3R &V) const
 

Additional Inherited Members

- Protected Member Functions inherited from ph::ShapeInvariantMicrofacet
real smithG1 (real lambdaValue) const
 
real empiricalPhiCorrelation (const SurfaceHit &X, const math::Vector3R &L, const math::Vector3R &V) const
 
real projectedDistribution (const SurfaceHit &X, const math::Vector3R &N, const math::Vector3R &H) const
 
real visibleDistribution (const SurfaceHit &X, const math::Vector3R &N, const math::Vector3R &H, const math::Vector3R &V) const
 
- Static Protected Member Functions inherited from ph::Microfacet
static bool isSidednessAgreed (real NoD, real HoD)
 
static bool isSidednessAgreed (real NoL, real NoV, real HoL, real HoV)
 
- Protected Attributes inherited from ph::ShapeInvariantMicrofacet
EMaskingShadowing m_maskingShadowingType
 

Detailed Description

Isotropic Beckmann distribution. See the paper "Microfacet Models for Refraction through Rough Surfaces" by Walter et al. [18].

Constructor & Destructor Documentation

◆ IsoBeckmann()

ph::IsoBeckmann::IsoBeckmann ( real alpha,
EMaskingShadowing maskingShadowingType )

Member Function Documentation

◆ distribution()

real ph::IsoBeckmann::distribution ( const SurfaceHit & X,
const math::Vector3R & N,
const math::Vector3R & H ) const
overridevirtual

Distribution of the microfacet normal. The \( D \) term. Also commonly knwon as the NDF (normal distribution function). This term is defined in the half-angle/microfacet space (the angle between N and H) unless otherwise noted.

Parameters
HThe microfacet normal.
Remarks
Do not treat this term as the probability density of microfacet normal over solid angle.

Implements ph::ShapeInvariantMicrofacet.

◆ getAlphas()

std::array< real, 2 > ph::IsoBeckmann::getAlphas ( const SurfaceHit & X) const
inlineoverridevirtual
Returns
\( \left( \alpha_u, \alpha_v \right) \) in the U and V directions of the macrosirface parametrization. Guaranteed to have \( \alpha_u = \alpha_v \) for an isotropic distribution.

Implements ph::ShapeInvariantMicrofacet.

◆ lambda()

real ph::IsoBeckmann::lambda ( const SurfaceHit & X,
const math::Vector3R & N,
const math::Vector3R & H,
const math::Vector3R & unitDir,
const std::array< real, 2 > & alphas ) const
overridevirtual

The \( \Lambda \left( a \right) \) function that appears in the masking-shadowing term. For isotropic distributions, the variable \( a \) is normally calculated as \( a = \frac{1}{\alpha \tan \left( \theta \right)} \), where \( \frac{1}{\tan \left( \theta \right)} \) is the slope of the unit direction unitDir (with respect to the macrosurface normal N. For anisotropic distributions, see the implementation of AnisoTrowbridgeReitz as an example for calculating \( a \) from the parameters.

Note
This method does not handle sidedness agreement.

Implements ph::ShapeInvariantMicrofacet.

◆ sampleH()

void ph::IsoBeckmann::sampleH ( const SurfaceHit & X,
const math::Vector3R & N,
const std::array< real, 2 > & sample,
math::Vector3R * out_H ) const
overridevirtual

Generate a microfacet normal H for the distribution. This samples all possible H vectors for the distribution.

Parameters
out_HThe generated microfacet normal.
Remarks
Use pdfSampleH() for the probability density of sampling the generated H. distribution() is not a probability density of microfacet normal.

Implements ph::ShapeInvariantMicrofacet.


The documentation for this class was generated from the following files: