A-SVGF降噪代码实现

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次差异小的重新投射
到当前帧,但是重影严重,感觉重投影没什么用前期渲染
要对全像素光追还要获取重投影信息,开销加大

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值