Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Texturas Potencia De 2

Iniciado por tewe76, 25 de Septiembre de 2004, 11:10:56 PM

« anterior - próximo »

tewe76

 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?

Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

_Grey

 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.


Pogacha

 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.

AgeR

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

ethernet

 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

gdl

 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.

tewe76

 
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)?
Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

seryu

 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..

ethernet

 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

seryu

 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..

Haddd

 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!!


AgeR

 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:  

egf

 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  

tewe76

 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.

Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

BeRSeRKeR

 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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!






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.