Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





OpenGL de 32 bits de color a 16 bits

Iniciado por tamat, 17 de Diciembre de 2006, 01:22:33 AM

« anterior - próximo »

tamat

Estoy haciendo picking renderizando los objetos con colores planos, el problema es que en 32 funciona bien, pero en 16bits lo que guardo en el buffer de color no se corresponde con lo que leo con glReadPixels (lo cual es obvio).

Uso la siguiente linea:

glReadPixels(0, 0, 1,1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)&value );

Necesitaría saber qué hace openGL cuando el colorbuffer tiene una profundidad menor de 32, cómo asigna cada bit de las cuatro componentes (RGBA), qué bits tira, etc.

He hecho pruebas pero no me queda claro, además por alguna extraña razón al leer del canal alpha el resultado no tiene alpha, tal vez sea porque el color buffer solo tiene RGB (no es muy coherente que tenga alpha por otra parte).

Pasteo aquí una prueba que he hecho metiendo valores consecutivos, el primero es el que guardo, el segundo el que leo del buffer:

Citar
****************************
00000000 00000000 00000000 00000011
11111111 00000000 00000000 00001000
----------------------
00000000 00000000 00000000 00000110
11111111 00000000 00000000 00001000
----------------------
00000000 00000000 00000000 00001100
11111111 00000000 00000000 00010000
----------------------
00000000 00000000 00000000 00011000
11111111 00000000 00000000 00011001
----------------------
00000000 00000000 00000000 00110000
11111111 00000000 00000000 00110001
----------------------
00000000 00000000 00000000 01100000
11111111 00000000 00000000 01100011
----------------------
00000000 00000000 00000000 11000000
11111111 00000000 00000000 11000101
----------------------
00000000 00000000 00000001 10000000
11111111 00000000 00000000 10000100
----------------------
00000000 00000000 00000011 00000000
11111111 00000000 00000100 00000000
----------------------
00000000 00000000 00000110 00000000
11111111 00000000 00001000 00000000
----------------------
00000000 00000000 00001100 00000000
11111111 00000000 00001100 00000000
----------------------
00000000 00000000 00011000 00000000
11111111 00000000 00011000 00000000
----------------------
00000000 00000000 00110000 00000000
11111111 00000000 00110001 00000000
----------------------
00000000 00000000 01100000 00000000
11111111 00000000 01100001 00000000
----------------------
00000000 00000000 11000000 00000000
11111111 00000000 11000010 00000000
----------------------
00000000 00000001 10000000 00000000
11111111 00000000 10000010 00000000
----------------------
00000000 00000011 00000000 00000000
11111111 00001000 00000000 00000000
----------------------
00000000 00000110 00000000 00000000
11111111 00001000 00000000 00000000
----------------------
00000000 00001100 00000000 00000000
11111111 00010000 00000000 00000000
----------------------
00000000 00011000 00000000 00000000
11111111 00011001 00000000 00000000
----------------------
00000000 00110000 00000000 00000000
11111111 00110001 00000000 00000000
----------------------
00000000 01100000 00000000 00000000
11111111 01100011 00000000 00000000
----------------------
00000000 11000000 00000000 00000000
11111111 11000101 00000000 00000000
----------------------
00000001 10000000 00000000 00000000
11111111 10000100 00000000 00000000
----------------------
00000011 00000000 00000000 00000000
11111111 00000000 00000000 00000000
----------------------
00000110 00000000 00000000 00000000
11111111 00000000 00000000 00000000
----------------------
00001100 00000000 00000000 00000000
11111111 00000000 00000000 00000000
----------------------
00011000 00000000 00000000 00000000
11111111 00000000 00000000 00000000
----------------------
00110000 00000000 00000000 00000000
11111111 00000000 00000000 00000000
----------------------
01100000 00000000 00000000 00000000
11111111 00000000 00000000 00000000
----------------------
11000000 00000000 00000000 00000000
11111111 00000000 00000000 00000000
----------------------
10000000 00000000 00000000 00000000
11111111 00000000 00000000 00000000
----------------------
Por un stratos menos tenso

Fanakito

Si el color buffer es de 16 bits, sospecho que tendras que leer un color de 16 bits.

Usando esta linea:
glReadPixels(0, 0, 1,1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)&value );

Estas leyendo colores de 32 bit... con un byte por componente. Cuando, posiblemente deberias leer:

glReadPixels(0, 0, 1,1, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, (void*)&value );

Que te devolveria solo 16 bits. Casi seguro que con 16 bits utiliza este formato que es el mas polivalente (aunque quizas exista forma de cambiarlo).

De todas formas, ¿no seria mejor desproyectar la caja de colision del objeto y hacer el picking matematicamente?

tamat

Seguramente, pero quería una colisión "pixel perfect" y lo hice así desde el principio, aunque me está dando dolores de cabeza. Voy a probar lo que dices y te digo qué hay.

De todos modos lo de UNSIGNED_CHAR es la profundidad de cada componente creo yo, no me queda claro:

CitarSpecifies the data type of the pixel data. Must be one of GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT, or GL_FLOAT.
Por un stratos menos tenso

Fanakito

Cita de: "tamat"De todos modos lo de UNSIGNED_CHAR es la profundidad de cada componente creo yo, no me queda claro

Si, si. Pero cuando trabajas con 16 bits no hay tipos de datos que te sirvan para la profundidad de cada componente. Asi que utilizas un SHORT (16 bits) y tienes todos los componentes ahi metidos. Lo jodido es que hay varios formatos de 16 bits: R5G5B5A1,R5G6B5,RGBA4,etc.

Pero vamos, haciendo lo que has echo es posible que puedas sacarlo...






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.