Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Tutorial de como conseguir una buena apariencia de un coche

Iniciado por Fran, 17 de Julio de 2007, 11:19:53 AM

« anterior - próximo »

Fran

En OpenGL con shadow mapping, texturas, etc... . Es decir. La herramienta la tengo pero quiero saber q materiales , texturas, etc ... aplicar asi como si tengo q usar Fresnel, etc

tamat

Por un stratos menos tenso

Tei

Cita de: "tamat"que me haspen si no falta un verbo en esa frase



yo creo que se le entiende muy bien, pregunta que efectos hay que aplicar para que quede bien bonito un modelo de un coche (goraud, shaders, estas cosicas...)

Fran

Cita de: "tamat"que me haspen si no falta un verbo en esa frase

Pues le falta una coma o punto a gusto del consumidor, es cierto. Problemas de escribir rápido. Igual que a tu aspar le sobra una h.

marcode

Yo creo que un cube environment mapping mezclado con un color (el de la pintura del coche) o blanco/gris para las partes metálicas es necesario para que parezca real, se puede prescindir de iluminación especular si se incluyen los brillos en la propia textura del mapa, y queda mejor incluso con pocos polígonos.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

ethernet

Opino lo mismo que marcode, con ambient, difusse (por pixel) y luego un poco de env map con una textura con reflejos puede quedar muy chulo. Tb puedes meterle unos glow, fake-fresnel en el env y AO. Aunque ahí ya te puedes complicar todo lo que quieras, meterle sombras, detalles en cada una de las partes, reflejos de los cristales y espejos, etc, etc.

La siguiente imagen la hice en 5 minutos y no quedó mal del todo:


Otra con lo mismo:



Tiene AO por vértice (no son LM), Envmap simple (no cubemap) con una textura perlin noise con pocas octavas.

Ya nos pondrás tus avances :)

Fran

Joer. Me lo explique. :)))).  A ver. Como has hecho esas capturas. Es exactamente lo q necesito. Q texturas has usado???. Qué es esto???

"glow, fake-fresnel en el env y AO"

Como haces el glow con OpenGl??? y como haces un fake del efecto Fresnel? Qué quieres decir con AO???

Fran

Cita de: "marcode"Yo creo que un cube environment mapping mezclado con un color (el de la pintura del coche) o blanco/gris para las partes metálicas es necesario para que parezca real, se puede prescindir de iluminación especular si se incluyen los brillos en la propia textura del mapa, y queda mejor incluso con pocos polígonos.

Esto ya lo he usado pero no me termina de convencer. Me falta el efecto de las capturas de pantalla de arriba.

marcode

Cita de: "Fran"
Cita de: "marcode"Yo creo que un cube environment mapping mezclado con un color (el de la pintura del coche) o blanco/gris para las partes metálicas es necesario para que parezca real, se puede prescindir de iluminación especular si se incluyen los brillos en la propia textura del mapa, y queda mejor incluso con pocos polígonos.

Esto ya lo he usado pero no me termina de convencer. Me falta el efecto de las capturas de pantalla de arriba.

¿a qué efecto te refieres?.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

Fran

Cita de: "marcode"
Cita de: "Fran"
Cita de: "marcode"Yo creo que un cube environment mapping mezclado con un color (el de la pintura del coche) o blanco/gris para las partes metálicas es necesario para que parezca real, se puede prescindir de iluminación especular si se incluyen los brillos en la propia textura del mapa, y queda mejor incluso con pocos polígonos.

Esto ya lo he usado pero no me termina de convencer. Me falta el efecto de las capturas de pantalla de arriba.

¿a qué efecto te refieres?.

A esa apariencia de metal mica tan que me encanta. Yo de efectos y diseño->cero patatero. Por ejemplo en los cubos de colores ese efecto. En el color crema el efecto ese mezclado con que la parte de arriba esté tan metalizada y los laterales no. No sé. No sé conseguir eso con OpenGL. Sé q es a base de iluminación y texturas, pero no sé. Lo q es reflejos del entorno y todo eso pues está conseguido. Pero eso, ese efecto exactamente no sé como sacarl. Por ejemplo. ¿En qué se aplica el Perlin Noise ahi? En los cubos?? No sé me hubiera ocurrido nunca, pero es q además ni siquiera sé donde está usado en los cubos ni como

marcode

Imagino que te referirás a algo así, aunque aquí parece que está demasiado exagerado el efecto:


El propio entorno capturado en la textura esta mezclado de algún modo con el color del coche, practicamente no tiene nada más, porque la iluminación que recibe está ya determinada en la propia textura. Pero yo no sé exactamente el tipo de mezcla que lleva, porque si sumas a un color los de la textura queda muy claro, y si lo modulas queda muy oscuro.

Yo por lo que he probado lo mejor es mezclar previamente en la propia textura el color.

Entonces, sería de este modo.

1. En el backbuffer renderizas los 6 planos del entorno desde el centro del coche, con el fov de la camara a 45º (esto no sé si lo haces así).

2. Dibujas un quad encima de cada render, de un color donde está determinado el color del coche y la cantidad de alfa, mezclado con la combinación habitual SRC_ALPHA - ONE_MINUS_SRC_ALPHA.

