Dibujando planetas muy grandes que giran lentamente

8

Me gustaría dibujar gráficos muy grandes (~ 500 px) de planetas que giran lentamente. Estos gráficos están destinados a impresionar. ¿Cuál es la mejor manera de hacer esto? No tengo experiencia con ningún motor 3D en particular, y ni siquiera estoy seguro de en qué plataforma se ejecutará este juego, así que:

  • Podría pre-renderizar cada cuadro, pero a 500 px y un período de rotación de 10 segundos, esa es una cantidad ridícula de datos por planeta.
  • Podría usar un motor 3D y mapear la textura del planeta en una malla que se aproxima a una esfera, pero a 500 px, me temo que el recuento de polígonos tendría que ser enorme para que se vea bien.
  • Podría escribir una especie de motor 3D personalizado que no haga nada más que renderizar eficientemente una esfera texturizada, al convertir la coordenada x / y de cada píxel de vista en el espacio de coordenadas de la textura de la esfera, pero esto está involucrado y no podría beneficiarse de aceleración de gráficos.
  • ¿Algo más en lo que no haya pensado?

Aquí hay un ejemplo de GIF animado de lo que quiero decir. (Con 100x100 px y 60 cuadros, ya es bastante grande, lo siento). Imagine esto mucho, mucho más grande, girando mucho más lento y animado más suavemente:

texto alternativo

Pero si esto fuera 500x500 px y 10 x 25 = 250 cuadros, estaríamos hablando de cientos de MB de datos, por lo que este enfoque directo no funciona.

Zarkonnen
fuente
Esto es imposible de responder si no tiene idea de cuál es su plataforma de destino.
AttackingHobo
1
Bueno, si tiene un tamaño de 500 px, no es un iPhone anterior a 4G / Android equivalente, que es lo único que esperaría tener problemas con un render tan simple.
8
Hmm, creo que la respuesta puede ser simplemente "Zarkonnen, no tienes idea de lo poderosas que son las GPU en estos días". : P
Zarkonnen
1
Esto no parece una gran cantidad de datos.
El pato comunista

Respuestas:

4

Como está mirando la esfera con una cámara constante, puede hacer renderizados de alta calidad extremadamente rápido con una simple tabla de búsqueda precalculada.

Como paso previo al cálculo, con cualquier método que desee (generalmente con polígonos o trazado de rayos), renderiza una esfera mapeada de textura en un búfer descendente, pero en lugar de calcular los colores en función de la textura, solo almacena las coordenadas u / v de la textura.

Luego, al representar el planeta real, representa un cuadrado simple y para cada píxel obtiene las coordenadas u / v reales de la tabla de búsqueda y los colores de píxeles de la textura del planeta utilizando esas coordenadas u / v. Para rotar la esfera, simplemente desplace la coordenada u con el ángulo de rotación.

Esta técnica fue muy popular en el demoscene, por ejemplo, con efectos de túnel mapeados de textura, pero desafortunadamente no pude encontrar ningún buen tutorial al respecto.

msell
fuente
0

Si está haciendo esto en una configuración 2D, vea esta pregunta anterior ...

Ilusión 3D de una textura de planeta 2D

El mismo concepto funcionaría bien con una imagen grande y moviendo dinámicamente la textura del terreno en una capa debajo del "agujero" en el espacio.

Lea el enlace de arriba para saber a qué me refiero con esto.

Tim Holt
fuente
3
Realmente no me gusta ese método, porque se ve exactamente como es. Una textura plana que se mueve sin distorsión a medida que gira.
AttackingHobo
0

Si comprime la animación resultante con un códec de video moderno, no sería particularmente grande y de ninguna manera cerca de "varios cientos de MB de datos" ni ridícula ...

Pero como ya se dijo, todo depende de cuál sea su plataforma de destino y como todos los demás dijeron; solo renderizar una esfera 3D suave implicaría una cantidad insignificante de polígonos y muy poco almacenamiento de datos (la textura es todo lo que hay e incluso a resoluciones realmente altas, la compresión estándar jpeg lo reduciría a nada).

Todo también depende un poco de lo exigente que seas: si buscas el aspecto de desplazamiento de un cuarto de píxel y los detalles de textura a la par con demostraciones de vanguardia y no solo juegos contemporáneos con toda su interpolación y alias problemas incluso en 8x FSAA - entonces podría involucrarse casi infinitamente para lograr (y requerir un poco de artimañas también) ^^

Oskar Duveborn
fuente
1
-1 - "compresión JPEG estándar" no existe para las texturas, y su tercer párrafo realmente no tiene sentido. El "desplazamiento de un cuarto de píxel" se puede lograr a través del filtrado estándar en OpenGL / Direct3D, y AA sería trivial para tal escena.
Cierto. En mi defensa, cuando la pregunta decía "cantidad ridícula de datos por planeta" para una solución de animación, pensé en el almacenamiento de datos, no en el rendimiento de datos. El último párrafo fue principalmente un comentario que preguntaba qué tan alto se estableció la barra. Nunca he visto a AA como algo trivial, incluso las soluciones de renderizado fuera de línea más rigurosas para hacer cientos de pases de manera exótica tienen algunos alias tan pronto como las cosas comienzan a moverse, especialmente en pantallas de PC de baja densidad, pero la mayoría de las personas no lo son difícil.
Oskar Duveborn
0

Si tiene problemas con el rendimiento al hacer esto de la manera tradicional (textura y mapeo normal en una esfera de alto polígono), que como muchos han mencionado, no debería ser un problema en esa resolución:

"Raytrace" con un sombreador de fragmentos. Si su cámara está arreglada, todo lo que necesita es una entrada flotante uniforme a su sombreador de fragmentos (para el ángulo de rotación) y el sombreador puede encargarse de calcular las coordenadas de textura. Los vectores de iluminación incluso podrían ser los mismos en cada cuadro. En cuanto al suavizado, también puede obtener una silueta esférica perfecta con poco ingenio (si el píxel está en el límite de la esfera, calcule su cobertura)

Esto solo tiene que enviar 4 vértices a través de la tubería, y no requiere que asigne un gigantesco framebuffer multimuestreo para luchar contra las irregularidades.

A costa de tener que idear varios algoritmos personalizados.

Steven Lu
fuente