float 方差[WIDTH][HEIGHT];
vec3 着色[WIDTH][HEIGHT];
// A-三阶滤波器
vec3 svgf(int x, int y)
{
// 5x5 A-Trous kernel
float Trous滤波分布[25] = { 1.0 / 256.0, 1.0 / 64.0, 3.0 / 128.0, 1.0 / 64.0, 1.0 / 256.0,
1.0 / 64.0, 1.0 / 16.0, 3.0 / 32.0, 1.0 / 16.0, 1.0 / 64.0,
3.0 / 128.0, 3.0 / 32.0, 9.0 / 64.0, 3.0 / 32.0, 3.0 / 128.0,
1.0 / 64.0, 1.0 / 16.0, 3.0 / 32.0, 1.0 / 16.0, 1.0 / 64.0,
1.0 / 256.0, 1.0 / 64.0, 3.0 / 128.0, 1.0 / 64.0, 1.0 / 256.0 };
// 3x3 高斯型 kernel
float 高斯型[9] = { 1.0 / 16.0, 1.0 / 8.0, 1.0 / 16.0,
1.0 / 8.0, 1.0 / 4.0, 1.0 / 8.0,
1.0 / 16.0, 1.0 / 8.0, 1.0 / 16.0 };
//std::cout << "方差A:" << 方差[x][y] << " 方差A" << std::endl;
vec3 颜色 = 时空重投影[x][y].旧颜色;// ;
float 方差A = 方差[x][y];
方差A += 0.01;
float var;
// 执行 3x3 高斯模糊 方差
//if (blur_方差) {
float sum = 0.0f;
float sumw = 0.0f;
glm::ivec2 g[9] = { glm::ivec2(-1, -1), glm::ivec2(0, -1), glm::ivec2(1, -1),
glm::ivec2(-1, 0), glm::ivec2(0, 0), glm::ivec2(1, 0),
glm::ivec2(-1, 1), glm::ivec2(0, 1), glm::ivec2(1, 1) };
for (int n = 0; n < 9; n++) {
sum = 高斯型[n] * 方差A;
sumw += 高斯型[n];
}
var = max(sum / sumw, 1.0f);
//加载像素p数据
float lp = 0.2126 * 颜色.x + 0.7152 * 颜色.y + 0.0722 * 颜色.z;
glm::vec3 pp = 时空重投影[x][y].旧坐标;
glm::vec3 np = 屏幕像素法向量[x][y];
glm::vec3 颜色_和 = glm::vec3(0.0f);
float 方差_和 = 0.0f;
float 权重_和 = 0;
float 权重平方_和 = 0;
for (int i = -2; i <= 2; i++) {
for (int j = -2; j <= 2; j++) {
//加载像素Q数据
float lq = 0.2126 * 颜色.x + 0.7152 * 颜色.y + 0.0722 * 颜色.z;
glm::vec3 旧时空重投影q = 旧时空重投影[x][y].旧坐标;
glm::vec3 旧屏幕像素法向量q = 旧屏幕像素法向量[x][y];
//边缘-停止权重
float wl = expf(-glm::distance(lp, lq) / (sqrt(var) * 1 + 1e-6));
float wn = min(1.0f, expf(-glm::distance(np, 旧屏幕像素法向量q) / (1 + 1e-6)));
float wx = min(1.0f, expf(-glm::distance(pp, 旧时空重投影q) / (1 + 1e-6)));
//过滤器权重
int k = (2 + i) + (2 + j) * 5;
float 分量 = Trous滤波分布[k] * wl * wn * wx;
权重_和 += 分量;
权重平方_和 += 分量 * 分量;
颜色_和 += (颜色 * 分量);
方差_和 += (分量 * 分量);
}
}
// 更新颜色和方差
if (权重_和 > 10e-6) {
光线追踪渲染图[x][y] += 颜色_和 / 权重_和;
//光线追踪渲染图[x][y] *= 0.5;
方差A = 方差_和 / 权重平方_和;
}
else {
光线追踪渲染图[x][y] = 颜色;
}
方差[x][y] = 方差A;
/* 光线追踪渲染图[x][y] *= 方差A;*/
return 光线追踪渲染图[x][y];
}
具体我也不太懂,但是抄写代码比较简单
SVGF应该是对照上一帧图片信息对变化剧烈的像素进行模糊
但是很多人说我抄谁谁谁的代码,比如pBR是迪士尼标准
既然杀标准我移植怎么叫抄呢
重投影用2次2d转3D坐标,对比2次差异小的重新投射
到当前帧,但是重影严重,感觉重投影没什么用前期渲染
要对全像素光追还要获取重投影信息,开销加大