Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Opengl y tipo float

Iniciado por JL10, 19 de Julio de 2006, 09:06:30 PM

« anterior - próximo »

JL10

Cita de: "zupervaca"...esto no implica que dentro de unos años la cosa cambie y se comience a usar double internamente en las graficas.

Tienes toda la razón Zupervaca, posiblemente no haga falta tanta precisión, pero puede que al final el mercado nos lo inponga el uso de double porque a lo mejor llegue a ser más eficiente su uso.

Me has hecho recordar una pequeña anécdota que me ha sucedido hace 1 año. Conocí a un profesional en software de defensa en equipos críticos para aviones de combate. Y este señor me contó que el hacía software con aritmética de enteros. Yo me quedé sorprendido y pensé en lo atrasados que estaban. No lo entendía lo que me explicó. Pero ahora gracias a esta introdución que has hecho Zupervaca creo haber entendido la problemática y el trabajo de aquel profesional. Podía trabajar con fiabilidad, estabilidad y con más rapidez que con cualquier CPU moderna de operaciones en coma flotante. (!Qué besugo soy!, menos mal que me aguanté la risa en aquel instante porque si no hubiese pasado por ignorante).

Solo me falta que Elvis Enmanuel nos aclare lo del HALF_FLOAT.
Gracias

ALRAZ

Hace no mas de uno o dos años, unos compañeros de clases y yo tuvimos un problema interesante usando Float en lugar de Double

(Sobretodo porque la escuela toadvía usa Borland Turbo C++ >_>)

Sucede que estábamos resolviendo un problema clásico que involucraba dar cambio al usuario, entre cuyas denominaciones se encotnraban las monedas de 5 centavos.

El problema fue que cuando una cantidad quedaba en... por ejemplo:
$34.55

El turbo C++ estaba terco en que la cantidad era
$34.54999999 ...

Cambiamos los tipos de datos a Double y problema resuelto.
Según la propia ayuda de este anciano turbo C++, el float es de 32 bit, cosa que a todos nos pareció suficiente para 2 miserábles digitos.
Sinembargo, no fue así...

Desde entonces nos quedó la maña de usar siempre double en lugar de float  :(
Más vale que sobre y no que falte XD

ethernet

@zupervaca: has descubierto el maravilloso mundo del punto fijo.

@ALRAZ: _nunca_ se usa punto flotante para trabajar con dinero, sea la precisión que sea. Pregunta a cuaquier economista y te dirá porque.

senior wapo

Yo cuando he trabajado con cifras monetarias he usado siempre enteros, haciendome a la idea de que el número representa céntimos.

Realmente solo hace falta decimales en el momento de presentar externamente la cifra como euros.

Elvis Enmanuel

half_float_nv o algo asín

La cosa está en crearse una textura de flotantes y almacenar allí la geometría y/o normales, para después interpretarla en el shader (geometry buffers) pero creo recordar que sólo se podía hacer con el shader model 3.0

ains

tiutiu

La gracia del punto flotante es que la precision es mayor cerca del 0 y menor cuanto mas te alejas, con lo que trabajamos con errores relativos de precision, es decir, que una milesima te importa mucho si trabajas con valores pequeños y te da igual si trabajas con millones.

Si estais haciendo un programa cientifico, p.e. un visor 3d de un cuerpo, puede interesarte ir desde una escala de 2m (cuerpo completo) a una de micrometros, con lo que la precision es muy importante (tema de redondeos, acordaos de lo de 35.55 = 35.549999) y pueden ser necesarios los 64bits.

El tema de usar float extensivamente es por lo que ya han dicho: suficiente precision para gran numero de aplicaciones, mayoria de micros de 32bits y sobre todo que es el doble de tamaño. De hecho, en OpenGL se nota mucho usar indices de 32 a 16 bits. Probadlo.
Y los half float simplemente son 16bits en vez de 32. Osea, suficiente precision para algunas cosas y la mitad de tamaño. En deferred shading o hdr y estas cosas, creo que se usa bastante para ahorrar espacio en los g-buffers.
b>:: Pandora's Box project ::
Notas e ideas sobre desarrollo de engines para juegos

JL10

Cita de: "tiutiu"La gracia del punto flotante es que la precision es mayor cerca del 0 y menor cuanto mas te alejas, con lo que trabajamos con errores relativos de precision, es decir, que una milesima te importa mucho si trabajas con valores pequeños y te da igual si trabajas con millones.

Gracias por tus aclaraciones tiutiu, en especial lo relativo a la importancia del tamaño de los índices. No había caído encuenta.

Quería preguntarte, ¿entonces, con respecto a la precisión del float, hay que tener algún cuidado especial cuando manejemos un Z-buffer en el que se almacenan distancias pequeñas y muy grandes a la vez?.
Gracias

zupervaca

Citar@zupervaca: has descubierto el maravilloso mundo del punto fijo
Pense que todos los programadores conocian estas cosas, yo llevo usandolo desde el amiga 500

Editado:
Citarprogramabas en un amiga? que envidia..
Y en un commodore 128 empece mis andaduras :wink:

seryu

programabas en un amiga? que envidia..

Esta claro que cualquier operacion con coma flotante acarrea problemas de precision, es el ejemplo clásico de usar un double como variable para un contador..

Lo del fixed point la verdad es que el pan de cada dia en consolas..

neophox

El tema de doubles y floats en OpenGL según tengo entendido tiene su origen en que internamente OpenGL trabaja con floats, con lo cual si tu le pasas doubles no solo no aumentarás la precisión sino que penalizará el rendimiento debido a las conversiones de tipos que OpenGL hará por ti para pasar los datos a float.
De todas formas, hay veces que es necesario trabajar con doubles en tu aplicación para no perder precision en los cálculos (eso ocurre al menos en simulación que es donde yo trabajo). Posteriormente puede ser que debas trabajar también con coordenadas relativas a un cierto offset, me explico, si tienes una base de datos a nivel mundial de terreno (imaginate el flight simulator) no puedes pintar en OpenGL en las coordenadas (10000000,10000000,5000), bueno, en realidad si que puedes, sin embargo cuando estes volando te darás cuenta que todo empieza a temblar por la perdida de precisión. Puedes probarlo, hazte una pequeña aplicación que coloque una serie de puntos en unas coordenadas muy grandes y haz que tu cámara avance, notaras como los puntos cobran vida y empiezan a temblar.
Supongo que la nueva generación de tarjetas donde internamente se procesan los datos con mucha mas precisión (nVidia GeForce 7: Full 128-bit studio-quality floating point precision through the entire rendering pipeline) harán cambiar este panorama, pero hasta entonces habrá que tener todo esto en cuenta.

Espero haber arrojado un poco de luz.
url=http://gboot.blogspot.com]GBoot Games Blog[/url]






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.