Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





DotProduct3

Iniciado por MChiz, 26 de Marzo de 2003, 03:59:24 PM

« anterior - próximo »

MChiz

                                Hola!

Estoy intentando enchufar a mi motor el DotProduct3. Mi motor corre bajo OpenGL.
He visto como se hace con Direct3D, y no parece demasiado complicado, pero hay algo que no se hacer en OpenGL. Se trata del TextureFactor. Cual es el homonimo en OpenGL? Es mas, se hace asi? ^_^
En fin, si alguien me pudiese ayudar, le estaria muy agradecido.
Un saludo!                                

BeRSeRKeR

                                Creo que para hacer per-pixel bump mapping en OpenGL, tienes que utilizar los register combiners. Mira en la página web de nVidia o de ATI donde encontrarás documentos y código fuente sobre el tema...también te puede ayudar una serie de tutos que escribió Ron Fraizer sobre per-pixel lighting. El problema principal de utilizar register combiners es que se manejan a través de extensiones propietarias (nVidia, ATI...) y no sé si existirá una extensión para ello del ARB. Si no es así y quieres dar soporte para tarjetas nVidia y ATI, tendrás que crear una versión para cada extensión...

Saludos                                
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

BeRSeRKeR

                                Algunos links:

http://www.ronfrazier.net/apparition/index...arch/index.html

http://users.ox.ac.uk/~univ1234/opengl/bum...n/bumpatten.htm

Saludos.                                
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

MChiz

                                Muchisimas gracias. Ahora mismo lo miro!                                

MChiz

                                Creo haberlo conseguido pero tengo una ultima pregunta:
Que programa utilizais para generar el NormalMap? Yo uso uno de nVidia, el NormalMapGen, pero a veces me hace cosas raras. Este programa se puede basar en el canal alpha ( que representaria la altura ) o en el color. Que es lo mas adecuado?
Muchas gracias de nuevo.                                

Ithaqua

                                En OpenGL tienes muchas formas de hacer el DOT3 bump mapping, el problema está en que la forma más standard (el texenv con el DOT3) es bastante limitada. Con las nvidia, si te dan algo de yuyu los fragment shaders puedes probar con sus hermanos pequeños, los register combiners. Con los register combiners en una tarjeta low-end (gf2) puedes conseguir diffuse+specularbump (HdotN)^5 y selfshadowing en una sola pasada, mientras que para conseguir el mismo efecto con texenv hay que hacerlo en 3 pasadas (2 para el specular, 1 para el diffuse) y sin selfshadowing y una potencia de specular más baja (4).
Hacer diferentes codepaths es relativamente sencillo, ya que el grueso del código no es configurar los diferentes modos de DOT3 precisamente.

En cuanto a lo de construir los normalmaps es bastante sencillo hacerlo por código. Yo personalmente también uso el plugin de photoshop que está en la web de nvidia, pero paso del canal alpha, lo genero a base de los canales RGB. Nunca he tenido problemas con él, podrías dar más detalles de los problemas?

     Saludos.                                
thaqua^Stravaganza
http://ithaqua.stravaganza.org

MChiz

                                Los problemillas que me da al generar el mapa de normales es: tengo una textura de una cara humana, le pongo sus normales y tal, y a la hora de renderizar, depende como direccione la luz, se ve O el pelo O la cara. Cuando uno se ve, el otro se ve negro. Y el cambio es continuo, no hay saltos. No se si hago mal el efecto DOT3 o que. Ah si! A raiz de esto: el normalmap se ve afectado por la normal del poligono que es texturizado? Lo digo porque si tienes un cubo visto desde dentro, y le metes ahi una luz, las caras se deberan iluminar de forma distina; no a todas les llega la luz del mismo sitio.
uf... todo esto de los register combiners escapan a mi entender, y ahora no tengo tiempo de mirarlos. Ahora mismo lo estoy haciendo como tu dices, con los glTexEnvf, pero si que es cierto que esta un poco limitadillo...
En resumen, me he de pasar a Direct3D? :b Es que por lo que veo, ahora esta mucho mas chulo que el 7 y anteriores. Ademas, parece que la gente deja OpenGL para irse con Direct3D ( Berserker, Haddd, ... ). Me podriais recomendar sobre esto, porfavor?
Muchisimas gracias!!                                

