An OSL shader for offsetting, tiling, and rotating textures.
Download link
http://www.rensheeren.com/osl/UVTransform_tex_v002.osl
Right-click and save as.
Features
– Offset, rotate, or tile your textures in the shader.
– You can insert a replacement UV map. For example after you have added distortions to the map.
How to use
VRay:
– Create a VRay OSL Texture map.
– Load in the downloaded OSL shader.
– Set the transform values for Offset, Tiling and Rotation.
– If you want to generate a replacement UV map for adding distortions, you can use a VRaySamplerInfoTex map set to UVW coordinates. You can then mix it with a noise map for example. It will look cool, believe me!
UI Properties
input_tex
– The input texture.
input_replacement_UV_tex
– A UV gradient if you want to replace the UV coordinates.
transform_order
– Choose the transform order, tile, rotate, offset.
UV_offset
– Texture offset (translation).
UV_tiling
– Texture tiling (scale).
UV_tiling_center
– The center point around which to tile.
UV_rotation
– Texture rotation.
UV_rotation_center
– The center point around which to rotate.
flip_U
– Flip the texture horizontally.
flip_V
– Flip the texture vertically.
O = Offset
T = Tile
R = Rotate
Code
/*
UVTransform_tex_v002
By Rens Heeren (mail [at] rensheeren [dot] com)
Info Page: http://www.rensheeren.com/blog/osl-uvtransform/
Use as an OSL texture, not as an OSL material.
An OSL shader for transforming textures. You can rotate, offset and scale (tile)
input textures. You can also use a random input to drive random transforms.
Usage:
Use at your own risk.
2016-01-01 - v001 - Created (rh)
2016-05-30 - v002 - UI Tweaks. (rh)
*/
////////////////////////////////////
color fn_offset(color c_in, color c_offset)
{
color c_out = c_in + c_offset;
return c_out;
}
color fn_tile(color c_in, color c_tiling, color c_center)
{
color c_out = ((c_in - c_center) / c_tiling) + c_center;
return c_out;
}
color fn_rotate(color c_in, float f_rotate, color c_center)
{
point p_out = point(c_in[0], c_in[1], c_in[2]);
point p_base = point(c_center[0], c_center[1], 0.0);
point p_project = point(c_center[0], c_center[1], 1.0);
p_out = rotate(p_out, f_rotate, p_base, p_project);
color c_out = color(p_out[0], p_out[1], p_out[2]);
return c_out;
}
//////////////////////////////////////
shader
UVTransform_tex_v002
(
string input_tex = "",
string input_replacement_UV_tex = "",
int use_replacement_UV_tex = 0
[[ string widget = "checkBox" ]],
int transform_order = 1
[[ string widget = "mapper",
string description = "",
string options = "RTO:1|ORT:2|TOR:3|TRO:4|ROT:5|OTR:6" ]],
point UV_offset = point(0.0, 0.0 ,0.0),
point UV_tiling = point(1.0, 1.0, 1.0),
point UV_tiling_center = point(0.0, 0.0, 0.0),
float UV_rotation = 0,
point UV_rotation_center = point(0.5, 0.5, 0.0),
int flip_U = 0
[[ string widget = "checkBox" ]],
int flip_V = 0
[[ string widget = "checkBox" ]],
//point random_seed_OTR = point(1, 2, 3),
//string input_random_generator = "",
string UV_offset_tex = "",
int use_UV_offset_tex = 0
[[ string widget = "checkBox" ]],
string UV_tiling_tex = "",
int use_UV_tiling_tex = 0
[[ string widget = "checkBox" ]],
string UV_rotation_tex = "",
int use_UV_rotation_tex = 0
[[ string widget = "checkBox" ]],
output color out_tex_transformed = color(0),
output color out_UV_transformed = color(0),
output color out_UV_default = color(0),
output float out_alpha_transformed = 0,
output float out_alpha_white = 1
)
///////////////////////////////////////
{
int i_useUVReplTex = use_replacement_UV_tex;
int i_useOffsetTex = use_UV_offset_tex;
int i_useTilingTex = use_UV_tiling_tex;
int i_useRotationTex = use_UV_rotation_tex;
int i_flipU = flip_U;
int i_flipV = flip_V;
int i_TO = transform_order;
color c_UVDefault = color(u, v, 0.0);
color c_UVTransformed = color(u, v, 0.0);
if (i_useUVReplTex)
{
c_UVTransformed = texture(input_replacement_UV_tex, u, v);
}
color c_inputOffset = color(UV_offset[0], UV_offset[1], UV_offset[2]);
if (i_useOffsetTex)
{
c_inputOffset = texture(UV_offset_tex, u, v);
}
c_inputOffset[1] = -c_inputOffset[1];
color c_tilingCenter = color(UV_tiling_center[0], UV_tiling_center[1], UV_tiling_center[2]);
color c_inputTiling = color(UV_tiling[0], UV_tiling[1], UV_tiling[2]);
if (i_useTilingTex)
{
c_inputTiling = texture(UV_tiling_tex, u, v);
}
c_inputTiling = 1 / c_inputTiling;
color c_rotationCenter = color(UV_rotation_center[0], UV_rotation_center[1], UV_rotation_center[2]);
color c_inputRotation = color(UV_rotation);
if (i_useRotationTex)
{
c_inputRotation = texture(UV_rotation_tex, u, v);
}
//input_random_generator
//random_seed_OTR
float f_rotateAngle = radians((c_inputRotation[0]) * 360.0);
// RTO
if (i_TO < 2 || i_TO > 6)
{
c_UVTransformed = fn_rotate(c_UVTransformed, f_rotateAngle, c_rotationCenter);
c_UVTransformed = fn_tile(c_UVTransformed, c_inputTiling, c_tilingCenter);
c_UVTransformed = fn_offset(c_UVTransformed, c_inputOffset);
}
// ORT
if (i_TO == 2)
{
c_UVTransformed = fn_offset(c_UVTransformed, c_inputOffset);
c_UVTransformed = fn_rotate(c_UVTransformed, f_rotateAngle, c_rotationCenter);
c_UVTransformed = fn_tile(c_UVTransformed, c_inputTiling, c_tilingCenter);
}
// TOR
if (i_TO == 3)
{
c_UVTransformed = fn_tile(c_UVTransformed, c_inputTiling, c_tilingCenter);
c_UVTransformed = fn_offset(c_UVTransformed, c_inputOffset);
c_UVTransformed = fn_rotate(c_UVTransformed, f_rotateAngle, c_rotationCenter);
}
// TRO
if (i_TO == 4)
{
c_UVTransformed = fn_tile(c_UVTransformed, c_inputTiling, c_tilingCenter);
c_UVTransformed = fn_rotate(c_UVTransformed, f_rotateAngle, c_rotationCenter);
c_UVTransformed = fn_offset(c_UVTransformed, c_inputOffset);
}
// ROT
if (i_TO == 5)
{
c_UVTransformed = fn_rotate(c_UVTransformed, f_rotateAngle, c_rotationCenter);
c_UVTransformed = fn_offset(c_UVTransformed, c_inputOffset);
c_UVTransformed = fn_tile(c_UVTransformed, c_inputTiling, c_tilingCenter);
}
// OTR
if (i_TO == 6)
{
c_UVTransformed = fn_offset(c_UVTransformed, c_inputOffset);
c_UVTransformed = fn_tile(c_UVTransformed, c_inputTiling, c_tilingCenter);
c_UVTransformed = fn_rotate(c_UVTransformed, f_rotateAngle, c_rotationCenter);
}
if (i_flipU)
{
c_UVTransformed[0] = 1.0 - c_UVTransformed[0];
}
if (i_flipV)
{
c_UVTransformed[1] = 1.0 - c_UVTransformed[1];
}
float f_outputTexAlpha = 0.0;
color c_outputTex = texture(input_tex, c_UVTransformed[0], c_UVTransformed[1], "alpha", f_outputTexAlpha);
out_tex_transformed = c_outputTex;
out_UV_transformed = c_UVTransformed;
out_UV_default = c_UVDefault;
out_alpha_transformed = f_outputTexAlpha;
}


