AlgebraMaster

Modern C++ 改变世界

导航

PBRT 蒙特卡洛采样

1 InfiniteAreaLight经常用来模拟环境光照

核心就是我如何在贡献大的地方重要性采样

当然是依赖概率论CDF

首先我在Houdini模拟了一次 环境光到 采样点的可视化

01_atan2

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

image

 原理就是:

image

 

image

 

// 模拟 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主要利用多维转换 

image

image

 

UniformDiskSampling的数学知识

image

 

image

 

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

image

 4: UniformHemisphereSampling

image

 5 UniformSampleCone and PDF

动画

 

image

 

image

 

posted on 2026-04-02 12:39  gearslogy  阅读(11)  评论(0)    收藏  举报