PDA

Ver la versión completa : Ayuda con Cel-Shading, alguien que sepa de opengl plis



Locke
31/10/2004, 18:35
A ver, estoy empezando un nuevo engine usando Cel-Shading. En principio la cosa marcha, pero tengo un problema al dibujar los bordes.

http://www.filespace.org/Locke/cel_shading_0.2.png

Lo que intento hacer es dibujar el mismo objeto en negro, un poco mas grande y con el culling invertido.

Para agrandar el tamaño lo que hago es sumar a cada vertice su normal:


glBegin (GL_TRIANGLES);
for (i=0; i<model.polyNum; i++)
{
for (j=0; j<3; j++)
{
glVertex3f((model.vertexData[model.polyData[i].Verts[j]].Pos.X - (2 * model.vertexData[model.polyData[i].Verts[j]].Nor.X)),
(model.vertexData[model.polyData[i].Verts[j]].Pos.Y - (2 * model.vertexData[model.polyData[i].Verts[j]].Nor.Y)),
(model.vertexData[model.polyData[i].Verts[j]].Pos.Z - (2 * model.vertexData[model.polyData[i].Verts[j]].Nor.Z)));
}
}
glEnd();

Pero los poligonos no se agrandan, solo cambian de posicion, quedando separados en el objeto final. Habiendo una normal por cada vertice no deberian quedar siempre en la misma posicion final aunque sean llamados por diferentes poligonos?

A ver si alguien me pudiera dar una pista... :)

Muchas gracias

Nacho
31/10/2004, 18:38
hala!!!. que chulada... yo no tengo ni idea, lo siento. Oye, pues a mi me gusta el efecto este con los bordes "rotos"

Locke
31/10/2004, 18:41
Me alegro de que te mole.

Como de verdad queda muy chulo es con el borde negro y encima el efecto de bordes rotos en blanco. ESO si que es cool :cool:

nazca
31/10/2004, 18:50
Opino igual que Nacho, así ya está genial, porque parece como si fuera un esbozo. ^___^

PD: Cuando me dijiste lo que tenias pensado hacer no me pude imaginar que iba a tener tan buena pinta. Ánimo!!

The Sabbat
31/10/2004, 20:00
Genial el efecto de los trazos rotos.

Si puedes guarda esto y lo pones con los trazos bien.

CHUKNANO
31/10/2004, 20:26
Esta chulisisimo :D :D :D

Segata Sanshiro
31/10/2004, 22:05
Jeje, los mayores éxitos provienen de pequeños errores como este así que ánimo que llegarás lejos :D:D:D

Oye, ese uno rojo indica 1FPS? xD

fagotero
31/10/2004, 22:15
Escrito originalmente por Segata Sanshiro

Oye, ese uno rojo indica 1FPS? xD



Sí :D

Locke
31/10/2004, 22:16
Si, 1fps pero en el emu, en la consola tira a 6 o 7 a 156.

Con optimizaciones del codigo se podrian alcanzar algunos mas, pero es que hay que tener en cuenta que esta moviendo 1.000 poligonos... Casi los mismo que un nivel del MGS incluyendo los modelos :)

Puck2099
31/10/2004, 22:28
Está chulísimo Locke.

Por cierto, no irá de superheroes, ¿verdad?, lo digo porque como pediste ayuda para los diseños y artwork a lo mejor te venía bien el Hero Machine (en caso de que no lo conozcas ya).

Saludos

Soup
31/10/2004, 22:49
En dios.... XIII (gp32 version by Locke Studios) XDD

bulbastre
31/10/2004, 23:11
1000 polígonos???
Creí que con mil polígonos se hacían fantasmadas de grado superior, pero veo que no da ni pa pipas...
Claro que las texturas disimulan (léase PSX frente a los virtua fighter de saturn...), aunque tratándose de cell-shading...
En fin, los bordes molan.


PS: No hay otra técnica más nueva parecida al cell-shading pero que no lo es (y que no sea artist-toon, que creo que es lo mismo)???

