图片处理在很多领域中都有很大的需求,比如计算机视觉等。比较简单且常用的方法是用openCV读取图片,然后用numpy进行图片处理。然而,只有当处理算法能够完全用numpy中提供的矩阵操作实现时,才能够享受numpy的并行加速的优势。如果你的算法需要使用循环去遍历矩阵,这时的效率就会慢到无法接受。
有一种可行的方法是手写cuda kernel,然而笔者的cuda水平并不过关,因此考虑到使用Falcor来进行快速的图片处理。
Falcor
Falcor是nVidia开放的一个渲染框架,用户可以自行编写RenderPass来进行扩充。
每一个RenderPass包括3个重要文件:一个头文件,一个cpp文件和一个shader文件。
对于增加RenderPass需要考虑的只有两个点:
- Pass的输入(cpp文件中定义)
- Pass的算法(Shader)
Pass的输入
如下所示的是Antialiasing Pass中的TAA Pass的输入定义(这些字符串名称将在后面调用Pass时用到)。
namespace
{
const std::string kMotionVec = "motionVecs";
const std::string kColorIn = "colorIn";
const std::string kColorOut = "colorOut";
const std::string kAlpha = "alpha";
const std::string kColorBoxSigma = "colorBoxSigma";
const std::string kShaderFilename = "RenderPasses/Antialiasing/TAA/TAA.ps.slang";
}
定义的输入需要在重载的reflect函数中调用reflection对象的addInput进行添加。如下是TAA Pass的输入添加。
RenderPassReflection TAA::reflect(const CompileData& compileData)
{
RenderPassReflection reflection;
reflection.addInput(kMotionVec, "Screen-space motion vectors");
reflection.addInput(kColorIn, "Color-buffer of the current frame");
reflection.addOutput(kColorOut, "Anti-aliased color buffer");
return reflection;
}
然后在重载的excute函数中将输入对应的纹理绑定到shader对应的slot上就完成了输入的定义和绑定。
void TAA::execute(RenderContext* pContext, const RenderData& renderData)
{
//logInfo("TAA successful execute");
const auto& pColorIn = renderData[kColorIn]->asTexture();
const auto& pColorOut = renderData[kColorOut]->asTexture();
const auto& pMotionVec = renderData[kMotionVec]->asTexture();
// Make sure the dimensions match
assert((pColorIn->getWidth() == mpPrev