3. capturas el render en la textura correspondiente.

Si ya tienes precalculada la textura, puedes ahorrarte todo eso y mezclarla con el color del coche desde alguna aplicación.

4. dibujas el coche activando la textura cúbica y usando mapeado GL_REFLECTION_MAP. Le puedes añadir también iluminación sin ningún problema con un material de color blanco o gris.

Prueba a ver cómo queda así y nos lo enseñas.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

Fran

No se ve el gráfico. Pero algo similar a lo que describes ya lo hago. Puedes enlazarlo para poder verlo ???. Ya lo he visto. Ese es un ejemplo de ATI hecho con shaders. De todos modos, lo que dices lo he probado excepto que no uso cube map. Los reflejos como bien dices, a base de mezclar colores y el entorno se consiguen. Pero lo q no me sale es ese efecto de pintura mica que ese coche tiene y los cubos de Ethernet (q a ver si me dice con que lo hace) tienen. De todos modos mañana colgaré una demo de lo q llevo

ethernet

vertex shader

varying vec3  Normal;
varying vec3  EyeDir;
varying vec4  vcolor;
varying float LightIntensity;

uniform vec3  LightPos;
attribute float ao;


void main(void)
{
   gl_Position    = ftransform();
   Normal         = normalize(gl_NormalMatrix * gl_Normal);
   vec4 pos       = gl_ModelViewMatrix * gl_Vertex;
   EyeDir         = pos.xyz;
   vcolor = ao*gl_Color;
   LightIntensity = max(dot(normalize(gl_LightSource[0].position.xyz - EyeDir), Normal), 0.0);
}

pixel shader


float schlickapprox(in float cosphi,in float kr)
{
float o = (kr - 1.0)/(kr+1.0);
o *= o;
return o + (1.0-o)*pow(1.0-cosphi, 2.0);
}



const vec3 Xunitvec = vec3 (1.0, 0.0, 0.0);
const vec3 Yunitvec = vec3 (0.0, 1.0, 0.0);


/*const vec3  BaseColor = vec3 (228.0/255.0,208.0/255.0,158.0/255.0);*/
/*const vec3  BaseColor = vec3 (0.4,0.4,0.4);*/
const float MixRatio = 0.7;

uniform sampler2D tex1;
varying vec4  vcolor;
varying vec3  Normal;
varying vec3  EyeDir;
varying float LightIntensity;

void main (void)
{
float fres;
vec3  ed,n;
vec3  BaseColor;
   vec3 reflectDir = reflect(EyeDir, Normal);

 

   vec2 index;
   BaseColor[0] = vcolor[0];
BaseColor[1] = vcolor[1];
BaseColor[2] = vcolor[2];

   index.y = dot(normalize(reflectDir), Yunitvec);
   reflectDir.y = 0.0;
   index.x = dot(normalize(reflectDir), Xunitvec) * 0.5;

 

   if (reflectDir.z >= 0.0)
       index = (index + 1.0) * 0.5;
   else
   {
       index.t = (index.t + 1.0) * 0.5;
       index.s = (-index.s) * 0.5 + 1.0;
   }
   
 

   vec3 envColor = vec3 (texture2D(tex1, index));

 
ed = normalize(EyeDir);
n = Normal; /*normalize(Normal);*/

fres = schlickapprox(dot(-ed,n),1.0);



   /*envColor = mix(envColor, BaseColor, MixRatio);*/

/*envColor = mix(BaseColor*LightIntensity, fres*envColor, MixRatio);*/
envColor = BaseColor*LightIntensity + fres*envColor;

   gl_FragColor = vec4 (envColor, 1.0);
}



La textura de envmap está generada proceduralemnte así:

Esto por cada pixel (xx,yy) coordenadas y c[] es el color de salida.

float mult = 7;
float xx = mult*float(s)/256.0;
float yy = mult*float(t)/256.0;

float n3  = TilePerlinNoise2D(xx,yy,2,mult,2);

//n3 = n3*n3;
n3 = smoothstep(-0.2,0.7,n3);
c = RGBA(255,255,255)*n3;


c[3] = n3*255;


Genera lo siguiente:

Fran

Vale. El vertex shader lo entiendo. Cuando no usaba OpenGL ese truco o usaba en el
render soft q tenia pero el efecto no era el q deseo. Es multiplicar escalarmente
la normal en cada punto por el vector formado entre el viewer y ese punto. Por cierto
No entiendo de donde sacas ao, aunque tb será xq no he visto nunca shaders.

El de pixel es lo de Fresnel.

La lástima de esto es que si la tarjeta no tiene shaders, no se puede hacer.

Lo q me tiene sorprendido es q esta textura consiga ese resultado. Lo probaré.
Gracias.

ethernet

ao es el factor de ambient oclusion por vértice que en pocas palabras es un valor de 0.0 a 1.0 que indica cuanta luz no le llega por "culpa" de los demás objetos de la pantalla. Ese parámetro lo precalculo anteriormente.

Luego lo de la textura no tiene nada, hubiera funciona bien con cualquier otra con blancos y negros.






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.