Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





un vbo con mas de una textura

Iniciado por xeex, 07 de Noviembre de 2008, 09:17:25 PM

« anterior - próximo »

xeex

hola
estoy trabajando con vbo.
¿Es posible tener un vbo con mas de una textura?
lo que quiero decir es:

si tengo al inicializar:

                glGenBuffersARB(1, &vertices_buffer);
                glBindBufferARB(GL_ARRAY_BUFFER_ARB, vertices_buffer);
                glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(vertices_datos),vertices_datos,GL_DYNAMIC_DRAW_ARB);          
                glGenBuffersARB(1, &normales_buffer);
                glBindBufferARB(GL_ARRAY_BUFFER_ARB, normales_buffer);
                glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(normales_datos),normales_datos,GL_DYNAMIC_DRAW_ARB);          
                glGenBuffersARB(1, &texturas_buffer);
                glBindBufferARB(GL_ARRAY_BUFFER_ARB, texturas_buffer);
                glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(texturas_datos),texturas_datos,GL_DYNAMIC_DRAW_ARB);          
                glEnableClientState(GL_VERTEX_ARRAY);
                glEnableClientState(GL_NORMAL_ARRAY);
                glEnableClientState(GL_TEXTURE_COORD_ARRAY);

...y luego el bind:

glBindTexture(GL_TEXTURE_2D,texturas_objetos[23].ID);      

luego el dibujo:

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vertices_buffer);
    glVertexPointer(3, GL_FLOAT, 0, 0);
   
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, normales_buffer);    
    glNormalPointer(GL_FLOAT, 0, 0);
   
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, texturas_buffer);
    glTexCoordPointer(2, GL_FLOAT, 0, 0);
   
    glDrawArrays(GL_QUADS, 0, tam_vbo);      


quiero que cada quad tenga su propia textura...¿como lo hago?...¿se puede?...¿donde coloco los bind si es que se puede?
si no me entiende....supongamos que tengo en el vbo los vertices, normales y corrdenadas de las texturas de las cara de un cubo, lo que quiero hacer es que  cada cara tenga su propia textura...
¿se puede verdad?

por favor ayuda...se me acaba el tiempo
GRACIAS Y SALUDOS

xeex

#1
por si no me explique bien esto es exactamente lo que me pasa:
http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=247593

se puede hacer algo como un arreglo en donde dejar las diferentes texturas, e ir llamandolas segun sea el quad que se esta dibujando?

bueno respondiendome:
-hay una "texture array extension" pero solo disponible para GeForce 8x00, cosa que no tengo
-decomponer el glDrawArrays() para hacer un bind para cada textura para cada quad:

     glBindBufferARB(GL_ARRAY_BUFFER_ARB, vertices_buffer);
     glVertexPointer(3, GL_FLOAT, 0, 0);
     
     glBindBufferARB(GL_ARRAY_BUFFER_ARB, normales_buffer);     
     glNormalPointer(GL_FLOAT, 0, 0);
     
     glBindBufferARB(GL_ARRAY_BUFFER_ARB, texturas_buffer);
     glTexCoordPointer(2, GL_FLOAT, 0, 0);
     int x=0;
     for(int i=0;i<1536;++i)
        {
           glBindTexture(GL_TEXTURE_2D,texturas_objetos[CL[  i  ].textura].ID);     
           glDrawArrays(GL_QUADS, x, x+4);     
           x=x+4;
        }

hace que todo se vuelva ultra lento, bueno es ovio si en vez de dibujar todo de una vez estoy dibujando 1536 por separado, se pierde toda la ventaja del vbo

lo unico que me queda por probar seria la otra solucion que dan de dejar todas las texturas en una textura mas grande, cosa que no tengo idea como hacer y ademas  abrir el fotoshop y pegar una textura  al lado de otra no es solucion para mi ya que en mi programa lo que hago es dar a elegir al usuario que textura va a mapear sobre cada lado, osea no tengo un numero constante de texuras...
asi que ahora estoy mas desesperado aun ...si me pueden ayudar por favor....
gracias y saludos.


wereoffs

Hola, yo no veo mas soluciones a tu problema que las expuestas en el hilo del foro que has puesto.

Un saludo.

xeex

si, no hay mas, mi problema se reduce entonces a ver la forma de hacer una textura que contenga todas las texturas, lo malo, como dije antes, es que si en mi programa elijo una nueva textura, es decir, otra aparte de las que doy a elegir, tendria que encontrar la forma de unirla a la textura-atlas en tiempo de ejecucion...y es eso lo que me complica, sino habra que volver a los displaylist...que pena...
gracias y saludos

wereoffs

Hola xeex, no puedes "unir" la textura en tiempo de ejecución a la "textura atlas" como dices, almenos si quieres hacerlo en realtime. Tienes que considerar cargar antes del loop "realtime", las texturas en una textura "gigante". Deberás de tener en consideración las siguientes restricciones si no te quieres complicar la vida.

-Las imágenes que usarás como textura deben de tener el mismo formato (RGBA32 por ejemplo)
-El ancho y alto de las imágenes deben de ser multiplo del máximo alto y ancho de pixeles por textura soportado por la gráfica.

Entonces, si tenemos en cuenta por ejemplo que el máximo de alto y ancho soportado por la gráfica fuera de 1024x1024 (es un ejemplo). Podriamos texturizar un total de 64 texturas diferentes de 128x128 píxeles.
Lo primero que se debería hacer es reservar la memoria correspondiente a 1024x1024 pixeles, en el caso de que usáramos imágenes de 32 bit, seria un total de 4*byte*1024*1024. Una vez reservada la memoria solo tienes que ir cargando las texturas y copiar los píxeles en la memoria reservada. Para saber qué coordenadas (u,v), son el (0,0) y (1,1) en la subtextura dentro de la textura gigante, creo que es evidente. Puedes usar un std::map para mapear el nombre de la "subtextura", o identeificador, con las coordenadas u,v que le corresponden a 0,0 y 1,1.  Finalmente generas la textura en la gpu, liberas la memoria y ya está.

Bueno, no se si me he explicado bien, espero que te sea de ayuda. Un saludo!

Zaelsius


xeex

gracias por responder...vamos  a ver que pasa....
Saludos






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.