MIPMap: be more resilient to infinities

metadata
Wenzel Jakob 2010-10-16 15:24:47 +02:00
parent df0600eccd
commit 917c142312
1 changed files with 6 additions and 3 deletions

View File

@ -262,7 +262,10 @@ Spectrum MIPMap::getValue(const Intersection &its) const {
if (minorLength == 0)
return triangle(0, its.uv.x, its.uv.y);
Float lod = std::max((Float) 0, m_levels - 1 + log2(minorLength));
// The min() below avoids overflow in the int conversion when lod=inf
Float lod =
std::min(std::max((Float) 0, m_levels - 1 + log2(minorLength)),
(Float) (m_levels-1));
int ilod = (int) std::floor(lod);
Float d = lod - ilod;
@ -276,7 +279,7 @@ Spectrum MIPMap::EWA(Float u, Float v, Float dudx, Float dudy, Float dvdx,
++ewaLookups;
if (level >= m_levels)
return getTexel(m_levels-1, 0, 0);
Spectrum result(0.0f);
Float denominator = 0.0f;
u = u * m_levelWidth[level]; v = v * m_levelHeight[level];
@ -302,7 +305,7 @@ Spectrum MIPMap::EWA(Float u, Float v, Float dudx, Float dudy, Float dvdx,
const Float r2 = A*uu*uu + B*uu*vv + C*vv*vv;
if (r2 < 1) {
const Float weight = m_weightLut[
std::min((int) (r2 * MIPMAP_LUTSIZE), MIPMAP_LUTSIZE - 1)];
std::max(0, std::min((int) (r2 * MIPMAP_LUTSIZE), MIPMAP_LUTSIZE - 1))];
result += getTexel(level, ut, vt) * weight;
denominator += weight;
}