Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: shephiroth en 21 de Julio de 2004, 04:52:19 PM

Título: Duda Con Opengl Y Textura
Publicado por: shephiroth en 21 de Julio de 2004, 04:52:19 PM
 Muy buenas.

En mi programa demomento consigo cargar texturas, mostrarlas etc......pero ahora necesito crear un efecto especial.

Digamos q tengo 2 texturas y 1 color. La primera textura me sirve de guía. En esta hay dos colores y trasparencia........donde se encuentra el primer color quiero que obtenga el valor de la misma posicion de la segunda texura, y donde se encuentra el segundo color quiero q aparezca el color que dan.......alguien sabría decirme como lo hago?? Tengo que hacerlo una vez estan en textura o antes de texturizar??

En principio tengo una funcion que carga y hace textura directamente, devolviendome una estructura en la q tengo datos sobre el ID de textura, el tamaño y la profundidad.

Agradecería todas las sugerencias  (ole)

GRACIAS
Título: Duda Con Opengl Y Textura
Publicado por: Pogacha en 06 de Agosto de 2004, 10:57:31 PM
 Supongo que para este entonces lo habras resuelto, pero todavia no entiendo tu pregunta :(
Título: Duda Con Opengl Y Textura
Publicado por: gdl en 07 de Agosto de 2004, 11:44:43 AM
 Vale, yo entiendo la pregunta, pero no sé como hacerlo tampoco. Supongo que lo que quieres es tener dos muñecos o coches iguales pero con un distintivo de color que los diferencie.

Lo único que te puedo aconsejar es que, ya que usas dos texturas, pon una de fondo con los colores que no cambian (el traje del personaje, etc). La otra tendría los colores que cambian (el escudo, la camisa, etc.) y el resto de esta textura estaría transparente. Ahora ponemos la segunda textura encima de la primera usando modulación de color y podrás cambiar el color de la segunda textura usando glColor*().

Para que funcione bien la segunda textura debería ser en escala de grises (si no, la modulación hace cosas raras).

Otra manera de hacer algo parecido: Si tienes cuidado con el mapeo de la textura en el mesh, puedes mezclar las dos texturas en una de forma que sepas qué polígonos corresponden al trozo de textura que va a cambiar de color y modificas el glColor*() sólo para esos polígonos. En este caso te ahorras una textura.

Creo que este último es el método que se usa en el HL, etc.
Título: Duda Con Opengl Y Textura
Publicado por: shephiroth en 07 de Agosto de 2004, 12:41:00 PM
 Buenas.

La verdad es que intente explicarlo facil y acabé explicandolo mal.

Veamos, yo no quiero crear una textura utilizando una imagen y cambiandole el color, sino con usar el glColor() saldría directo. Yo lo que quiero es conseguir una textura, desde varias imagenes diferentes, utilizando una como guia.

Para aclarar mas la cosa. Tengo una imagen guia donde hay cuatro colores, FF0000, 00FF00, 0000FF y FFFFFF. Lo que quiero es que si un punto de la imagen guia tiene el primero, ese mismo punto en la textura resultante sea el mismo punto de la imagen A, si es del segundo color de la imagen B, si es el tercero de la imagen C y si es del cuarto q sea trasparente.

Creo que ahora quedo bien explicado, pero si necesitais alguna explicacion mas.....aqui me teneis.

P.D: No, aun no lo consegui  (nooo)  (nooo)  
Título: Duda Con Opengl Y Textura
Publicado por: gdl en 07 de Agosto de 2004, 01:23:19 PM
 Vale, ahora lo pillo.

Mmm....

Ni idea, vamos.

¿Quizá usando el stencil buffer?
Título: Duda Con Opengl Y Textura
Publicado por: vicho en 07 de Agosto de 2004, 02:38:57 PM
 yo haria la operacion a mano pues, si las texturas son de las mismas dimensiones no seria dificil pedir el color en la textura indicada y empezar a rellenar una textura alternativa
Título: Duda Con Opengl Y Textura
Publicado por: shephiroth en 07 de Agosto de 2004, 02:43:03 PM
 Buenas.

El Stencil buffer que es y como se utiliza??

Respecto a hacerlo a mano, creo que se a lo q te refieres. Voy a intentar hacerlo a mano a ver q resultados me da :)
Título: Duda Con Opengl Y Textura
Publicado por: Pogacha en 07 de Agosto de 2004, 02:43:12 PM
 
Entonces lo que quieres es un selector de texturas.
No aclaras si deseas renderizar en 3d con este sistema o solo
crear una imagen plana por superposicion de otras.

