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!
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
Muchisimas gracias. Ahora mismo lo miro!
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.
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.
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!!
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!!
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
¡Creeme hay poca información! O por lo menos no está muy clara!
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
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
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!
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.
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.
Vaya, asi que lo entendi mal. No necesito shaders. Creo que lo he confundido... lo que tu me decias, Ithaqua, era que con shaders te ahorrabas pasadas por lo de la especular, no?
A ver, creo que el efecto de autosombreado en la propia textura me sale bien. Eso ya es relieve, no?
El tema que realmente me tiene en jaque en este momento es el vector de la luz que se le aplica al Dot3. Por lo que he podido experimentar, el vector de la luz se le pasa con un glColor3f, no? He visto que en Direct3D se le pasa con el TextureFactor, que no se que leches es... en fin, la duda que tengo ya la comente, pero voy a intentar resumirla y clarificarla:
Si yo hago un glDrawElements de una habitacion, por ejemplo, puedo hacer que a cada pared le afecte una iluminacion distinta? La unica forma que se me ocurre seria con los vertex colors, indicando uno por triangulo, que seria el vector de ilumincacion, y si realmente se hace asi, deberia calcular este vector por cada triangulo cada vez que la luz se moviese?
Lo dicho, esto es un jaleo x( Perdon por rallar, pero es que no encuentro ni un puñetero tutorial, ni codigo fuente ni nada!
Muchisimas gracias por toda vuestra ayuda.