Для этого вам нужно трипланарное картирование. Принцип заключается в том, что вы проецируете текстуру на плоскость XZ, как вы это делали, но затем вы также проецируете ее на плоскости ZY и XY. Наконец, вы используете нормаль поверхности (обычно квадрат многократно), чтобы смешать текстуры (умножить и сложить).
Вот как выглядит функция смешивания:
inline float3 TriplanarBlendFactor(half3 normal) {
float3 bf = pow(abs(normal), 6);
bf /= dot(bf, (float3)1);
return bf;
}
Затем просто объедините образцы текстур так:
fixed4 cx = tex2D(tex, tx) * blendFactor.x;
fixed4 cy = tex2D(tex, ty) * blendFactor.y;
fixed4 cz = tex2D(tex, tz) * blendFactor.z;
fixed4 finalColor = cx + cy + cz;
Вы можете выставить мощность в функции смешивания как свойство шейдера, если вы хотите контролировать расстояние смешивания.