Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: tamat en 07 de Marzo de 2004, 02:47:31 PM

Título: Mapear Objetos Segun Color
Publicado por: tamat en 07 de Marzo de 2004, 02:47:31 PM
 He creado un pequeño sistema de GUI 2D con widgets sobre opengl.

Ahora mismo detecto cuando el usuario pulsa sobre un widget a traves de la bounding box de cada widget, cuando el usuario clicka compruebo qué objetos tienen su bounding debajo del raton y así se cual ha pulsado, sin embargo ahora quiero complicarlo un poco más y hacer que la colisión sea pixel perfect, para eso he pensado en renderizar la escena en el backbuffer en el que cada objeto se renderiza sin texturizar, con un color plano diferente para cada widget, y despues mirar qué color hay debajo del raton. Al no hcer swapbuffer el usuario no se enteraría.

Pero para eso necesito indexar todos mis widgets por color y no tengo muy claro como hacerlo. He pensado en hacerlo mediante el depth buffer que es el canal con más profundidad pero veo que con el depth buffer no puedo controlar bien que valor tendrá cada widget al pintarlo. Tambien he pensado en cambiar el modo del colorbuffer (pasarlo a luminosidad) a la hora de pintar, de ese modo convierto los 4 bytes del colorbuffer en un entero y me es más facil indexar.

Pero luego me queda la duda de qué sucedería si el cliente tuviera una profundidad de color baja... ¿como controlo eso?

Por otra parte he visto funciones de mapeado de colores, así que con una LUT podría arreglarmelas pero nunca las he usado.

Cualquier ayuda será bien recibida.

un saludo.
Título: Mapear Objetos Segun Color
Publicado por: CoLSoN2 en 07 de Marzo de 2004, 03:23:16 PM
 qué problema hay con las bounding boxes? a no ser que vayas a hacer cosas con formas MUY raras, tienes más que suficiente..
Título: Mapear Objetos Segun Color
Publicado por: tamat en 07 de Marzo de 2004, 03:32:58 PM
 voy a hacer cosas con formas muy raras ;)
Título: Mapear Objetos Segun Color
Publicado por: BeRSeRKeR en 07 de Marzo de 2004, 03:52:55 PM
 Lo único que se me ocurre es o que utilices regiones o la técnica que propuso Haddd en este foro con occlusion queries.

Saludos.
Título: Mapear Objetos Segun Color
Publicado por: Zaelsius en 07 de Marzo de 2004, 04:47:04 PM
 Tamat, en el capítulo 14 del Red Book hay una sección que habla sobre lo que tú quieres hacer.

No sé muy bien donde está tu problema, el color buffer en modo indexado(256 colores) te da para 256 elementos, y si usas 16bit te da para 65536 elementos diferentes(sobran no? xd). Si vas asignando valores de color a cada widget empezando por cero(limite es el bpp), y usas glReadPixels() estaría hecho.
Título: Mapear Objetos Segun Color
Publicado por: tamat en 07 de Marzo de 2004, 05:08:12 PM
 Así es como lo hago zaelsius pero preguntaba por si había alguna tecnica mejor o posibles problemas.

Las Occlusion queries se van demasiado de mis capacidades por el momento pero una vez lo tenga funcionando quizá lo mire a ver.
Título: Mapear Objetos Segun Color
Publicado por: _Grey en 07 de Marzo de 2004, 05:32:19 PM
 Puedes utilizar el stencil buffer.............. de todas formas, (Ten en cuenta, que hace mucho que no toco OGL), OGL tiene un buffer de seleccion (glRenderMode(GL_SELECTION)), que es "pixel perfect", nop? (En el libro "Programacion en OpenGL" de AnayaMultimedia encontraras esto en capitulo 19). Espero que te pueda ayudar lo dicho.

Saludos.
Título: Mapear Objetos Segun Color
Publicado por: Kriller en 09 de Marzo de 2004, 06:52:48 PM
 ¿No estás matando moscas a cañonazos?

Yo haría lo siguiente: suponiendo que cada widget tuyo tiene una textura asociada, simplemente miraría el color del píxel que ha sido pinchado dentro de la textura (si la textura tiene canal alfa y está siendo usado, miraría ahí). Si es cero, es un hueco y por tanto no ha sido pinchado. Así te evitas renderizar los widgets dos veces y trastear con el backbuffer.

Ésto sólo es válido si tus widgets están hechos a base de texturas. Si los dibujas "a mano" (con líneas o algo así) entonces seguramente habría que hacer lo que dices tú.