Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: tewe76 en 25 de Septiembre de 2004, 11:10:56 PM

Título: Texturas Potencia De 2
Publicado por: tewe76 en 25 de Septiembre de 2004, 11:10:56 PM
 A ver, después de trastear con varios engines, leer info de DX de varias fuentes, etc, veo que la mayoría, por no decir todos, aconsejan que las texturas sean siempre potencia de 2. Sin embargo, ninguno parece decirlo con mucha seguridad e, incluso, algunos reconocen que seguramente se trata de una especie de leyenda urbana, ya que ellos nunca se han encontrado con una tarjeta que no admita dicho tipo de texturas.

¿Qué opináis vosotros? ¿Habéis tenido problemas de esta clase alguna vez?

Título: Texturas Potencia De 2
Publicado por: _Grey en 25 de Septiembre de 2004, 11:23:25 PM
 Leyenda urbana!? juas juas, cuando se olvida ocurren estas cosas... me explico.

Es una recomendacion muy saludable, pero tambien obsoleta. El hardware tenia limitaciones como esa, todo por que le es mas facil trabajar con ese tipo de numeros, incluso la voodoo tenia restricciones del tipo de no mas de 256x256 en el tamaño de las texturas.
Ahora la cosa a cambiado, puedes poner resoluciones exoticas, pero el hardware antiguo tenia ese tipo de restricciones, por eso se recomiendo no salir de ahy, no sea que te salga el programa incompatible, pero de leyenda urbana nada, cosas del pasado. Pero tranquilo, hoy dia casi puedes olvidarlo... casi...


Saludos.

Título: Texturas Potencia De 2
Publicado por: Pogacha en 26 de Septiembre de 2004, 12:18:44 AM
 En serio, yo tambien suponia lo mismo  :lol: , aun que nunca le di mucha importancia, en Ogl, en los manuales te dicen que las texturas deben ser 2^n y creo que hay una extencion de tipo EXT_TEXTURE_NON_POWER_OF_TWO, pero bueno ..., lo que si debes tener en cuenta son los empaquetados y alineacion en ogl, que si molestan bastante si no los tienes en cuenta, y en DX no tengo idea.
Título: Texturas Potencia De 2
Publicado por: AgeR en 26 de Septiembre de 2004, 12:23:10 AM
 Pues yo no sé hasta qué punto es cosa del pasado. Vamos, estoy casi convencido de que se gestiona mejor una textura múltiplo de dos que una que no lo sea. Al menos en teoría debería ser así, aunque tampoco me baso en nada en especial para afirmarlo (bueno, recuerdo algunas rutinas de copia de sprites en ensamblador y cosas así de hace tiempo, pero no sé si seguirán teniendo su validez como ejemplo  :ph34r: ).
Título: Texturas Potencia De 2
Publicado por: ethernet en 26 de Septiembre de 2004, 01:03:51 AM
 no os ha pasado lo típico de que no os funcionaba una prueba porque la textura no era potencia de 2? yo uso gluBuild2dmipmaps y así no tengo que preocuparme de esto

saludos
Título: Texturas Potencia De 2
Publicado por: gdl en 26 de Septiembre de 2004, 01:06:22 AM
 En OpenGL y siendo estricto :angry:, hay que usar potencias de dos a no ser que tengas la versión 2.0, la extensión NV_texture_rectangle, la EXT_texture_rectangle o la GL_ARB_texture_non_power_of_two. Aunque hay cambios, por ejemplo, en NV_texture_rectangle hay que activar las texturas no potencia de dos mediante glEnable(). Además, las coordenadas de textura varían: en GL_ARB_texture_non_power_of_two (y creo que en la versión 2.0) van de 0 a 1 mientras que en las otras van de 0 al tamaño de la textura (no normalizado).

En general, evita usar texturas no potencia de dos porque de vez en cuando alguna tarjeta gráfica no las aceptará (mi portátil sin ir más lejos). Si haces un cargador de texturas inteligente, podría rellenarlas hasta que tengan potencia de dos si no están las extensiones adecuadas.

En DX ni idea.

Lo más fácil es usar potencias de dos siempre, aunque se desperdicie memoria.
Título: Texturas Potencia De 2
Publicado por: tewe76 en 26 de Septiembre de 2004, 09:02:26 AM
 
