NvFBC是英伟达提供的高效率截图功能,但根据其License,只能在部分专业级显卡中启用,消费级显卡例如gtx1080、rtx2080都是用不了的。
然而事实上nvidia官方的Geforce Experience或者Steam的远程串流模式,都使用了NvFBC。这些功能在消费级显卡上面跑得好好的。
因此利用一些手段是可以在消费级显卡上使用NvFBC的。
GFE或者Steam,通过NvFBC的一个private data接口向NvFBC组件表明自己是友军,随后NvFBC的功能对其正常开放。另外还需要在注册表内添加相关项目。
privatedata的捕获方式可见https://github.com/CubicStone31/nvidia-patch/tree/master/win/nvfbcwrp
在此直接提供一个可用的private data,使用方式如下(关注最后三行即可)
NvFBCCreateParams createParams;
memset(&createParams, 0, sizeof(createParams));
createParams.dwVersion = NVFBC_CREATE_PARAMS_VER;
createParams.dwInterfaceType = type;
createParams.pDevice = devicePtr;
createParams.dwAdapterIdx = adapter;
// private data to enable nvfbc on customer grade cards
// fuck you nvidia
DWORD default_magic[] = { 0xAEF57AC5, 0x401D1A39, 0x1B856BBE, 0x9ED0CEBA };
createParams.pPrivateData = default_magic;
createParams.dwPrivateDataSize = sizeof(default_magic);
注册表项目如下添加
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\nvlddmkm" /v NVFBCEnable /d 1 /t REG_DWORD /f
然后重启电脑。
当系统中某些程序通过SetWindowDisplayAffinity设置自己不想被截图时,nvfbc的截图接口会返回NVFBC_ERROR_PROTECTED_CONTENT。
这个问题实际上是因为nvfbc库中的一个dll,会在运行时不断调用GetWindowDisplayAffinity,检查哪些窗口声明了反截图。因此Hook此API,返回api错误或者返回伪造的信息即可。
One thought on “消费级显卡启用NvFBC”
https://github.com/keylase/nvidia-patch/tree/master/win/nvfbcwrp
大佬,我在上面网址按照说明替换了这个两个dll,重启电脑之后NV的游戏内覆盖失效了,无法启动,但是系统依旧正常使用,我也无法判断NVFBC到底有没有生效。我不懂编程,只能看下简单使用方法和教程。网上找不到什么教程,要么就是太专业的教程,全是代码,完全看不懂。第一点 游戏内覆盖失效是否正常, 第二 如何验证NVFBC是否生效 ,请指教一下。