2008年4月28日星期一

关于mr framebuffer输出openEXR中的通道

openEXR是ILM设计的一种图像格式,可以比较灵活的存储图像数据,最近的这个demoreel中原始的图像序列都用exr了,唯一的缺点就是体积太大,一张640*360的rgba 4*32bit的图竟然要3.5MB的空间。
这里要说的是exr的另一个问题,在maya中用输出exr格式的图像时,sw渲染器不支持exr,这里说的是mr。如果在mr的framebuffer中设置成输入rgba,那么在生成的exr文件中,rgba通道都会用A B G R的名字表示。但是,如果要单独输出motion或者alpha的话,通道的名字就成了mi_buffer_###,###就是每一帧的序列号,也就是说每一帧的通道名称都是不一样的。
这样,在合成的时候就有点麻烦了。nuke的reader节点可以正常的预览的这种exr序列,创建reader节点之后,它是按通道来读取exr序列的,每都一帧,都会创建一个新的通道,可viewer节点却是按照通道来显示的,还有channel组里的节点也都是如此,这样一来每一帧改变一次通道。
这个问题解决起来也简单,只要该一下exr文件通道的名字即可,以framebuffer输出motion向量为例。

用一个16进制编辑器打开一个exr文件,可以看到从offset:0x1CL开始,就是通道和分量的名字,这里我们只需要修改0x26L开始的帧编号,只要把整个exr序列中的帧编号都替换成一个固定的字符串即可。我写了一个简单的程序来完成这个工作。

#include
#include

int main(int argc, char *argv[]){
char *str="mt0";

FILE *fp;
fp=fopen(argv[1],"rb+");

fseek(fp,0x26L,0);
fwrite(str,sizeof(char),3,fp);

fseek(fp,0x46L,0);
fwrite(str,sizeof(char),3,fp);

fseek(fp,0x66L,0);
fwrite(str,sizeof(char),3,fp);

fclose(fp);
return 0;

}


下面是修改后的exr文件头,我把帧编号都改成了mt0。