CitarEs una recomendacion muy saludable, pero tambien obsoleta. El hardware tenia limitaciones como esa, todo por que le es mas facil trabajar con ese tipo de numeros, incluso la voodoo tenia restricciones del tipo de no mas de 256x256 en el tamaño de las texturas.
Teniendo en cuenta que mi objetivo es el mercado shareware, debo tener en consideración el hardware de hace años, no sólo el actual. Así pues, me temo que en mi caso no es tan "obsoleta".

CitarEn general, evita usar texturas no potencia de dos porque de vez en cuando alguna tarjeta gráfica no las aceptará (mi portátil sin ir más lejos).
Definitivamente seguiré usando potencia de 2 :) . Ah, y máximo de 256x256.

Ahora bien, me he dado cuenta de que en realidad mi pregunta era otra, aunque parecida: ¿es también necesario que las texturas sean cuadradas o pueden ser rectangulares (256x128, 128x32, etc)?
Título: Texturas Potencia De 2
Publicado por: seryu en 26 de Septiembre de 2004, 09:18:55 AM
 pueden ser rectangulares, y sobre lo que comentas de hecho muchos motores 3d no te 'dibujaran' la textura si no tiene una potencia de dos en sus dimensiones. y aunque en opengl 2.0 permita no usarlas sigue siendo recomendable al igual que muchos motores, porque internamente separan la textura en tamaños acordes a los necesarios y al final sigues igual.

respecto al tamaño de textura, 256 deberia ser tu tope para un mercado share, tal como dices.

ah! y en DX se pueden usar texturas non-power, pero eso ya depende de la tarjeta que trague con ellas, creo que las gforce ya lo hacian..
Título: Texturas Potencia De 2
Publicado por: ethernet en 26 de Septiembre de 2004, 10:03:22 AM
 Y de qué viene lo de tener portencia de 2? cual es la razón? yo había pensando que pudiera ser de alguna FFT o algo así

saludos
Título: Texturas Potencia De 2
Publicado por: seryu en 26 de Septiembre de 2004, 10:32:37 AM
 bueno, esto es el mundo binario, todo tiende a on y off, es facil dividir por una potencia de 2 en binario, mientras que con cualquier otro numero no..
Título: Texturas Potencia De 2
Publicado por: Haddd en 26 de Septiembre de 2004, 11:21:17 AM
 Bueno, actualmente OGL 2.0 te dice que NO necesitan ser potencias de 2. Es una obligación, así que, podeis olvidaros de esta restricción. Aunque, por supuesto, para tarjetas antiguas sí que existe.

La razón es que hoy en día se utilizan los Render Target muchísimo. Un render target es una textura que se utiliza como backbuffer y es donde se renderizan los objetos. Suele tener la misma resolución que la pantalla, es decir, 800x600;1024x768... Y es un desperdicio de memoria hacer los RenderTarget potencias de 2!!

Título: Texturas Potencia De 2
Publicado por: AgeR en 26 de Septiembre de 2004, 01:07:40 PM
 Hmmm a ver si ahora que estoy más despierto me aclaro a explicar mi teoría  :lol: .
Yo cuando hace años programaba en Pascal y empecé a usar gráficos (modo 13h), como no habían rutinas de dibujado entonces, primero hice unas en Pascal, pero eran muuuuuuuy lentas.
Después, como tenía nociones de ensamblador, programé unas rutinillas gráficas : copiar pantallas de 320x200, interpolar, recortar sprites, pegar un sprite en una pantalla virtual, etc...
Las programé con ensamblador del 80286 y la verdad es que iban mucho más rápido que en Pascal, como era de esperar.

Después me dije, usando los registros de 32 bits del 80386 (EAX y tal) puedo hacer que en vez de 1 pixel se copien 2 cada vez, con lo cual gano velocidad, siempre que el tamaño fuera potencia de 2, ya que en vez de bytes podía utilizar words. Efectivamente la velocidad se dobló.

Pues igual es una teoría estúpida, pero había pensado que igual lo de las texturas potencia de 2 es por este mismo motivo, rapidez a la hora de hacer operaciones con ella, como copiar (sobre todo copiar, que es lo que más suele hacerse). Ahora, con las pedazo tarjetas y la ram que hay, igual ya no es necesario, y por eso ya no existe ese límite.