Locke
01/11/2004, 00:00
Los 1000 poligonos son 498 del modelo y 498 del borde (no se si hay otra manera mejor de hacerlo, pero a mi no se me ha ocurrido xD ).

Eso si, la diferencia de framerrate con borde y sin el no es muy grande, asi que decidi dejarlo.

mortimor
01/11/2004, 00:06
Lo que gasta es el relleno de los poligonos no el framewire de los modelos.

Locke
01/11/2004, 00:13
mortimor, no usa wireframe (klimt solo soporta lineas de un pixel de ancho, y no se veia na) sino que pinta otro modelo completo pero con el culling invertido.

Como bien dices, lo que mas gasta es el pintado, aun asi, hacer el calculo para ver si tiene que pintar vertices o no, hacer las rotaciones, traslaciones y escalados es bastante costoso, y mas si tiene que hacer las operaciones de coma flotante por software.

Si consigo optimizarlo para que pueda mover 2 personajes como ese al doble de velocidad podremos tener algo interesante... :)

(_=*ZaXeR*=_)
01/11/2004, 00:38
uiiiii dos personajessss, esto me huele a lucha 3D.

Luisimage
01/11/2004, 00:41
Eso o un simulador de sexo...

BeaR
01/11/2004, 08:41
Escrito originalmente por Luisimage
Eso o un simulador de sexo...

:quepalmo: :quepalmo: :quepalmo: :quepalmo: :quepalmo: :quepalmo: :quepalmo: :quepalmo:

Locke ke pinta tiene :babea:

Salu2 :musico: :brindis: :musico:

Patxi
02/11/2004, 00:26
La verdad es que a mi también me gusta como está, aunque supongo que no es exactamente lo que quieres.

En el código que pones restas la normal. No se si será un fallo o tendrá un motivo. Puede ser cosa del Z-buffer?. He mirado un poco el klimt y tampoco tiene glPolygonoffset.

Lo único que se me ocurre es dibjar el modelo normal con glDepthFunc(GL_LESS), y luego dibujar el modelo en negro con el face culling apropiado y con glDepthFunc(GL_LESS_OR_EQUAL). Igual ya lo haces así, pero por si acaso lo pongo :) . También puede servir glDepthRange, aunque no se si un algoritmo así será muy robusto. Me da que no.

Otra cosa, en vez de sumar la normal, para hacer el modelo más grande has probado con glScale? Me imagino que quedará peor, pero igual es más rápido

saludos

Locke
02/11/2004, 00:35
Muchas gracias por las respuestas Patxi. Te cuento:

La normal se la resto porque al hacer los calculos me salen invertidas, y me daba lo mismo cambiarla de signo aqui que en el otro lado. No me acordaba que lo habia dejado asi, ya lo cambiare para que se vea mas claro.

Lo del LESS y LEQUAL ya lo aplico, pero porque me lo soplaron. En realidad no entiendo por que se tiene que usar asi, pero bueno xD

Lo de sumar la normal es porque lo que quiero es hacer el modelo mas grueso, no mas grande. Es un poco dificil de ver la diferencia, pero existe. Por ejemplo piensa en el hueco que hacen los brazos con el tronco. Con un escalado el hueco aumetaria de manera proporcional, cuando en realidad lo que quiero es reducirlo. No se si habra otra manera mas optima de agrandarlos, pero es lo que se me ocurrio.

Patxi
02/11/2004, 12:08
Cre que ya se porque te pasa lo que dices en el primer post. Eso de que los poligonos no crecen, sino que aparecen separados del modelo. En las piernas y los pies se nota más eso que dices. (Es que al principio no había entendido que querías decir :/ ).