Me refiero a .pixel como para cada pixel correspondientes.

ImagenFinal.pixel = ImagenA.pixel * TexturaSelectora.Pixel.Color[0] +
                               ImagenB.pixel * TexturaSelectora.Pixel.Color[1] +
                               ImagenC.pixel * TexturaSelectora.Pixel.Color[2];

Lo cual me suena a un pixel shader.

Pero lo podrias hacer asi, lo cual es caro.

Pre-Calculo por software:
TexuraC0. pixel=  0xFFFFFF * TexturaSelectora.Pixel.Color[0]
TexuraC1. pixel=  0xFFFFFF * TexturaSelectora.Pixel.Color[1]
TexuraC2. pixel=  0xFFFFFF * TexturaSelectora.Pixel.Color[2]
glCreateTextura(TexturaC0) // no existe esta funcion
glCreateTextura(TexturaC1) // lo que quiero decir es
glCreateTextura(TexturaC2) // que hay que crear la textura

Proceso:
ImagenFinal.pixel=  ImagenA.pixel * TexturaSelectora.Pixel +
                               ImagenB.pixel * TexturaSelectora.Pixel +
                               ImagenC.pixel * TexturaSelectora.Pixel;

Lo que en tres pasadas moduladas de multitextura lo lograras,
pero debes tener estas capacidades de hardware.

En todo caso si las Imagenes A, B y C y la textura son constantes o posibilitan lo siguiente:

Pre-Calculo por software:
TexuraC0. pixel=  ImagenA.pixel * TexturaSelectora.Pixel.Color[0]
TexuraC1. pixel=  ImagenB.pixel * TexturaSelectora.Pixel.Color[1]
TexuraC2. pixel=  ImagenC.pixel * TexturaSelectora.Pixel.Color[2]
glCreateTextura(TexturaC0) // no existe esta funcion
glCreateTextura(TexturaC1) // lo que quiero decir es
glCreateTextura(TexturaC2) // que hay que crear la textura

Proceso:
ImagenFinal.pixel=  TexturaSelectora.Pixel + TexturaSelectora.Pixel + TexturaSelectora.Pixel;

Haber si es esto es lo que quieres.
Sino al menos explica para que lo utilizas y entonces daras mas idea sobre que quieres.
Saludos
Pogacha

Título: Duda Con Opengl Y Textura
Publicado por: shephiroth en 07 de Agosto de 2004, 03:54:50 PM
 Buenas.

En principio las texturas son para 2d, nada de 3d.......aun tardaré un tiempo en meterme en el 3d, estoy con mi primer "juego" y mejor empezar por 2d xDD

Vamos a ver, el crear este tipo de texturas lo quiero para varias cosas. Os pondré un ejemplo y asi la cosa será más fácil.

Bordes de dos tipos de superficie.......me puede interesar tener una imagen guía de como va el borde, pero no siempre los diferentes lados van a tener la misma imagen.......agua, playa, tierra, hierva, nieve, etc....prefiero tener una guia y una imagen por cada uno, y juntarlo segun me interese.

Es decir, que me interesa transicion de agua a playa, pues pillo guia, y hago textura usando las imagenes de agua y playa.........q luego me interesa tierra y nieve, pues pillo guia y hago textura usando las imagenes de tierra y agua.........

Weno, ya me contaréis xDD
Título: Duda Con Opengl Y Textura
Publicado por: BeRSeRKeR en 07 de Agosto de 2004, 03:58:35 PM
 No sé si te he entendido bien pero parece un trabajo perfecto para un fragment program/pixel shader.

Saludos.
Título: Duda Con Opengl Y Textura
Publicado por: vicho en 07 de Agosto de 2004, 05:14:16 PM
 para que usar opengl en 2d?(abstenerse comentarios de GL_ORTHO :P)
Título: Duda Con Opengl Y Textura
Publicado por: Pogacha en 07 de Agosto de 2004, 05:30:35 PM
 Para poder usar acelereacion por hardware en escalamiento, colorización y blendeo!
Título: Duda Con Opengl Y Textura
Publicado por: BeRSeRKeR en 07 de Agosto de 2004, 06:02:57 PM
 Y per-pixel bump mapping, que para los juegos 2D también puede tener sus usos. :)
Título: Duda Con Opengl Y Textura
Publicado por: gdl en 08 de Agosto de 2004, 01:20:07 PM
 
CitarEl Stencil buffer que es y como se utiliza??

