Question

Ne pardonnez-moi si cela a été demandé avant, j'ai été chercher la réponse à cette journée et à tous, je suis venue avec est de les aider avec la tuile de base de jeux 2D.x~x

Je suis en train de créer un skinnable interface graphique Direct3D 9, à l'aide d'un fichier XML qui a des positions pour chaque élément et une option pour étirer ou de tuiles.L'étirement est assez simple procédure, mais j'ai été incapable de trouver un moyen de tuile d'une petite section d'une texture.Traditionnellement à la tuile d'une texture, je voudrais juste ensemble des coordonnées UV pour > 1.0, mais la source des coordonnées de texture sont seulement va être un petit sous-ensemble de l'ensemble de la texture, comme 0.4 à 0.5.

J'ai un sentiment que j'ai raté quelque chose de vraiment évident, mais comment pourrais-je aller sur simplement de carrelage au lieu de la tirer?Ma meilleure supposition est qu'il a quelque chose à voir avec le fait d'avoir plus d'un ensemble de coordonnées de texture, mais à partir de là, je ne suis pas sûr où aller.

Le projet utilise actuellement la fonction fixe pipeline, donc je préfère une réponse en utilisant, si possible, mais je ne voudrais pas tourner le bas une réponse qui utilise un shader si c'est la seule façon.

Était-ce utile?

La solution

Je comprends que vous voulez tuile seulement un sous-ensemble de la texture, de la droite?Puis les choses se compliquent.

Supposons que nous voulons tuile u-coord entre u1 et u2 valeurs, u1 < u2.

Ensuite, nous avons besoin d'une fonction f(u), de sorte que

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...

Une fonction appropriée est f(u) = frac(u) * (u2-u1) + u1

Il en va de même pour v-coord, f(v) = frac(v) * (v2-v1) + v1

Notez que c'est du carrelage sans miroir.Si vous avez besoin de mise en miroir, puis la fonction doit être une triangulaire fonction d'onde, qui est t(x) = arcsin(sin(pi*(x-0.5)))/pi+0.5 et f(u) = t(u) * (u2-u1) + u1.À l'aide de fonctions trigonométriques peuvent être cher.

Je ne sais pas si c'est possible, avec de pipeline fixe, mais vous pouvez le faire facilement en pixel shader (code 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);

ou

// mirroring, t(x) = arcsin(sin(pi*(x-0.5)))/pi+0.5
float4 color = tex2D(sampler, t(tex_coord) * (tex2-tex1) + tex1);

EDIT:une meilleure façon de calculer triangulaire fonction d'onde: t1(x) = abs(2(0.5x-floor(0.5x+0.5))) ou t2(x) = abs(2(frac(0.5x+0.5))-1) (pas exactement le même que t1, mais correct pour les non-nombres négatifs).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top