简单图像空间重要性采样的GPU实现

渲染中常常要对一张图像进行采样,也就是在众多像素中选一些代表性的点。随机的均匀采样是最简单的,像下面左图那样。但是很多时候我们希望进行一些非均匀的采样,比如在环境光图像里集中采样亮度大的地方,如右图。这种采样叫做重要性采样(Importance Sampling)。

均匀采样
左图:均匀采样


重要性采样
右图:重要性采样

这里介绍一个简单而有效方法进行这种重要性采样。这个方法是由Clarberg等人在SIGGRAPH 2005上第一次提出的,论文在这里。

采样之前要为每一个像素赋一个重要性的权重,也可以看做被采样的概率。对于上面的例子,这个权重就是每个像素的灰度值。这个权重图就是采样点分布的目标。下图是从原论文中截取的,说明了采样的过程。

简单图像空间重要性采样的GPU实现

首先,生成一个均匀的采样分布,如(a)。然后将整个图像分为4个子图,并计算每个子图中分布概率的和,如(b)。根据这个分布调整采样点位置,首先是纵向分布,将上方两个概率和下方两个概率之和作为比例,如例子中是80%:20%,就在80:20的地方画一条横线将图分为上下两部分,如(c),然后把这条线移到50:50的位置,同时对应缩放上下两部分的采样点的y坐标:上半部分被挤压因此采样点变密,而下半部分被拉长因此采样点变稀疏了,如(d)。这一步之后在上下两部分的横向分别进行类似调整,如(e)。结果每个子图都得到了对应概率的均匀分布。在每个子图中都按上面的方法进一步递归地调整,直到到达像素级别,就完成整个采样过程。

知道了这个方法的原理,实现起来就比较简单了。由于在每一层调整时都需要当前层的4个子图的概率总和,因此概率分布图的MIP-map是需要预先生成的。采样点的位置编码进纹理中,纹理的R和G通道分别储存U,V值。在采样时,从次高的MIP-map层次,也就是2x2的图像开始调整采样点,直到最大分辨率的图像。

我实现的调整过程的pixel shader代码:

float4 psMovePoints(float2 tex: TEXCOORD0): COLOR0
{
// 取得调整前的采样位置
float2 uv = tex2Dlod(SampleSampler, float4(tex, 0, 0));
// 计算子图左上角位置
int2 ixy = uv / g_Offset;
float2 upperleft = (ixy - ixy %2) * g_Offset;

float2 off = g_Offset;
float2 lodtex = float2(0, g_Lod);
// 从MIP-map中读取概率
float c00 = length(tex2Dlod(SourceSampler, float4(upperleft + off * float2(0.5, 0.5), lodtex)).xyz);
float c01 = length(tex2Dlod(SourceSampler, float4(upperleft + off * float2(0.5, 1.5), lodtex)).xyz);
float c10 = length(tex2Dlod(SourceSampler, float4(upperleft + off * float2(1.5, 0.5), lodtex)).xyz);
float c11 = length(tex2Dlod(SourceSampler, float4(upperleft + off * float2(1.5, 1.5), lodtex)).xyz);
// 和上图不同,我们首先调整横向
float rx = (c00 + c01) / (c00 + c01 + c10 + c11);
float ry;
float2 duv = (uv - upperleft) / (2* g_Offset);
if (duv.x < rx)
{
duv.x /=2* rx;
ry = c00 / (c00 + c01);
}
else
{
duv.x = (1+ duv.x -2* rx) / (2* (1- rx));
ry = c10 / (c10 + c11);
}
// 再调整纵向
if (duv.y < ry)
{
duv.y /=2* ry;
}
else
{
duv.y = (1+ duv.y -2* ry) / (2* (1- ry));
}

uv = duv * (2* g_Offset) + upperleft;

return float4(uv, 0, 0);
}

采样点调整过程如下图所示,其中采样点个数为1024个:

简单图像空间重要性采样的GPU实现

本文转自:Redclock's Blog,转载此文目的在于传递更多信息,版权归原作者所有。

最新文章