


























1 InfiniteAreaLight经常用来模拟环境光照
核心就是我如何在贡献大的地方重要性采样
当然是依赖概率论CDF
首先我在Houdini模拟了一次 环境光到 采样点的可视化

投掷u 0-1区间,然后把CDF求出来:

原理就是:


// 模拟 std::lower_bound 的逻辑 int lower_bound_vex(float search_array[]; float target) { int low = 0; int high = len(search_array); while (low < high) { int mid = low + (high - low) / 2; if (search_array[mid] < target) low = mid + 1; else high = mid; } return low; } int upper_bound_vex(float array[]; float target) { int low = 0; int high = len(array); while (low < high) { int mid = low + (high - low) / 2; // 注意这里:如果中间值小于或等于目标值,则向右搜索 // 这样最后剩下来的 low 就是第一个严格大于 target 的位置 if (array[mid] <= target) low = mid + 1; else high = mid; } return low; } int nprims = nprimitives(0); float cdf[] ; resize(cdf, nprims+1); cdf[0] = 0; for(int i= 1; i < nprims+1; i++){ float func = prim(0, "func", i-1 ); cdf[i] = cdf[i-1] + func ; } @funcInt = cdf[nprims]; // 归一化 CDF 数组 (采样必须在归一化空间或同步空间) for(int i = 0; i < len(cdf); i++){ cdf[i] /= @funcInt; } for(int i=0;i<chi("npts");i++){ float u = rand(float(i) + 142.234 ); int offset = upper_bound_vex(cdf, u)-1; float n0 = rand(float(i) + 3442.234 ); float n1 = rand(float(i) + 131442.234 ); vector p = primuv(0, "P", offset, set(n0,n1,0) ); int pt = addpoint(0, p); setpointgroup(1, "pt_grp", pt, 1); }
2:极坐标下的分布
这是个高维分布。之前已知copy别人代码,现在在AI加持下 终于自己可以证明一番
pbrt主要利用多维转换


UniformDiskSampling的数学知识



vector UniformSampleDisk(float u1; float u2) { float r = sqrt(u1); float theta = 2.0f * M_PI * u2; float x = r * cos(theta); float y = r * sin(theta); return set(x,0,y); } for(int i=0;i<1020;i++){ addpoint(0, UniformSampleDisk(rand(i+0.23) , rand(i+213.45) ) ); }
View Code
3: UniformSphereSampling

4: UniformHemisphereSampling

5 UniformSampleCone and PDF



此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。