Teoría de la multiplicidad por 2 de las texturas por AgeR. Todos los derechos doblados.  :lol:  
Título: Texturas Potencia De 2
Publicado por: egf en 26 de Septiembre de 2004, 03:59:41 PM
 ahora se pueden usar sin potencia de dos pero la tarlleta lo pasa a potencia de dos para trabajar con ella, lo cual hace que use mas recursos que si la carga ya en en potencia de 2  
Título: Texturas Potencia De 2
Publicado por: tewe76 en 26 de Septiembre de 2004, 07:46:51 PM
 Bueno, entonces, en resumen, debo usar texturas que cumplan:

1-Potencia de 2
2-Máximo de 256x256
3-Ancho y Alto iguales o distintos, según mis necesidades

PS: teniendo en cuenta que 256*256=512*128, ¿podría usarse, ganas que tengo de comerme la cabeza :), texturas del tipo 512*128 sin incumplir la norma de Máximo de 256x256? Para mi que va a ser que no, pero mejor no me quedo con la duda. Ah, siempre pensando, como he dicho, en mercado share, en máquinas antiguas.

Título: Texturas Potencia De 2
Publicado por: BeRSeRKeR en 26 de Septiembre de 2004, 07:55:35 PM
 Aquí tienes un base de datos donde te muestran las especificaciones de una larga lista de tarjetas. Concretamente, en el apartado Implementation specifics verás que está el campo Max. texture size que te indica el tamaño máximo de textura. A grandes rasgos, la 3Dfx Voodoo1/2/Banshee soporta tamaños máximos de 256x256 mientras que ya la nVidia TNT soporta tamaños máximos de 1024x1024 luego si no das soporte a las Voodoo, podrás utilizar el tamaño del que hablas sin problemas (ya que es potencia de 2).

Saludos.
Título: Texturas Potencia De 2
Publicado por: seryu en 26 de Septiembre de 2004, 09:36:43 PM
 en opengl, una textura de 512x128 puede darte problemas con la voodoo.

de todas formas, una voodoo hoy dia, en mercado share.. esas tarjetas iban solo a 16 bits.. yo cuando pienso en lanzar algo en share, me pongo en dos casos:

mercado 2d, que comprende los pc con tarjetas de escritorio tipo intel, voodoo viejas, o peores s3 virge de 4 megas.
mercado 3d, que comprende pc's con una tnt, rage128, voodoo5, o similar, tarjetas que ya tienen lo basico de la 3d.
Título: Texturas Potencia De 2
Publicado por: Pogacha en 27 de Septiembre de 2004, 10:32:12 PM
 Bien, ¿por que potencias de dos?
Para el wrapping obviamente!

no es lo mismo
u%=54;
que
u&=63;
Que estas mascaras te conservavan dentro del  rango.
Si el ancho era 54 tenias que calcular el modulo (A nivel electronico de la tarjeta)
Si era potencia de dos con un &63 o sea & 111111 en binario lograbas tu cometido mas facilmente.

La utilidad del glut para crear mipmaps, según tengo entendido, automaticamente te las transforma a potencias de dos.

Título: Texturas Potencia De 2
Publicado por: tewe76 en 30 de Septiembre de 2004, 09:55:06 AM
 Conclusión:

1-Potencia de 2
2-Ancho Máximo de 256 (independientemente de cuál sea el alto)
3-Alto Máximo de 256 (independientemente de cuál sea el ancho)
4-Ancho y Alto iguales o distintos, según mis necesidades

Gracias a todos :)
Título: Texturas Potencia De 2
Publicado por: martiño en 22 de Octubre de 2004, 09:42:42 PM
 Supuestamente filtrar una textura que es potencia de 2 es mas rapido y facil, de ahí que alguna tarjetas no soporten texturas que no son potencias de 2, (y tarjetas no tan antiguas), asi que aunque las tarjetas soporten cualquier tipo de texturas siempre es mejor usar las que tengan dimensiones potencia de 2.

Por otra parte gluBuild2DMipmaps lo unico que hace es espachurrar la textura hasta conseguir una que sea potencia de 2, asi que mejor lo haces en el photoshop tu antes y le ahorras trabajo a la tarjeta de video, que ademas va a filtrar peor.
Título: Texturas Potencia De 2
Publicado por: Pogacha en 23 de Octubre de 2004, 05:40:34 AM
 Estoy muy deacuerdo!.