houdini中让shader支持udim texture

时间:2022-02-16 04:15:52

简介

udim,arnold的一个很好的机制,可以充分利用0~1之外的UV空间,最爽的在于不同的tile可以指定不同的分辨率,是一种比普通UV更加先进的mapping方式。一则很好的科普:http://www.fxguide.com/featured/udim-uv-mapping/

可是Houdini shop 的texture 节点还是只从0~1找啊咋办,0~1之外就重复啊咋办?

经过尝试只要几个节点就可以让texture以udim的方式读取。


SOP阶段

首先在模型(uv肯定有超出0~1范围的)后挂一个vertex wrangle,里面只填一句话:http://www.fxguide.com/featured/udim-uv-mapping/

不好意思ctrl v错了,是这个:i@udim = 1001 + int(@uv[0]) + int(@uv[1])*10;

这句话给模型添加了一个叫做udim的int属性,其值为udim的编号。


SHOP阶段

houdini中让shader支持udim texture

houdini中让shader支持udim texture

其中,

parm1用于读入geo所携带的我们添加的udim属性;

parm2为shop添加一个string的parameter,用于在外层指定udim贴图路径,路径中用<udim>来代替udim编号;

uvcoord1是一个普通的uvcoord节点,读取处理前的uv;

snippet1代码如下:

string tex_path = texpath;
string tokens[] = re_split('<udim>', tex_path);
texpath = tokens[0]+itoa(int(udim))+tokens[1];
s = frac(s);
t = frac(t);

此代码做两件事:将原来的路径根据udim来修改成真正的路径,并且将uv修改为在此tile的正确uv。

将此snippet的路径输出到texture的map属性,s和t输出到texture的s和t即可

houdini中让shader支持udim texture

上图为用udim的效果,只是为了做火星的发射源没有加置换和其他shading。