最近在给一个培训机构代课,学生英语基础差,就安装了Vray5的中文版,噩梦从此开始。
做过合成的都知道,需要输出多通道到NUKE或者AE中进行合成,通常情况下把多个pass分成不同的文件对硬盘反复读写会对预览性能有影响,所以都是将多通道输出到一个EXR或者VRIMG进行后续处理。
坑就坑在,这些汉化版的Vray会把中文写进这些二进制文件里,再到AE或者NUKE里导入 就会出现乱码甚至通道丢失(如图1)
图1
这边记录一下解决方法和思路,避免踩坑。
思路是用OpenImageIO这个库进行通道重命名,如果是在Linux系统就很简单,直接获取包就好(安装参考oiio/INSTALL.md at master · OpenImageIO/oiio · GitHub)
但是在windows下,不是每个电脑都有visual studio,所以编译就很麻烦,我这边提供编译好的版本(2.2.2)(下载链接:https://pan.baidu.com/s/1jYwQljiYI1fZflwt6mYptw 提取码:toto)
下载之后解压,cd /d "你解压的路径" 转到对应目录,输入 chcp 65001 并回车,将CMD编码改到UTF-8
这边假设要处理的EXR名称为1.EXR
查看EXR数据
oiiotool -info -v 1.exr
如果要提取出通道信息 可以用
oiiotool -info -v 1.exr | find /i "channel list"
如果不出意外 就会得到EXR中通道的顺序信息,要修改的是里面的中文,对应Channel中的RGB通道不能动,CMD输出如图2
图2
可以将这一段内容输出到文本文档做修改,只需要channel list:后面的部分即可,并且不要换行(图3)
如
图3
将中文内容逐个替换,并且把中间的空格去掉或者改成下划线_,替换后文本如图4
图4
回到CMD,输入
oiiotool 1.exr --chnames "R,G,B,A,VFB2Composite.R,VFB2Composite.G,VFB2Composite.B,VRayGI.R,VRayGI.G,VRayGI.B,VRayReflection.R,VRayReflection.G,VRayReflection.B,VRayBackToBeauty.R,VRayBackToBeauty.G,VRayBackToBeauty.B,VRayAtomsphere.R,VRayAtomsphere.G,VRayAtomsphere.B,VRayRefraction.R,VRayRefraction.G,VRayRefraction.B,VRay_Diffuse.R,VRay_Diffuse.G,VRay_Diffuse.B,VRayCaustics.R,VRayCaustics.G,VRayCaustics.B,VRayLighting.R,VRayLighting.G,VRayLighting.B,VRayBackground.R,VRayBackground.G,VRayBackground.B,VRaySelfluminous.R,VRaySelfluminous.G,VRaySelfluminous.B,VRayDenoiser.R,VRayDenoiser.G,VRayDenoiser.B,VRaySpecular.R,VRaySpecular.G,VRaySpecular.B,VRaySSS2.R,VRaySSS2.G,VRaySSS2.B,bumpNormals.Y,bumpNormals.Z,bumpNormals.X,effectsResult.R,effectsResult.G,effectsResult.B" -o 2.exr
命令中 绿色1.exr可以替换为输入的exr文件路径,红色2.exr可替换为输出exr文件名和路径
橙色部分请替换成自己的通道,因为通道顺序每个文件都不一样,所以不可照搬
输出完成后,导入NUKE,可以看到通道数据恢复正常(图5)
图5
这是基本的思路,但实际操作非常麻烦,如果是序列就更加崩溃,所以可以用批处理文件来辅助。
批处理代码如下,可复制另存为UTF-8编码的批处理文件,放在oiio的解压目录中。
1 @echo off
2 chcp 65001&&setlocal ENABLEDELAYEDEXPANSION
3 echo 转换编码到UTF-8&echo.
4 set /p url=请将序列文件夹拖入:
5 set /p output=请将输出文件夹拖入:
6
7 for /f "delims=" %%j in ('dir /b "%url%\*.exr"') do (
8 set "exrname=%%j"
9 for /f "delims=" %%i in ('oiiotool -info -v "%url%\!exrname!" ^| find /i "channel list"') do (
10 set "ca=%%i"
11 echo 正在处理!exrname!,获得EXR通道数据&echo.
12 set ca=!ca: channel list: =!
13 set ca=!ca:VRay 全局照明=VRay_GlobalIllumination!
14 set ca=!ca:VRay 反射=VRay_Reflection!
15 set ca=!ca:VRay 回到美景=VRay_BackToBeauty!
16 set ca=!ca:VRay 大气=VRay_Atmosphere!
17 set ca=!ca:VRay 折射=VRay_Refraction!
18 set ca=!ca:VRay 漫反射过滤器=VRay_DiffuseFilter!
19 set ca=!ca:VRay 焦散线=VRay_Caustics!
20 set ca=!ca:VRay 照明=VRay_Lighting!
21 set ca=!ca:VRay 背景=VRay_Background!
22 set ca=!ca:VRay 自发光=VRay_SelfIuminous!
23 set ca=!ca:VRay 降噪器=VRay_Denoiser!
24 set ca=!ca:VRay 高光=VRay_Specular!
25 oiiotool "%url%\!exrname!" --chnames "!ca!" -o "%output%\!exrname!"
26 )
27 )
28 echo 处理完成&pause>nul&&exit
使用时先拖入EXR序列所在文件夹,再新建一个输出文件夹,拖入程序并回车,程序会自动开始处理。
如果需要自定义替换字符串的内容,增加oiiotool命令前的set命令即可。
如
set ca=!ca:VRay 高光=VRay_Specular!
红字为替换前关键字,绿字为替换后关键字
至此,大坑已填
最好的解决方法还是用英文版的Vray,汉化版的各种问题,都是折腾。