Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Dibujar tilemaps

Iniciado por Manu343726, 28 de Enero de 2013, 12:07:51 PM

« anterior - próximo »

Manu343726

Buenas.

Me gustaría saber cual es la mejor manera, o la más eficiente mejor dicho, de dibujar tilemaps.
Es algo a lo que llevo dando vueltas en la cabeza y no acabo de encontrar solución.

No puedo usar trianglestrips porque las coordenadas de textura no tienen porque ser la misma para dos tiles contiguos. Pero dibujar todo a base de quads no me parece la mejor manera, ya que en la mayoría de los casos repetirás el mismo vertice cuatro veces (suponiendo que el tilemap sea ortogonal, normal y corriente).

Tiene que haber alguna manera mejor, pero o no la veo, o no se me ocurre.

KneDa

Esto quizás sea un buen punto de partida:

http://www.gamedev.net/page/resources/_/technical/opengl/tiling-in-opengl-r1256

Echale un vistazo a esta técnica:

http://media.tojicode.com/zelda/

O tile mapping {opengl,directx,sdl,whatever} google ;)

Manu343726

Yo lo que quiero saber es si existe una manera mejor de hacerlo, que no sea dibujar quads. En el enlace que me has puesto, el del artículo de OpenGL, dibujan quads...... Creo que lo decía bien claro, alguna manera que no sea con quads, para no repetir vertices

Sergi Lázaro

Tienes alguna razón en particular para querer hacerlo super eficiente? Vas a renderizar mapas enormes (ENORMES), como para que el renderizado de tiles sea un problema de rendimiento?

Manu343726

Si, la idea es que si funciona usarlo para implementar algo tipo sim city, donde los mapas son enormes.

Sergi Lázaro

Yo probaría la forma clásica, probar con el mapa más grande que vas a tener, con una cámara del tamaño que tendría, etc. y medir si el rendimiento es bueno para el hardware que va a soportar, ya que sin medirlo previamente puede parecer muy basto, pero hoy en día a veces puedes hacer cosas super poco optimizadas y que vayan bien. Si es bueno el rendimiento, no vale la pena matarse a optimizar algo que no es un cuello de botella, a no ser que lo que se quiera sea "hacer engine"/"aprender" y no "hacer juego".

Para algo optimizado, usando shaders como explicado aquí parece interesante: http://gamedev.stackexchange.com/questions/30362/drawing-lots-of-tiles-with-opengl-the-modern-way/30454 . Casualmente el de la respuesta también menciona la filosofía de no matarse a no ser de que sea necesario (optimización prematura).

Perdona por todo esto si has medido el peor caso real y resulta que realmente necesitas rendimiento, pero es que la optimización prematura es un cancer que todos sufrimos  ;)

Manu343726

Realmente si lo necesito, hace tiempo ya intente hacerlo, pero lo tuve que dejar precisamente porque dibujar 1000x1000 quads no lo llevaba muy bien. Y eso era el mapa mediano......

Fanakito

Cita de: Manu343726 en 28 de Enero de 2013, 06:58:09 PM
Realmente si lo necesito, hace tiempo ya intente hacerlo, pero lo tuve que dejar precisamente porque dibujar 1000x1000 quads no lo llevaba muy bien. Y eso era el mapa mediano......

¿Pero estan los 1000x1000 en pantalla, a la vez? Se me ocurre que primero deberías hacer "culling" de los tiles que estan fuera de pantalla. 

Hecho esto, lo que tendrías que hacer (si sigues teniendo problemas) es meter algun tipo de LOD (nivel de detalle) de forma que los tiles que esten lejos de la camara se pinten con modelos simplificados (que dará igual, porque seran como 4 pixels de pantalla si tienes el millon de tiles a la vez).

¿Son tiles 2d o tiles 3d? Si son tiles 3d, ¿estas usando OpenGL de la forma más eficiente o tiras de la fixed pipeline y modo inmediato?

KneDa

Manu343726, de nuevo, mira el enlace que he puesto del zelda... aquí la explicación http://blog.tojicode.com/2012/08/more-gpu-tile-map-demos-zelda.html

Eskema

#9
yo probe un mapa de 10.000x10.000 y funcionaba perfecto en iphone sin ninguna optimizacion rara, sobra decir que SOLO se dibujaban los tiles en pantalla, unos 250 (tiles de 32x32 en 480x320 de resolución) y funcionaba a 60fps. Y eran simples quads mergeados en una sola drawcall (siempre que la textura fuera la misma claro)
Lo cual significa que creaba un VBO y listo, era openglES 1.1, ni shaders ni historias

Manu343726

Perdona KneDa, ese día estaba un poco gilipoyas. Gracias por la información.

En su momento no es que fuera muy avispado, pero tampoco estaba haciendo burradas XD. Por supuesto solo dibujaba los tiles que se veían, e incluso hacia un intento de backface culling para no dibujar los tiles que estaban "al otro lado de la montaña".

Pero también es verdad que igual no estaba usando el mejor sistema de dibujo... Pero bueno...

Sobre lo de meter todos los tiles en una sola drawcall, el problema que tengo es que no puedo asegurarme de que todos tengan la misma textura. Alguna idea?

Sergi Lázaro

Puedes hacer algun tipo de preproceso para hacer un atlas con todos los tilemaps juntos?

Manu343726

Eso había pensado, pero el problema es que si ando modificando las texturas del tilemap una y otra vez (cosa que seguramente haré) no se sí al final será peor el remedio que la enfermedad

pacomix

¿No sería más sencillo hacer el mapa entero en 3D y configurar luego una cámara con proyección ortogonal?
=El verdadero guerrero de la luz se levanta cuando todos los demás han caído=-

Manu343726

Realmente (creo) eso es lo de menos, ya que en realidad estoy haciendo precisamente eso; dibujar en 3d pero todo con la misma z. La proyección isométrica me la como yo, pero da igual porque solo lo haces al generar el mapa.

El problema al final lo solucioné usando un spritesheet, con lo que el mapa entero (Al final de unos 250x250 tiles si no recuerdo mal) se dibujaba en una sola drawcall.






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.