PDA

Ver la Versión Completa : Añadir texturas diffuse, normal y specular a un objeto tridimensional en GLScene


noob
23-01-2012, 11:45:26
Hola,

Quiero añadir texturas diffuse, normal y specular a un objeto tridimensional en GLScene con Delphi 6.

Tengo las tres texturas en tres archivos.

Diffuse_Map: Obj_Colors.jpg
Normal_Map: Obj_Normal.jpg
Specular_Map: Obj_Spec.jpg


Bola.Material.Texture.Image.LoadFromFile('Obj_Colors.jpg'); // Añado la textura diffuse
Bola.Material.Texture.Disabled := False;


Pero no se cómo cargar las texturas normal y specular. ¿Alguna idea?

Hasta luego.

Ñuño Martínez
23-01-2012, 12:48:11
Curiosamente llevo una semana o así repasando el Red Book (http://www.opengl.org/documentation/red_book/) para re-aprender OpenGL, y no veo en él nada sobre los tipos de textura que dices. Diffuse y specular son dos cualidades que tienen la iluminación y los materiales (esto es, glLight* y glMaterial*), por otro lado las normales son los vectores perpendiculares a un plano, que en gráficos se utilizan para calcular cómo se refleja la luz. Pero ya te digo que estoy re-aprendiendo y puede que lo haya olvidado (ahora estoy con las mezclas [blending], no he llegado a las texturas todavía, aunque ya he repasado materiales e iluminación).

Quizá si nos explicas cuál es el efecto que pretendes conseguir te podamos ayudar más.

noob
23-01-2012, 13:01:18
Te cuento un poco más como lo veo yo:

Diffuse_Map: Es el mapa o textura que da el color al objeto, los juegos más simples que se pueden correr en prácticamente cualquier maquina tienen únicamente este tipo de textura en sus modelos.

Normal_Map: Es la textura que puede hacer que un objeto con pocos polígonos luzca como si tuviese millones de vértices, este mapa es el que da los increíbles detalles de los juegos next-gen (Por ejemplo en las arrugas de la cara de un personaje).

Specular_Map: Es la textura que le dice al objeto como debe “brillar” o reflejar la luz , en donde debe hacerlo y con que intencidad, por ejemplo un objeto que tiene plástico y metal no brilla de la misma manera en los dos materiales.

Te adjunto unas capturas:

Objeto con textura diffuse:

http://i40.tinypic.com/hwfmv8.jpg

Objeto con textura normal:

http://i44.tinypic.com/1o6pky.jpg

Objeto con textura especular:

http://i44.tinypic.com/2exn9lt.jpg

Lo que yo quiero es cargar las tres a la vez para lograr el efecto correcto.

Saludos.

Lepe
24-01-2012, 12:14:24
No sé en GLScene...

En blender, tú tienes varias texturas como dice noob y las añades a texturas, después en el material es donde se especifica si modificará:
- el color
- las normales
- especularidad (brillo o como quieras llamarlo).

Además tendrás un shader activo que es el responsable de analizar los vértices (en caso de que la tarjeta trabaje así), o bien por píxeles, para aplicar el brillo y normal a cada vértice.

En el tema de Shaders hay muchas y de muchos tipos, bump shader, normal shader, normal + bump shader y el llamado monster shader que es una de las mejores ya que integra las tres cosas que estáis pidiendo, color, normales y especularidad. Es ésta shader la que necesita recibir las 3 texturas ya comentadas por noob.

Mirando, en sourceforge tienes el foro de shaders por si quieres investigar: http://sourceforge.net/apps/phpbb/glscene/viewforum.php?f=7


Ah, por cierto, para tener un diffuse más espectacular, detallado y realista, te aconsejo aplicarle un Ambient occlussion y después en Gimp multiplicar la capa diffuse con ésta nueva creado.

Saludetes

Ñuño Martínez
24-01-2012, 12:35:09
¡Ahhhh...! Vale, ahora ya está más claro.

Lo que tú llamas "textura normal" es, en realidad, mapeado de bultos o bump mapping, y hay varias técnicas para conseguirlo (el bump mapping propiamente dicho, paralax mapping, sub-división o tesselation, los famosos pixel shader... ). Lo que no sé es si GLScene tendrá alguna propiedad o método para hacerlo directamente (he intentado consultar en su documentación en línea pero me sale un error 503), pero si lo hace casi seguro que es el método más simple (bump mapping).

En cuanto al otro, supongo que también puede conseguirse mediante pixel shader. También se me ocurre una forma de hacerlo dibujando, primero, con un material donde se establezca el valor specular que se quiera y luego dibujar encima de nuevo con otro material sin specular pero aplicando la textura como una máscara usando el mapa de iluminación como canal alpha.

Pero ya digo, los de GLScene tienen la documentación on-line caída así que no tengo ni idea de si sus modelos poseen alguna propiedad o método que permita hacerlo. [Actualizo] Consultando a Duckduckgo (http://duckduckgo.com/?q=bump+mapping+glscene), me ha salido que TGlLibMaterial puede usarse para describir bump mappings. Tira del hilo, a ver qué sale.