border扩充
参考:https://zhuanlan.zhihu.com/p/507469990
Probe irradiance/distance border update,由于后续采样这两张纹理使用的是bilinearSampler,所以需要对边界不全以保证采样正确性,补充边界的方法如图:
C#申请rt时指定过滤模式:
mProbeIrradiance.filterMode = FilterMode.Bilinear;
shader:
float3 irradiance = SAMPLE_TEXTURE2D_ARRAY_LOD(
_ProbeIrradianceHistory,
sampler_LinearClamp,
probeIrradianceUV.xy,
probeIrradianceUV.z,
0).rgb;
如何补充边界,边界像素的个数为:4*6+4=28
这个数组应该这么看:每个是uint4,xy为src的坐标,zw为dest的坐标,意思就是将src对应位置的属性拷贝到dest位置的属性。
static const uint4 BORDER_OFFSETS[BORDER_TEXELS] =
{uint4(6, 6, 0, 0), uint4(6, 1, 1, 0), uint4(5, 1, 2, 0), uint4(4, 1, 3, 0), uint4(3, 1, 4, 0), uint4(2, 1, 5, 0), uint4(1, 1, 6, 0), uint4(1, 6, 7, 0),uint4(1, 6, 0, 1), uint4(1, 5, 0, 2), uint4(1, 4, 0, 3), uint4(1, 3, 0, 4), uint4(1, 2, 0, 5), uint4(1, 1, 0, 6), uint4(6, 1, 0, 7), uint4(6, 6, 7, 1), uint4(6, 5, 7, 2), uint4(6, 4, 7, 3), uint4(6, 3, 7, 4), uint4(6, 2, 7, 5), uint4(6, 1, 7, 6), uint4(1, 1, 7, 7), uint4(6, 6, 1, 7), uint4(5, 6, 2, 7), uint4(4, 6, 3, 7), uint4(3, 6, 4, 7), uint4(2, 6, 5, 7), uint4(1, 6, 6, 7)
};for (uint index = GroupIndex; index < BORDER_TEXELS; index += PROBE_IRRADIANCE_TEXELS * PROBE_IRRADIANCE_TEXELS)
{const uint3 sourceIndex = uint3(cornerTexelLocation + BORDER_OFFSETS[index].xy, cornerTexelLocation.z);const uint3 targetIndex = uint3(cornerTexelLocation + BORDER_OFFSETS[index].zw, cornerTexelLocation.z);_ProbeIrradiance[targetIndex] = _ProbeIrradiance[sourceIndex];
}
经过上面的扩边操作,展示图如下: