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

推荐订阅源

S
Schneier on Security
有赞技术团队
有赞技术团队
T
The Blog of Author Tim Ferriss
F
Fortinet All Blogs
D
DataBreaches.Net
F
Full Disclosure
腾讯CDC
博客园 - 【当耐特】
MyScale Blog
MyScale Blog
Stack Overflow Blog
Stack Overflow Blog
小众软件
小众软件
Hugging Face - Blog
Hugging Face - Blog
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
爱范儿
爱范儿
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
大猫的无限游戏
大猫的无限游戏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
SegmentFault 最新的问题
The Register - Security
The Register - Security
WordPress大学
WordPress大学
博客园 - 聂微东
雷峰网
雷峰网
J
Java Code Geeks
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Privacy International News Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
A
Arctic Wolf
Scott Helme
Scott Helme
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tor Project blog
博客园 - 三生石上(FineUI控件)
Know Your Adversary
Know Your Adversary
AWS News Blog
AWS News Blog
G
Google Developers Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
CERT Recently Published Vulnerability Notes
O
OpenAI News
Project Zero
Project Zero
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Application and Cybersecurity Blog
Application and Cybersecurity Blog
云风的 BLOG
云风的 BLOG
N
News and Events Feed by Topic
MongoDB | Blog
MongoDB | Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Microsoft Security Blog
Microsoft Security Blog
Cisco Talos Blog
Cisco Talos Blog
P
Palo Alto Networks Blog
Schneier on Security
Schneier on Security

博客园 - gearslogy

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