Stencil significa máscara, es decir, algo que te permite escribir sólo en las partes de la pantalla que tu quieras o, lo que es lo mismo, proteger las partes de la pantalla donde no quieres sobreescribir.

La verdad es que no lo he usado nunca, pero según lo que dice la documentación de openGL es como un depth buffer pero con función (lo que cambia el valor del buffer en cada pixel) y chequeo (lo que comprueba si puedes escribir en un pixel) más arbitrario. Creo recordar que puedes hacer comprobaciones de bits para el stencil buffer de esta forma, lo único que tienes que hacer es rellenar el stencil buffer con el bit correspondiente a la textura que quieras poner y luego usarlo para escribir sólo en los pixels que quieres la texturas que deseabas. El único problema que creo que podrías tener es el no poder escribir en el stencil buffer desde la textura (lo que hace la extensión depth texture) y tengas que renderizar cuatro o seis veces. Con un poco de ingenio podrías usar el depth buffer también para esto, ya que tiene un chequeo de igualdad y como estás en 2D por lo que cuentas, tienes la profundidad como grado de libertad.

Realmente, para lo que quieres, y para que quede bien bien bien, lo que dice BeRSeRKeR: pixel shader.


Citarpara que usar opengl en 2d?
CitarPara poder usar acelereacion por hardware en escalamiento, colorización y blendeo!

Y rotaciones, escalados y reflexiones arbitrarias de tus sprites, gradientes de colores, efectos especiales (entra dentro del blending de Pogacha), efectos de profundidad y multilayer, sombras, portabilidad, deformaciones en malla (¿no os acordáis de las alas de los ángeles en el Diablo II?), usar los ahora de moda pixel y vertex shaders, y seguro que muchas más cosas que ahora no me acuerdo.



CitarBordes de dos tipos de superficie.......me puede interesar tener una imagen guía de como va el borde, pero no siempre los diferentes lados van a tener la misma imagen.......agua, playa, tierra, hierva, nieve, etc....prefiero tener una guia y una imagen por cada uno, y juntarlo segun me interese.

Es decir, que me interesa transicion de agua a playa, pues pillo guia, y hago textura usando las imagenes de agua y playa.........q luego me interesa tierra y nieve, pues pillo guia y hago textura usando las imagenes de tierra y agua.........

¿Y no te bastaría una textura de fondo y otra encima, la que hace de borde, con transparencia?

Título: Duda Con Opengl Y Textura
Publicado por: shephiroth en 11 de Agosto de 2004, 02:00:34 PM
 Muy buenas.

Veamos, habeis comentadado muchas cosas que desconozco, asi que intentaré meter la pata lo menos posible.

Ninguno de vuestros comentarios "me sirve", puesto que yo no stoy hablando a la hora de pintar en pantalla, sino a la hora de crear la textura. Si me estais diciendo la forma de hacerlo al pintar, e incluso me comentais q tengo q pintar 3 o 4 veces para q el efecto sea correcto, y eso va a hacer q los fps bajen a la ¿mitad? como q no me interesa.

Quizás la culpa fue mia por no puntualizar, estoy hablando a la hora de crear la textura en memoria, no de pintar en pantalla.....esto lo hago para, aunque aumente el tiempo de carga de imagenes y procesamiento de texturas, el juego siga igual de fluido, pues sigue dibujando texturas sin hacer cosas raras por el medio.

Respecto pq opengl........varias cosillas para responder eso. Lo primero no estoy muy metido en la programacion bajo linux, pero ya que empiezo a meter en algo si es compatible y portatil (por lo menos mas q directx) mejor q mejor. Lo segundo pq es pq es de lo q mas información encontré. Al empezar busque por inet info de directx y opengl, y descartando el msdn de microsoft (que no me gusta nada) de directx encontre poco, mal organizado y sin orden aparente.

Weno, un saludo a todos ^^ y gracias por responder  (ole)  
Título: Duda Con Opengl Y Textura
Publicado por: gdl en 12 de Agosto de 2004, 10:21:35 AM
 Si es a la hora de cargar, en algún momento has de tener los píxeles en la pantalla y puedes usar un if como Pogacha comentaba más arriba.
Título: Duda Con Opengl Y Textura
Publicado por: Pogacha en 12 de Agosto de 2004, 04:20:01 PM
 En realidad al hacer dos o tres pasadas los FPS disminuyen solo un poco, el problema es que las combinaciones de texturas serian muchas, y no entraria en memoria. Todos supusimios que esto lo tendrias en claro. Lo mejor es que veas el codigo de un juego ya hecho y aprendas como se hacen.