На кубические объекты ложится хорошо, на сферические - не очень т.к. на выгнутой поверхности получается срез, а не наложение. На сферу нужно натягивать обычную 2D-текстуру.
shader Brick3D (
vector Vector = P,
float SizeX = 0.2,
float SizeY = 0.2,
float SizeZ = 0.1,
float OffsetX = 0.5,
float OffsetY = 0.5,
color BrickColor = color(1.0,0.0,0.0),
color MortarColor = color(0.0,1.0,0.0),
output float Factor = 1.0,
output color Color = color(0.0,0.0,1.0)
)
{
vector Pl = P;
Pl = transform("object",Vector);
float Px = Pl[0]/SizeX;
float Py = Pl[1]/SizeY;
float Pz = Pl[2]/SizeZ;
if(fmod(ceil(Pz),2)==0) Px += clamp(OffsetX,0,1);
if(fmod(ceil(Pz),2)==0) Py += clamp(OffsetY,0,1);
Px = fmod(Px,1); // отбросить целую часть
Py = fmod(Py,1);
Pz = fmod(Pz,1);
float Ux = 1.0;
if(Px>0.95||Px<0.05) Ux = 0;
float Uy = 1.0;
if(Py>0.95||Py<0.05) Uy = 0;
float Uz = 1.0;
if(Pz>0.95||Pz<0.05) Uz = 0;
Color = mix(MortarColor,BrickColor,Ux*Uy*Uz);
Factor = Ux*Uy*Uz;
}
Ноды
Скомпилированный OSL-шейдер: Brick3D