1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-03 17:56:21 +03:00
occt/src/Graphic3d/Graphic3d_BSDF.hxx
dbp 05aa616d6d 0028218: Visualization, Path Tracing - Redesign path tracing materials to support two-layered model
Existing OCCT path tracing engine used very simple additive material (BSDF) model, so it was possible to reproduce
behavior only of very basic materials such as metal, glass, or plastic. However, some important in CAD industry
materials like car paint or ceramic could not be modeled well. In this patch, OCCT BSDF was significantly improved
by replacing additive model with two-layered scattering model. Therefore, we have base diffuse, glossy, or transmissive
layer, covered by one glossy/specular coat. The layers themselves have no thickness; they can simply reflect light or
transmits it to the layer under it. Balancing different combinations of layer properties can produce a wide range of
different effects. At the same time, disabling the first (coat) layer allows to keep full compatibility with previously
supported scattering model. All new parameters are available via 'vbsdf' command.

Location of new sample for few material examples:
samples\tcl\pathtrace_materials.tcl

Fix shader compilation issue.

Fix test case sample_ball_alpha.

Shaders_PathtraceBase_fs.pxx - regenerate resource from origin
2017-03-03 16:11:21 +03:00

186 lines
6.5 KiB
C++

// Created on: 2015-01-15
// Created by: Danila ULYANOV
// Copyright (c) 2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef _Graphic3d_BSDF_HeaderFile
#define _Graphic3d_BSDF_HeaderFile
#include <Graphic3d_Vec3.hxx>
#include <Graphic3d_Vec4.hxx>
//! Type of the Fresnel model.
enum Graphic3d_FresnelModel
{
Graphic3d_FM_SCHLICK = 0,
Graphic3d_FM_CONSTANT = 1,
Graphic3d_FM_CONDUCTOR = 2,
Graphic3d_FM_DIELECTRIC = 3
};
//! Describes Fresnel reflectance parameters.
class Graphic3d_Fresnel
{
public:
//! Creates uninitialized Fresnel factor.
Graphic3d_Fresnel() : myFresnelType (Graphic3d_FM_CONSTANT)
{
// ideal specular reflector
myFresnelData = Graphic3d_Vec3 (0.f, 1.f, 0.f);
}
//! Creates Schlick's approximation of Fresnel factor.
static Graphic3d_Fresnel CreateSchlick (const Graphic3d_Vec3& theSpecularColor)
{
return Graphic3d_Fresnel (Graphic3d_FM_SCHLICK, theSpecularColor);
}
//! Creates Fresnel factor for constant reflection.
static Graphic3d_Fresnel CreateConstant (const Standard_ShortReal theReflection)
{
return Graphic3d_Fresnel (Graphic3d_FM_CONSTANT, Graphic3d_Vec3 (0.f, 1.f, theReflection));
}
//! Creates Fresnel factor for physical-based dielectric model.
static Graphic3d_Fresnel CreateDielectric (Standard_ShortReal theRefractionIndex)
{
return Graphic3d_Fresnel (Graphic3d_FM_DIELECTRIC, Graphic3d_Vec3 (0.f, theRefractionIndex, 0.f));
}
//! Creates Fresnel factor for physical-based conductor model.
static Graphic3d_Fresnel CreateConductor (Standard_ShortReal theRefractionIndex,
Standard_ShortReal theAbsorptionIndex)
{
return Graphic3d_Fresnel (Graphic3d_FM_CONDUCTOR, Graphic3d_Vec3 (0.f, theRefractionIndex, theAbsorptionIndex));
}
//! Creates Fresnel factor for physical-based conductor model (spectral version).
Standard_EXPORT static Graphic3d_Fresnel CreateConductor (const Graphic3d_Vec3& theRefractionIndex,
const Graphic3d_Vec3& theAbsorptionIndex);
public:
//! Returns serialized representation of Fresnel factor.
Standard_EXPORT Graphic3d_Vec4 Serialize() const;
//! Performs comparison of two objects describing Fresnel factor.
bool operator== (const Graphic3d_Fresnel& theOther) const
{
return myFresnelType == theOther.myFresnelType
&& myFresnelData == theOther.myFresnelData;
}
//! Returns type of Fresnel.
Graphic3d_FresnelModel FresnelType() const
{
return myFresnelType;
}
protected:
//! Creates new Fresnel reflectance factor.
Graphic3d_Fresnel (Graphic3d_FresnelModel theType, const Graphic3d_Vec3& theData)
: myFresnelType (theType),
myFresnelData (theData)
{
//
}
private:
//! Type of Fresnel approximation.
Graphic3d_FresnelModel myFresnelType;
//! Serialized parameters of specific approximation.
Graphic3d_Vec3 myFresnelData;
};
//! Describes material's BSDF (Bidirectional Scattering Distribution Function) used
//! for physically-based rendering (in path tracing engine). BSDF is represented as
//! weighted mixture of basic BRDFs/BTDFs (Bidirectional Reflectance (Transmittance)
//! Distribution Functions).
//!
//! NOTE: OCCT uses two-layer material model. We have base diffuse, glossy, or transmissive
//! layer, covered by one glossy/specular coat. In the current model, the layers themselves
//! have no thickness; they can simply reflect light or transmits it to the layer under it.
//! We use actual BRDF model only for direct reflection by the coat layer. For transmission
//! through this layer, we approximate it as a flat specular surface.
class Graphic3d_BSDF
{
public:
//! Weight of coat specular/glossy BRDF.
Graphic3d_Vec4 Kc;
//! Weight of base diffuse BRDF.
Graphic3d_Vec3 Kd;
//! Weight of base specular/glossy BRDF.
Graphic3d_Vec4 Ks;
//! Weight of base specular/glossy BTDF.
Graphic3d_Vec3 Kt;
//! Radiance emitted by the surface.
Graphic3d_Vec3 Le;
//! Volume scattering color/density.
Graphic3d_Vec4 Absorption;
//! Parameters of Fresnel reflectance of coat layer.
Graphic3d_Fresnel FresnelCoat;
//! Parameters of Fresnel reflectance of base layer.
Graphic3d_Fresnel FresnelBase;
public:
//! Creates BSDF describing diffuse (Lambertian) surface.
static Standard_EXPORT Graphic3d_BSDF CreateDiffuse (const Graphic3d_Vec3& theWeight);
//! Creates BSDF describing polished metallic-like surface.
static Standard_EXPORT Graphic3d_BSDF CreateMetallic (const Graphic3d_Vec3& theWeight,
const Graphic3d_Fresnel& theFresnel,
const Standard_ShortReal theRoughness);
//! Creates BSDF describing transparent object.
//! Transparent BSDF models simple transparency without
//! refraction (the ray passes straight through the surface).
static Standard_EXPORT Graphic3d_BSDF CreateTransparent (const Graphic3d_Vec3& theWeight,
const Graphic3d_Vec3& theAbsorptionColor,
const Standard_ShortReal theAbsorptionCoeff);
//! Creates BSDF describing glass-like object.
//! Glass-like BSDF mixes refraction and reflection effects at
//! grazing angles using physically-based Fresnel dielectric model.
static Standard_EXPORT Graphic3d_BSDF CreateGlass (const Graphic3d_Vec3& theWeight,
const Graphic3d_Vec3& theAbsorptionColor,
const Standard_ShortReal theAbsorptionCoeff,
const Standard_ShortReal theRefractionIndex);
public:
//! Creates uninitialized BSDF.
Standard_EXPORT Graphic3d_BSDF();
//! Normalizes BSDF components.
Standard_EXPORT void Normalize();
//! Performs comparison of two BSDFs.
Standard_EXPORT bool operator== (const Graphic3d_BSDF& theOther) const;
};
#endif // _Graphic3d_BSDF_HeaderFile