当前位置: 首页 > news >正文

图形学数学基础之Hammersley采样

图形学数学基础之Hammersley采样

https://blog.csdn.net/i_dovelemon/article/details/76599923

图形学数学基础之Hammersley采样

2017年08月03日 00:05:37 i_dovelemon 阅读数:1243 标签: 图形 数学 算法 更多

个人分类: 3D引擎 游戏开发 Shader Ray Tracing

作者:i_dovelemon
日期:2017/08/02
来源:CSDN
主题:hammersley,binary

引言

在图形学里面,用到了很多的采样算法。特别当你在写一个光线追踪器的时候,会使用大量的采样算法来对BRDF,光源等进行采样。这些采样操作,一般是先通过创建一个具有均匀分布的2D随机点集合,然后通过变换,将这些2D随机点变换到具体的采样数据上去,如BRDF的方向等等。关于这部分变换和相应的原理,后面会有相应的章节来讲解,今天我们先来了解一个在实现PBR中,经常被使用到的均匀分布的2D随机采样方式–Hammersley采样。

Hammersley采样

Hammersley采样,听上去好像很深奥的样子,实际上是一个十分简单的操作。

我们知道,在计算机里面大量使用了二进制来表示数据,如下表所示的一些十进制与二进制的对应关系:

十进制二进制
11
210
311
4100


而Hammersley采样就是利用计算机使用二进制表示的特性,来构造均匀分布的2D随机采样点。它是通过对一个二进制数进行Radical Inverse方法,来构造出一个值来实现的。它的过程如下表:
 

十进制二进制Radical Inverse
11.1 = 1 * 1/20.5
210.01 = 0 * 1/2 + 1 * 1/40.25
311.11 = 1 * 1/2 + 1 * 1/40.75
4100.001 = 0 * 1/2 + 0 * 1/4 + 1 * 1/80.125


从上表可以看到,Radical Inverse方法,就是简单的将给定的十进制数的二进制表示方法,反过来放在小数点之后,构造一个在[0,1]之间的值。

在明白了Radical Inverse方法之后,我们就可以构造hammersley的2D随机分布的采样点集合,如下所示:

pi=(xi,yi)=(i/N,ϕ(i))


其中N表示的是一共有多少个采样点,ϕ(i)就是对i进行Radical Inverse之后的值。

在我的raytracer项目中,使用了hammersley采样,有相关的代码可供参考,如下所示:

 

class HammersleySampler(Sampler):
    def __init__(self):
        super().__init__(Sampler.MULTIJITTERED)

    def radicalInverseBase2(self, v):
        x = 0.0
        f = 0.5
        v = int(v)
        while v != 0:
            x += f * (v & 1)
            v = math.floor(v / 2)
            f *= 0.5
        return x

    def genSamplersInUnitSqure(self, num):
        self.samplers = []
        for i in range(num):
            x = i * 1.0 / num
            y = self.radicalInverseBase2(i)
            self.samplers.append(Vector2(x, y))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

同时该raytracer的测试例子,能够得到如下一张图,显示了hammersley是均匀分布的:

![hammersley采样分布](https://img-blog.csdn.net/20170802235723900?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaV9kb3ZlbGVtb24=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

为了方便,这里同时给出GLSL的代码,便于大家参考:

float RadicalInverse(uint bits) {
    bits = (bits << 16u) | (bits >> 16u);
    bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
    bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
    bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
    bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
    return float(bits) * 2.3283064365386963e-10f;
}

vec2 Hammersley(uint i, uint N) {
    return vec2(float(i) / float(N), RadicalInverse(i));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

总结

图形学的世界非常的奇妙,采样的理论非常美丽,后面会陆陆续续和大家介绍更多的相关内容。

参考文献

[1] Ray Tracing From Ground Up

相关文章:

  • 图形学基础(5)——Sobol 采样
  • Hammersley–Clifford theorem
  • Sobol sequence generator
  • PaniniProjection
  • Shadowmask
  • UE4 How To use Colored Translucent Shadows
  • EvaluateSurfelMaterial.usf
  • FilterPixelShader.usf
  • 晕影Vignette
  • 自定义AssetBundle包扩展名
  • 【已解决】C#中的#ifdef
  • Signed Distance Fields in Real-time Rendering
  • UE4学习笔记(六): 次世代的移动平台渲染技术
  • UnrealEngine4 PBR Shading Model 概述
  • Asset Bundles vs. Resources: A Memory Showdown
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 2019.2.20 c++ 知识梳理
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Github访问慢解决办法
  • JAVA多线程机制解析-volatilesynchronized
  • orm2 中文文档 3.1 模型属性
  • sublime配置文件
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Vue学习第二天
  • webpack+react项目初体验——记录我的webpack环境配置
  • 将回调地狱按在地上摩擦的Promise
  • 数组大概知多少
  • 如何正确理解,内页权重高于首页?
  • # 数论-逆元
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (1)虚拟机的安装与使用,linux系统安装
  • (12)目标检测_SSD基于pytorch搭建代码
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (3)STL算法之搜索
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (Forward) Music Player: From UI Proposal to Code
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (二)c52学习之旅-简单了解单片机
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转)jQuery 基础
  • (转)setTimeout 和 setInterval 的区别
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET Core跨平台微服务学习资源
  • .NET Core中的去虚
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • ?php echo ?,?php echo Hello world!;?
  • @JSONField或@JsonProperty注解使用
  • @property括号内属性讲解
  • @TableLogic注解说明,以及对增删改查的影响
  • [.net] 如何在mail的加入正文显示图片
  • [@Controller]4 详解@ModelAttribute