jump to navigation

El mapeado de texturas August 31, 2004

Posted by winden in coding, demoscene.
add a comment

El otro día me escribía un colega, peskanov/capsule, a ver si podía tb. sacar las ecuaciones para calcular coordenadas de texturado. Pues bien, aquí tenemos las ecuaciones para aplicar un texturado lineal.

Ecuación implícita del plano a pintar:

[1] a.X + b.Y + c.Z + d = 0;

Ecuación implícita del valor a interpolar:

[2] e.X + f.Y + g.Z + h = u;

Ecuaciones paramétricas del pixel:

[3] X = t.x; Y = t.y; Z = t.1;

sustituimos 3 en 1 y 3 en 2:

[4a] a.t.x + b.t.y + c.t + d = 0;
[4b] e.t.x + f.t.y + g.t + h = u;

sacamos factor común de t y despejamos los ceros:

[5a] t . (a.x + b.y + c) + d = 0;
[5b] t . (e.x + f.y + g) + h – u = 0;

despejamos la t:

[6a] t = ( – d) / (a.x + b.y + c);
[6b] t = (u – h) / (e.x + f.y + g);

e igualamos:

[7] (-d) / (a.x + b.y + c) = (u – h) / (e.x + f.y + g);

vamos despejando la u:

[8] (-d) . (e.x + f.y + g) / (a.x + b.y + c) = (u – h);

expandimos el producto de la d:

[9] -(e.d.x + f.d.y + g.d) / (a.x + b.y + c) = (u – h);

y terminamos de despejar la u:

[10] h – (e.d.x + f.d.y + g.d) / (a.x + b.y + c) = u;

et voilà! ¿Como se usa esto?

Bien, solo hay que sustituir las coordenadas (x,y) de cada pixel de la pantalla en la ecuación 10 y ya tenemos el valor de la coordenada u.

Como mezclar el nuevo triangulo con el dibujo que ya está en la pantalla August 27, 2004

Posted by winden in coding, demoscene.
add a comment

Bien, supongamos que tenemos 3 variables:

m = (0,0,-1,-1,-1,-1,-1,0)
c = (9,9,9,9,9,9,9,9)
s = (1,2,3,4,5,6,7,8)

donde C es el color con que queremos pintar el triángulo y S es el contenido anterior de la pantalla y M tiene un 0 en los puntos fuera del triángulo y -1 en los de dentro. Aplicando esta operación:

for(i = 0 .. 7) if(m[i]) s[i] = c[i];

tendríamos el resultado que buscamos. Sin embargo, podemos aprovechar las propiedades de las operaciones binarias AND y OR:

0 = 0 & x
1 = 1 | x

para quitar el if y tener un código 100% lineal:

a = c[i] & m[i]

a = (9,9,9,9,9,9,9,9) & (0,0,1,1,1,1,1,0)

a = (0,0,9,9,9,9,9,0)

b = s[i] & ~m[i]

b = (1,2,3,4,5,6,7,8) & ~(0,0,1,1,1,1,1,0)

b = (1,2,3,4,5,6,7,8) & (1,1,0,0,0,0,0,1)

b = (1,2,0,0,0,0,0,8)

c = a | b

c = (0,0,9,9,9,9,9,0) | (1,2,0,0,0,0,0,8)

c = (1,2,9,9,9,9,9,8)

lo que se traduce en este bucle:

for(i = 0 .. 7){
a = c[i] & m[i];
b = s[i] & ~m[i];
s[i] = a | b;
}

¿Adivinais que ventajas tiene este código?

Optimizando en dibujado August 26, 2004

Posted by winden in coding, demoscene.
add a comment

En mi último post, os decía que el algoritmo de dibujado era muy muy facil de optimizar. ¿Habéis descubierto como?

En un render de triángulos convencional, se suelen seguir estos pasos:

1. Calcular las ecuaciones paramétricas para cada lado del triángulo.

2. Iniciar un bucle para cada scanline…

2a. Para cada scanline, calcular x0 y x1 con los puntos inicial y final del triángulo.

2b. Pintar todos los pixels entre x0 y x1.

Este método tiene un problema fundamental a la hora de optimizarlo; cada scanline tiene un ancho diferente, así que no podemos hacer trucos de calcular varias scanlines en paralelo (¿cuando paras cada una?), o varios pixels en paralelo (¿y si uno de ellos se sale fuera del triángulo?). Así pues, tenemos un precioso procesador capaz de ejectar N operaciones concurrentes, que solo va a poder hacer una.

En el dibujado por implícitas, para cada pixel tenemos que calcular tres valores con tres ecuaciones diferentes, y usar los tres resultados… algo así como:

v1 = calcular(x,y,eq1);
v2 = calcular(x,y,eq2);
v3 = calcular(x,y,eq3);
if(v1

De donde viene el nombre de wind? – part 1 August 17, 2004

Posted by winden in in real life.
add a comment

Situación usual una noche cualquiera:

wind: Hola mira te voy a presentar a un colega, se llama Miguel.

María: Hola, yo soy María :) *besos*

Miguel: María, él es wind :)

wind: *besos*

María: Espera como has dicho que te llamas, win?!?!??!

“win” lo podeis sustituir por willy, viti o incluso… whiskey!!!! XD (MJ, tu yaya es la bomba!)

Así pues, os cuento mis problemas con los nombres:

1. A efectos de curas, me llamo Raul.

2. A efectos de jueces, me llamo Antonio.

3. A efectos de colegas, me llamo Wind.

Una vez que estás acostumbrado a que te llamen a veces Raul y a veces Antonio, es realmente trivial dar el siguiente paso y decir “pues prefiero elegir yo mismo mi nombre…” y ponerte otro.

Llegamos al punto donde he decidido ponerme otro nombre, cosa usual en el tema de la Scene… cual me pongo? Eso os lo dejo para otro día…

Un saludo, Raul Antonio Wind Winden of Network

El dibujado por implícitas August 9, 2004

Posted by winden in coding, demoscene.
add a comment

Bueno, espero no liarme a escribir demasiado…. este es el primer post al blog, y voy a procurar ir escribiendo sobre aquellas cosillas que vaya probando o pensando acerca del rendering por software para demos, algo que ya está en desuso pero también francamente apasionante.

La rutina que he empezado hoy ha sido el render de triángulos por ecuaciones implícitas, algo que sonará a chino a casi todos, pero que tiene mucho potencial a la hora de manejar grandes cantidades de polígonos en pantalla. ¿Como funciona? A grandes rasgos, es algo así:

1. Calcular, de alguna forma, las coordenadas (x,y) de cada vértice de nuestro triángulo. En mi caso para probar he puesto unos valores fijos.

2. Calcular con estos valores, las ecuaciones de las rectas que unen los vértices. Quedan 3 ecuaciones del tipo A * x + B * y + C = 0, una para cada lado (y con sus propios coeficientes).

3. Hacer dos bucles anidados X e Y para recorred todos los pixels de la pantalla, y para cada uno…

4. Usando las ecuaciones, comprobamos que el punto está dentro del triangulo, sin más que sustituir sus coordenadas. Si los tres valores son positivos, entonces el punto está dentro, y sino está fuera.

El algoritmo implementado de esta forma es una burrada, pero con ese caso básico es muy muy facil optimizarlo, así que en estos días os iré contando que cosas se le puede hacer (truco: echad un vistazo a la captura).

implicit1

Nos vemos!