1 个不稳定版本
0.1.0 | 2019年9月27日 |
---|
#9 在 #blue
237 每月下载量
13MB
129K SLoC
blue-noise-sampler
本包提供了一个 Rust 版本的 A Low-Discrepancy Sampler that Distributes Monte Carlo Errors as a Blue Noise in Screen Space 示例代码。
用法
基本上,这个包只是暴露了一组可以上传到 GPU 缓冲区的表,然后可以使用以下类似 HLSL 代码进行采样。此代码直接来自论文中提供的采样器代码(与表相同)。
StructuredBuffer<int> g_blueNoiseSobol : register(t6, space0);
StructuredBuffer<int> g_blueNoiseScrambleTile : register(t7, space0);
StructuredBuffer<int> g_blueNoiseRankingTile : register(t8, space0);
float samplerBlueNoise(int pixel_i, int pixel_j, int sampleIndex, int sampleDimension)
{
// wrap arguments
pixel_i = pixel_i & 127;
pixel_j = pixel_j & 127;
sampleIndex = sampleIndex & 255;
sampleDimension = sampleDimension & 255;
// xor index based on optimized ranking
// jb: 1spp blue noise has all 0 in g_blueNoiseRankingTile so we can skip the load
int rankedSampleIndex = sampleIndex ^ g_blueNoiseRankingTile[sampleDimension + (pixel_i + pixel_j*128)*8];
// fetch value in sequence
int value = g_blueNoiseSobol[sampleDimension + rankedSampleIndex*256];
// If the dimension is optimized, xor sequence value based on optimized scrambling
value = value ^ g_blueNoiseScrambleTile[(sampleDimension%8) + (pixel_i + pixel_j*128)*8];
// convert to float and return
float v = (0.5f+value)/256.0f;
return v;
}
有一些观察结果需要注意,每个包中的模块(ssp1
、spp2
等)包含 3 个全局变量:SOBOL
、SCRAMBLING_TILE
和 RANKING_TILE
,它们名称相同,因此您可以在代码中使用 use blue_noise_sampler::spp16::*;
正确的一个,并在需要更多样本时更改它,而无需更新其余部分。
在 spp1
的情况下,RANKING_TILE
表全部为 0,因此它严格不需要上传到 GPU,并且上述代码可以修改为进行一次更少的加载,作为微优化。
许可证
基于 MIT 许可证(LICENSE 或 http://opensource.org/licenses/MIT)
贡献
除非您明确声明,否则您提交给本包的任何有意贡献均应按上述方式许可,不得附加任何额外条款或条件。
欢迎贡献;请查看 问题跟踪器 以查看记录的已知改进。