📄 zdepth.c
字号:
/* * Name (person to blame): Andrew Woo * Gem: Article 7.1, "The Shadow Depth Map Revisited" * Affiliation: Alias Research, Style! Division */#include <math.h>/*********************************************** Reeves' SampleShadow code using BIAS************************************************/#define REEVES_APPROACH { \ inshadow = 0; \ for (i = 0, s = smin; i < ns; i++, s += ds) { \ for (j = 0, t = tmin; j < nt; j++, t += dt) { \ iu = s + Rand()*js; /* jitter s, t */ \ iv = t + Rand()*jt; \ \ bias = Rand() * (Bias1 - Bias0) + Bias0; /* pick bias */ \ if (iu >= bbox->r_umin && iu <= bbox->r_umax && \ iv >= bbox->r_vmin && iv <= bbox->r_vmax) \ if (z > depthMap[iu][iv] + bias) inshadow++; \ } \ } \}/*********************************************** New SampleShadow code with no BIAS and doing integer comparisons for depth values first.************************************************/#define NEW_APPROACH { \ register int integerZ = (int) z, intDepth; \ register float depthValue; \ inshadow = 0; \ \ for (i = 0, s = smin; i < ns; i++, s += ds) { \ for (j = 0, t = tmin; j < nt; j++, t += dt) { \ iu = s + Rand()*js; \ iv = t + Rand()*jt; \ if (iu >= bbox->r_umin && iu <= bbox->r_umax && \ iv >= bbox->r_vmin && iv <= bbox->r_vmax) { \ /* do integer comparison first */ \ depthValue = depthMap[iu][iv]; \ intDepth = (int) depthValue; \ if ((integerZ > intDepth) || \ (integerZ == intDepth && z > depthValue)) \ inshadow++; \ } else { \ /* boundary case error */ \ inshadow++; \ } \ } \ } \}/* Start of Reeves' code in Siggraph 87 paper */float ResFactor = 3;float MinSize = 0;float Bias0 = 0.3;float Bias1 = 0.4;int NumSamples = 16;int MinSamples = 1;#define MAPRES 256 /* I tested the code at 256x256 */float depthMap[MAPRES][MAPRES];#define CLAMP(a,min,max) (a<min?min:(a>max?max:a))float Rand();typedef struct { int r_umin, r_umax; int r_vmin, r_vmax;} TextureRect;float SampleShadow (s, t, z, sres, tres, bbox)float s, t, z, sres, tres;TextureRect *bbox;{ int i, j, inshadow, iu, iv, ns, nt, lu, hu, lv, hv; float smin, tmin, ds, dt, js, jt; /* convert to coordinates of depth map */ sres = MAPRES * sres * ResFactor; tres = MAPRES * tres * ResFactor; if (sres < MinSize) sres = MinSize; if (tres < MinSize) tres = MinSize; s *= MAPRES; t *= MAPRES; /* cull if outside bounding box */ lu = floor (s-sres); hu = ceil (s+sres); lv = floor (t-tres); hv = ceil (t+tres); if (lu > bbox->r_umax || hu < bbox->r_umin || lv > bbox->r_vmax || hv < bbox->r_vmin) return (1.0); /* error in Reeves' code at boundary cases */ /* calculate number of samples */ if (sres*tres*4 < NumSamples) { ns = sres + sres + 0.5; ns = CLAMP(ns, MinSamples, NumSamples); nt = tres + tres + 0.5; nt = CLAMP(nt, MinSamples, NumSamples); } else { nt = sqrt(tres*NumSamples/sres) + 0.5; nt = CLAMP(nt, MinSamples, NumSamples); ns = ((float)NumSamples)/nt + 0.5; ns = CLAMP(ns, MinSamples, NumSamples); } /* setup jitter variables */ ds = 2*sres/ns; dt = 2*tres/nt; js = ds*.5; jt = dt*.5; smin = s - sres + js; tmin = t - tres + jt; /* decide which version you want... */#ifdef OLD_WAY REEVES_APPROACH;#else NEW_APPROACH;#endif return (((float) inshadow) / (ns*nt));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -