我正在使用OBS插件为obs-shaderfilter编写一个简单的着色器,我想访问“前一帧”甚至“前N个帧”,以便实现时间平滑,但是https://obsproject.com/docs/graphics.html和obs-shaderfilter示例都没有显示一种方法来获取对先前帧的引用,或者在它们通过着色器运行时对其进行缓存。
从当前帧中获取“像素”非常简单:
...
float4 get(VertData v_in, float x, float y)
{
return image.Sample(
textureSampler,
float2(
v_in.uv.x - x * uv_pixel_interval.x,
v_in.uv.y - y * uv_pixel_interval.y
)
);
}
float4 mainImage(VertData v_in) : TARGET
{
float4 c, p1, p2, p3, p4, p5, p6, p7, p8;
p1 = get(v_in, -1,-1); p2 = get(v_in, 0,-1); p3 = get(v_in, 1,-1);
p4 = get(v_in, -1, 0); c = get(v_in, 0, 0); p5 = get(v_in, 1, 0);
p6 = get(v_in, -1, 1); p7 = get(v_in, 0, 1); p8 = get(v_in, 1, 1);
return processKernel(c, p1, p2, p3, p4, p5, p6, p7, p8);
}
...
但是为了执行时间平滑,降噪等操作。我有点需要处理一个或多个先前的帧,并且由于周围缺乏文档,因此我无法弄清楚这是否可能OBS公开的有限形式的HLSL。
有人会知道这是否有可能吗?如果可以,那么实现该目标的代码应该是什么样?