microfacet.h: roughness clamping

metadata
Wenzel Jakob 2014-08-04 14:32:28 +02:00
parent a5c574f98d
commit 80cf245b68
2 changed files with 13 additions and 1 deletions

View File

@ -114,7 +114,7 @@ inline int roundToInt(float value) {
/// Integer round function (double precision)
inline int roundToInt(double value) {
#if defined(__MSVC__)
return (int) (value < 0.0f ? std::ceil(value - 0.5f) : std::floor(value + 0.5f));
return (int) (value < 0.0 ? std::ceil(value - 0.5) : std::floor(value + 0.5));
#else
return (int) ::round(value);
#endif

View File

@ -67,6 +67,8 @@ public:
inline MicrofacetDistribution(EType type, Float alpha, bool sampleVisible = true)
: m_type(type), m_alphaU(alpha), m_alphaV(alpha), m_sampleVisible(sampleVisible),
m_exponentU(0.0f), m_exponentV(0.0f) {
m_alphaU = std::max(m_alphaU, (Float) 1e-4f);
m_alphaV = std::max(m_alphaV, (Float) 1e-4f);
if (m_type == EPhong)
computePhongExponent();
}
@ -84,6 +86,8 @@ public:
inline MicrofacetDistribution(EType type, Float alphaU, Float alphaV, bool sampleVisible = true)
: m_type(type), m_alphaU(alphaU), m_alphaV(alphaV), m_sampleVisible(sampleVisible),
m_exponentU(0.0f), m_exponentV(0.0f) {
m_alphaU = std::max(m_alphaU, (Float) 1e-4f);
m_alphaV = std::max(m_alphaV, (Float) 1e-4f);
if (m_type == EPhong)
computePhongExponent();
}
@ -123,6 +127,14 @@ public:
m_alphaV = props.getFloat("alphaV");
}
if (m_alphaU == 0 || m_alphaV == 0) {
SLog(EWarn, "Cannot create a microfacet distribution with alphaU/alphaV=0 (clamped to 0.0001)."
"Please use the corresponding smooth reflectance model to get zero roughness.");
}
m_alphaU = std::max(m_alphaU, (Float) 1e-4f);
m_alphaV = std::max(m_alphaV, (Float) 1e-4f);
m_sampleVisible = props.getBoolean("sampleVisible", sampleVisible);
/* Visible normal sampling is not supported for the Phong / Ashikhmin-Shirley distribution */