Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Wireframe usando coordenadas baricentricas

Iniciado por KneDa, 16 de Octubre de 2012, 10:53:11 AM

« anterior - próximo »

KneDa

Saludos chicos, el caso es que estaba intentando usar esta técnica http://codeflow.org/entries/2012/aug/02/easy-wireframe-display-with-barycentric-coordinates/ para mostrar mis modelos en modo wireframe y estoy pensando en como calcular cada eje de coordenadas en los vertices de los triangulos { (1,0,0) , (0,1,0), (0,0,1) } .

Las estructuras de mis modelos 3d son algo tal que:

class Edge {
private:
   Vertex* from_;
   Vertex* to_;
   std::vector<Triangle*> faces_;
}

class Triangle {
private:
   Vertex* vertex_[3];
}

class Vertex {
private:
}

No hay vértices duplicados y cada triángulo debe ser de la forma { (1,0,0) , (0,1,0), (0,0,1) } .

Si alguien sabe de alguna solución estaré encantado de oirla :D

XÑA

Me he leido el doc y me parece muy inteligente. Lo que parece que hace es que al interpolar, lo que realmente le está dando es la distancia al eje. Y si la distancia es <<valor> entonces lo pinta. Luego ya me pierdo con lo de fwidth, pero la idea me parece genial.
Sin embargo...¿Porqué no activas el modo WireFrame y listo?
Un problema que le veo es con los tríangulos indexados. Un mismo vértice se comparte así que...¿no tendrás problemas con eso?

Otro problema que le veo es que eso de pasarle un Vec3 como que no mola nada. Yo usaría la w del vector posición ( que no se usa) y luego lo convertiría a barycentric. ¿Cómo? Pues con ifs, o usando un array....
if(position.w==0) barycentric=float3(1,0,0);
if(position.w==0.5) barycentric=float3(0,1,0);
if(position.w==1) barycentric=float3(0,0,1);

KneDa

Hola XÑA, primeramente, gracias por participar. A ver, me intentaré explicar mejor:

Si el modelo almacena vértices duplicados por cara implementar esta técnica es trivial, de hecho ya la tengo funcionando para este tipo de modelos. Pues es simplemente asignar a cada vértice del triangulo los ejes {(1,0,0),(0,1,0),(0,0,1)} , que servirán para definirte una coordenada de posición baricéntrica en el fragment shader, la cual será usada para calcular las distancias y pintar el wireframe o lo que tu quieras. Con respecto al usar fwidth, he probado la diferencia y la verdad mejora mucho, ya que el wireframe es suave, a diferencia de calcular distancias constantes.

Ahora bien, volviendo a lo que he preguntado en primer lugar, si el modelo trabaja con vértices únicos (es decir, triángulos indexados), qué manera/algoritmo habría para calcular/asignar los ejes {(1,0,0),(0,1,0),(0,0,1)} por vértices. Se te ocurre algún algoritmo? Todavía no he encontrado la solución.

XÑA

Bueno, quizás podrías probar con el VertexID y PrimitiveID. A ti en realidad te da igual el id. Divides por 3 y haces el if, y en teoría tendrás el valor que necesitas...

http://msdn.microsoft.com/en-us/library/windows/desktop/bb205118(v=vs.85).aspx

Ya me contarás.... ;)

KneDa

Bueno, el caso es que se trata de una tool que parsea mallas desde mental ray, las procesa, comprime y exporta a formato propio. Uno de los atributos generados en dicho modelo serán dichas coordenadas baricéntricas. Así que necesito pensar un algoritmo ;D

BTW, a la hora de renderear las mallas estoy usando webgl :-)

XÑA

Ufff. difícil me lo pones....Esto parece un ....RETO!!!  :o

Pensaré un poqutio... :P

KneDa

Jejeje, lo se... ayer he estado pensando sobre ello y no encontré la forma, así que me rendí y actualmente estoy utilizando la solución sencilla con vértices duplicados.

Pero si que me gustaría encontrar la forma óptima, me parece bastante interesante la idea y ya no solamente en cuanto a este tipo de ejes y mallas triángulares.

Si generalizamos el problema a mallas de polígonos de N lados y conjuntos de N elementos, distribuir unívocamente dichos elementos en cada vértice es bastante interesante.

De todas formas, volvamos a mallas triangulares y conjuntos de 3 elementos { (1,0,0), (0,1,0), (0,0,1) } que ya es bastante!!!

Yo creo que los tiros igual van por aquí... http://en.wikipedia.org/wiki/Graph_traversal . A saber... :P

XÑA

Sólo se me ocurre con vértices duplicados. Es que en realidad es el mismo problema que tenemos con un cubo texturizado por las 6 caras. El mismo vértice (la posición), pero U,V diferentes.

En fin, reto...¡no conseguido!  :-\

Manu343726

yo tengo exactamente el mismo problema: quiero generar una malla 2d a base de "parches" de diferentes texturas. Pero los vértices que son compartidos por varios parches deberían tener coordenadas de textura diferentes. Y la solución de vértices duplicados no me mola, si la gracia del invento era reducir el uso de vértices. Es cierto que ahorro muho comparado con dibukar todos los "tiles" de la malla quad a quad, pero.....

XÑA

Yo al principio, con DX9, pensé que esto era un gran limitación, y que los que crearon el API no tenían ni idea. Pero luego me di cuenta que a nivel de cache, es, con diferencia, lo más óptimo, al tener todos los datos de los vértices correlativos en la memoria.
De hecho, en un engine que hice, probé a usar streams diferentes para Pos y texturas, y me bajaba el rendimiento una barbaridad. Por eso caí en la cuenta de que lo que en teoría era un 'patinazo' de la API, en realidad era para 'obligarte' a ser GPU-Friendly.


KneDa

Manu343726, no veo que tu problema sea similar a lo que he planteado, es decir, en mi caso si que existe una solución para distribuir un conjunto de tres elementos indistinguiblemente en todos los vértices de la malla (aunque no se me ocurra la manera de hacerlo).

Pero en tu caso, si unwrapeas las coordenadas de textura del modelo y visualizas dicho mapeado del modelo en 2d comprobarás que no es posible evitar el caso de los vértices duplicados en estos vértices compartidos por varios "parches" como tu dices.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.