Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Duda Con Opengl Y Textura

Iniciado por shephiroth, 21 de Julio de 2004, 04:52:19 PM

« anterior - próximo »

shephiroth

 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

Pogacha

 Supongo que para este entonces lo habras resuelto, pero todavia no entiendo tu pregunta :(

gdl

 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.

shephiroth

 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)  

gdl

 Vale, ahora lo pillo.

Mmm....

Ni idea, vamos.

¿Quizá usando el stencil buffer?

vicho

 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

shephiroth

 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 :)

Pogacha

 
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


shephiroth

 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

BeRSeRKeR

 No sé si te he entendido bien pero parece un trabajo perfecto para un fragment program/pixel shader.

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

vicho

 para que usar opengl en 2d?(abstenerse comentarios de GL_ORTHO :P)

Pogacha

 Para poder usar acelereacion por hardware en escalamiento, colorización y blendeo!

BeRSeRKeR

 Y per-pixel bump mapping, que para los juegos 2D también puede tener sus usos. :)
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

gdl

 
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?


shephiroth

 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)  






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.