惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
博客园 - 【当耐特】
M
MIT News - Artificial intelligence
月光博客
月光博客
博客园_首页
博客园 - 叶小钗
T
Tailwind CSS Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
I
InfoQ
量子位
小众软件
小众软件
爱范儿
爱范儿
The GitHub Blog
The GitHub Blog
IT之家
IT之家
Jina AI
Jina AI
阮一峰的网络日志
阮一峰的网络日志
G
Google Developers Blog
WordPress大学
WordPress大学
人人都是产品经理
人人都是产品经理
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
J
Java Code Geeks
云风的 BLOG
云风的 BLOG
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

博客园 - gearslogy

PCG建筑开发 Houdini HDANC -> HDA Houdini NC HDA -> HDA BRDF是BSSRDF的一个特殊形式 来自伟大的AI UE5.7编辑器扩展 PBRT中的RayDifferentials Unreal Fur 假毛发 草地 Grass PBRT v2中,隐士表面、三角形的dpdu dpdv dndu dndv 思考 Houdini Vulkan HeightBlend 高度混合 Indexmap Vulkan矩形绘制顺序小坑 C++ Runtime Reflection QML NextQT 随手 HDK门格海绵 clang reflection Master LLVM GEP 类型擦除TypeErase Qt问题记录 现代CPP设计模式 CPP2nd CRTP Facade 模式 billboard暴力实现 Fibonacci各种玩法 ubuntu升级编译器
PBRT 蒙特卡洛采样
gearslogy · 2026-04-02 · via 博客园 - gearslogy

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