Igual me equivoco, pero me da que calculas las normales haciendo el producto vectorial para cada triangulo. Igual por eso te salen hacia adentro, porque el producto vectorial es anticonmutativo y es muy fácil multiplicarlos "al reves". Si lo haces así es normal que te pase eso porque lo que estas calculando es la normal de la cara, como en la imagen de la piramide esa. Lo que habría que hacer es calcular la normal de cada vertice, en vez de cada triangulo. Esto es mas chunguillo la verdad :( .

En el dibujillo ese, por ejemplo la normal del vertice de arriba debería ser una flecha mirando hacia arriba.

saludos

moai
02/11/2004, 12:29
La verdad es que tal como está queda muy curioso, si pudieses estaría bien ponerlo de opción o así... El cell shading es un recurso gráfico que da mucho de sí, siempre me ha gustado :) Ánimo

Locke
02/11/2004, 16:46
Patxi, el problema es un poco mas complicado, porque yo mi modelo lo guardo como una lista de poligonos y otra de vertices. Cada poligono son 3 indices al array de vertices y el tipo vertice contiene la posicion y la normal.

Asi que los vertices son independientes del poligono que los llama. Siempre deberia aplicarsele el mismo desplazamiento al mismo punto, pero no es asi.

Ahora estoy planteandome si puede ser por hacer el deplazamiento de los vertices y aplicar un escalado de la figura completa... de todas maneras repasare el codigo donde calculo las normales porque me estaban haciendo cosas raras y he lo arregle metiendo parches cutres en vez de encontrar el error ñ_ñ

PD. Si quieres y no te asusta mirar codigo sucio y malo puedo enviarte lo que llevo, que tu base de algebra seguro que es mejor que la mia... :) Mandame un mp con tu mail y te lo envio.


Moai, despues en movimiento no queda tan chulo, pero va en gustos. Ya os pondre alguna animacion para que veais como va el tema.

bulbastre
02/11/2004, 17:03
Y no hay manera de que los bordes no sean esos 400 y pico poígonos?
Creí que en el cell-shading sólo se hacían polígonos para la figura y las líneas negras se generaban solas por el borde de los personajes, siendo 2D y sin ser, por lo tanto, polígonos

FunkyBoy
16/11/2004, 19:49
Yo monté un cell-shading hace ya algún tiempo....

Usé un método diferente, pinta bastante menos pero tienes que hacer más cálculos.

Hay dos métodos:
1: Te generas una lista con todas las aristas. Cada arista debería usarse en dos polígonos (si solo se usa en uno es que es un borde y siempre tienes que pintar esa arista). Despues compruebas la visibilidad de cada polígono y marcas las aristas en las que se ve un polígono si y el otro no. Después pintas esas aristas. Puedes usar triángulos o lo que quieras (lineas, quads, etc.) Este método es un poco lento.

2: Este método es algo más rápido y consiste en pintar como borde solamente los polígonos cuya normal sea casi perpendicular a la cámara. Es relativamente rápido de calcular y da el pego.

La mejor manera de hacerlo y las más rápida (solo para PC y XBOX) es con un pixel-shader. Se aplica un filtro para encontrar diferencias en las normales o en el ZBufer por cada pixel y es bastante rápido y tienes precisión al pixel.

No creo que con lo que te he contado te haya ayudado mucho, pero bueno...

Locke
16/11/2004, 20:11
Lo suyo seri hacer lo que estoy haciendo ahora pero pintando los poligonos negros solo en wireframe.

En el Klimt no habia opcion de establecer el grosor de las lineas, asi que era imposible porque lineas de 1 pixel eran invisibles.

En el nuevo motor que estoy preparando tengo previsto implementar un pintado wireframe rapidito, asi que creo que esta ultima sera la mejor opcion...

Patxi
16/11/2004, 22:42
Se me acaba de ocurrir que igual podrías hacer tu las lineas del grosor que quieras con quads. Podrías desactivar el z-buffer en ese momento para evitar z fighting y listo. Acuerdate de orientar el quad adecuadamente. Con el vector n de la camara, y el vector que indica la dirección de la linea que quieres dibujar ya tienes todo lo necesario.

Las lineas quedarán muy cuadradas (lógicamente) igual puedes suavizar los extremos poniendo una textura con alpha en ese quad o algo de ese estilo. No conozco las limitaciones del klimt o si eso sería demasiado lento.

Igual funciona, no lo he pensado con detenimiento.

saludos