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:
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.
2d
3d
graphics
graphics-programming
Zarkonnen
fuente
fuente
Respuestas:
El número de polígonos para representar una esfera de 500x500px "atractiva" con una sola llamada de sorteo es trivial para que las GPU las manejen en la mayoría de las plataformas, especialmente si no hay mucho más en la escena. También hay algunas notas sobre texturas de esferas para evitar la distorsión de texel; asegúrese de usar un mapa de cubos.
fuente
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.
fuente
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.
fuente
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) ^^
fuente
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.
fuente