在 MPC-BE 中,着色器分为预调整大小像素着色器(pre-resize pixel shaders)和后调整大小像素着色器(pose-resize pixel shaders)两个应用方式。其实这里的中文并不是很合适,以至于让本就有门槛的着色器在实际使用难度上雪上加霜。我直到本周才猜测到了两者的区别,且作为分享:
注意正文基本从本人编写着色器的测试推理而来,没有任何技术资料的支持,也没有阅读项目的代码
着色器可以对画面进行调整,但是输入的画面的分辨率(宽、高方向的像素数量)和输出的分辨率是完全相同的,不能增加,也不能减少。
如果视频文件的原始分辨率与播放器输出画面的分辨率不同,一定会发生缩放、裁切等操作。我认为缩放和裁切是分开应用的,而不是一次性应用。我暂且把视频文件的原始分辨率称为原始分辨率,缩放后的分辨率称为渲染分辨率(大多数视频都会发生缩放),最终播放器窗口显示的裁切后的画面的分辨率(也很可能并没发生裁切)称为显示分辨率。缩放的操作即“调整大小像素(resize pixel)”。
所谓的预调整大小像素着色器(pre-resize pixel shaders)即缩放等操作前,对每个像素的颜色所做的调整;后调整大小像素着色器(pose-resize pixel shaders)即缩放操作后,对每个像素的颜色所做的调整。弄明白这一点,我更愿意把两种应用方式称为:缩放前着色器、缩放后着色器,或者简称为前处理着色器、后处理着色器。
那么这两者有差别嘛?答案是只要发生过缩放操作,就必然有差别,并且在效果、效率上都有差别。首先是效率,如果原始分辨率高于渲染分辨率,前处理着色器需要处理的像素多,资源开销就大;如果原始分辨率低于渲染分辨率,前处理着色器需要处理的像素少,资源开销就低。
其次是效果。缩放过程会产生信息损失,用通俗直观的讲法就是变模糊。对色彩微调的着色器作为前处理着色器,输出结果会更自然;无关视频内容的着色器作为后处理着色器,效果可以更加清晰锐利。
最后是编写着色器的技巧。从我已知信息看,着色器无法同时获取原始分辨率和渲染分辨率——前处理着色器只能获取原始分辨率,后处理着色器只能获取渲染分辨率。实际上对大部分着色器来说,如果需要使用着色器缩放画面,只有前处理着色器可以对原始分辨率的宽高比做判断(即宽高比不同则产生不同的效果);但是受分辨率限制,如果试图缩小画面,使用前处理着色器一定会产生信息损失;当文件分辨率低于输出画面时,尺寸差异越大,损失越明显。当文件分辨率高于输出画面时,在效果上看差异不大。