Haddd

                                D3D está muy bien una vez que lo entiendes, ¡lo que no es nada fácil! Para mi ese es su gran problema:la curva de aprendizaje. Por contra, la "estandarización" de conceptos es su gran baza. De todas formas yo empecé a analizar el DotProduct3 y encontré poca información, pero BerserKer tiene un visor que lo utiliza, así que la información existe!

Pero me da la sensación de que la gente que usa D3D no comparte mucho sus descubrimientos, porque encuentras montones de ejemplos de OGL y muy pocos de D3D. Menos mal que está el foro de Stratos!!                                

MChiz

                                Poca informacion?? Yo en la pagina de nVidia ( en la seccion developers ) encontre creo que 3 ejemplos de DotProduct3, pero todos para Direct3D. Y tambien esta el que te viene con las SDK, aunque no utilice difusa, pero vaya, tampoco tiene mas.
Entonces Haddd, tu me recomiendas Direct3D? Lo de la curva de aprendizaje no me preocupa tanto. Antes si, con las versiones anteriores al 8 :) He tocado un poco y no parece excesivamente diferente a GL.
Gracias de nuevo por las respuestas                                

Haddd

                                ¡Creeme hay poca información! O por lo menos no está muy clara!                                

Grugnorr

                                Yo veo mucha más documentación y facilidad para usar características modernas de las tarjetas en DX. Y el 95% del asunto es independiente de la API                                
hat the hells!

BeRSeRKeR

                                MChiz el problema tuyo me suena a que no generas el sistema tangente para cada vértice. Lo que hay que hacer es, para cada vértice calcular la tangente, la normal y la binormal y entonces transformar el vector luz a tangent space (la matriz de transformación es la formada por los vectores citados). De esta forma la luz debería calcularse correctamente.

De todas formas en OpenGL no se cómo se hará...

En Direct3D depende de si utilizas la fixed pipeline o los vertex & pixel shaders. Si es el caso de la fixed pipeline no hay demasiada información sobre el tema pero si es a través de shaders, entonces sí hay más info. En el caso de la fixed pipeline, lo que yo creo que hay que hacer es. Calcular la tangente, la normal y la binormal para cada vértice. Transformar el vector de la luz para cada vértice por la matriz que transformará a tangent space. Pasar el vector luz a RGB space:

r = 0.5 * normal.x + 0.5
g = 0.5 * normal.y + 0.5
b= 0.5 * normal.z + 0.5

Almacenar dicho color en el diffuse del vértice.

En el caso de que se quiera calcular el especular, calcular el halfvector, pasarlo a RGB space y pasarlo al vértice a través de la componente specular del vértice.

Ahora ya sólo quedaría poner los texture stage states necesarios para hacer dot3 con el diffuse del vértice (para calcular el diffuse) y dot3 con el specular (en caso de que quieras la componente especular). Así que se supone que diffuse+specular se hará en 2 pasadas.

De todas formas, de esto no estoy nada seguro ya que son conclusiones que he sacado por mí mismo ya que no he encontrado info sobre bump mapping con la fixed pipeline. Yo, como dije en el thread del visor de MD3, lo estoy haciendo con pixel shaders (diffuse+specular) en 1 pasada con GF3....

Saludos                                
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

MChiz

                                buf... gracias a todos, en serio. Creo que por ahora aparcare el tema, ya que no estoy nada enterado sobre PixelShaders... mira que es dificil todo esto x((
Pues nada, lo dicho, muchisimas gracias a todos!                                

Ithaqua

                                No necesitas pixel shaders para hacer bump mapping :)
Sigue con el gltexenv y mira bien que hagas todos los cálculos, la primera vez que se implementa cuesta mucho conseguir que se hagan todos bien.                                
thaqua^Stravaganza
http://ithaqua.stravaganza.org

Grugnorr

                                Uhm, aquí un paleto al que la Binormal le recuerda a su dolorosa asignatura de Estadística, cosa que no creo aplicable en el DP3. Alguien me explica qué es la binormal, por favor.                                
hat the hells!






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.