Я так понимаю, вы хотите разместить только часть текстуры, верно? Тогда все усложняется.
Предположим, мы хотим выложить u-координаты между значениями u1 и u2, u1
Тогда нам нужна функция f (u), так что
f(0.0) = u1
f(0.5) = (u1+u2)/2
f(0.9999) = u2
f(1.0) = u1
f(1.5) = (u1+u2)/2
f(1.9999) = u2
f(2.0) = u1
and so on...
Соответствующая функция: f(u) = frac(u) * (u2-u1) + u1
То же самое относится к v-координатам, f(v) = frac(v) * (v2-v1) + v1
Обратите внимание, что это плитка без зеркалирования. Если вам нужно зеркалирование, то эта функция должна быть функцией треугольной волны, которая равна t(x) = arcsin(sin(pi*(x-0.5)))/pi+0.5
и f(u) = t(u) * (u2-u1) + u1
. Использование тригонометрических функций может быть дорогостоящим.
Я не знаю, возможно ли это с фиксированным конвейером, но вы можете легко сделать это в пиксельном шейдере (код HLSL):
// float2 tex_coord -> (u,v) from vertex shader, in [0,n] range,
// n - number of repetitions
// float2 tex1, tex2 -> constants, subrange of [0,1] coords that will be tiled
// no mirroring
float4 color = tex2D(sampler, frac(tex_coord) * (tex2-tex1) + tex1);
или
// mirroring, t(x) = arcsin(sin(pi*(x-0.5)))/pi+0.5
float4 color = tex2D(sampler, t(tex_coord) * (tex2-tex1) + tex1);
EDIT:
лучший способ вычисления функции треугольной волны: t1(x) = abs(2(0.5x-floor(0.5x+0.5)))
или t2(x) = abs(2(frac(0.5x+0.5))-1)
(не совсем то же самое, что t1, но корректно для неотрицательных чисел).