Pregunta

Hacer que me perdone si esto se ha preguntado antes, he estado buscando la respuesta a esta todo el día y todo lo que estoy subiendo es ayudar con azulejos basado en juegos 2D.x~x

Estoy tratando de crear un skinnable interfaz gráfica de usuario en Direct3D 9, utilizando un archivo XML que tiene posiciones para cada elemento y una opción para estirar o en mosaico.El estiramiento es bastante simple procedimiento, pero he sido incapaz de encontrar una manera de baldosa una pequeña sección de una textura.Tradicionalmente mosaico de una textura me acaba de establecer las coordenadas UV a > 1.0, pero el origen de coordenadas de la textura sólo va a ser un pequeño subconjunto de la totalidad de la textura, como de 0,4 a 0,5.

Tengo la sensación de que me he perdido algo muy obvio, pero ¿cómo iba yo a ir simplemente de baldosas en lugar de estirar?Mi mejor conjetura es que tiene algo que ver con tener más de un conjunto de coordenadas de textura, pero a partir de ahí, no estoy seguro de a dónde ir.

El proyecto que actualmente utiliza la función fija de tuberías, por lo que prefiero una respuesta con que si es posible, pero no quiero bajar una respuesta que utiliza un sombreado si esa es la única manera.

¿Fue útil?

Solución

Yo entiendo que usted quiera azulejo sólo un subconjunto de la textura, a la derecha?Luego las cosas se complican.

Suponga que queremos azulejo u-coord entre u1 y u2 valores, u1 < u2.

Entonces tenemos una función f(u), de modo 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...

Una función apropiada es f(u) = frac(u) * (u2-u1) + u1

Lo mismo va para los v-coord, f(v) = frac(v) * (v2-v1) + v1

Aviso que es de baldosas sin reflejo.Si usted necesita la creación de reflejo, entonces la función debe ser un triangular de la función de onda, que es t(x) = arcsin(sin(pi*(x-0.5)))/pi+0.5 y f(u) = t(u) * (u2-u1) + u1.El uso de funciones trigonométricas puede ser caro.

No sé si es posible con tubería fija, pero se puede hacer fácilmente en pixel shader (HLSL código):

// 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);

o

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

EDITAR:una mejor manera de calcular triangular de la función de onda: t1(x) = abs(2(0.5x-floor(0.5x+0.5))) o t2(x) = abs(2(frac(0.5x+0.5))-1) (no es exactamente la misma como la t1, pero correcto para no números negativos).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top