Menggambar planet-planet yang berputar perlahan sangat besar

8

Saya ingin menggambar grafik planet yang sangat besar (~ 500 px) perlahan-lahan berputar. Grafik ini dimaksudkan untuk mengesankan. Apa cara terbaik untuk melakukan ini? Saya tidak memiliki pengalaman dengan mesin 3D tertentu, dan saya bahkan tidak yakin platform apa yang akan dijalankan game ini, jadi:

  • Saya bisa melakukan pra-render setiap frame, tetapi pada 500px dan periode rotasi 10 detik, itu adalah jumlah data yang menggelikan per planet.
  • Saya bisa menggunakan mesin 3D dan memetakan tekstur planet ke jala yang mendekati bola, tetapi pada kecepatan 500px, saya khawatir jumlah poligon harus besar untuk membuatnya terlihat bagus.
  • Saya bisa menulis semacam mesin 3D kustom yang tidak menghasilkan apa-apa selain secara efisien membuat bola bertekstur, dengan mengubah koordinat x / y dari setiap piksel tampilan ke dalam ruang koordinat tekstur bola - tetapi ini terlibat, dan tidak dapat mengambil manfaat dari akselerasi grafis.
  • Hal lain yang belum saya pikirkan?

Berikut adalah contoh animasi GIF tentang apa yang saya maksud. (Pada 100x100 px dan 60 frame, ini sudah cukup besar, maaf.) Bayangkan ini, jauh lebih besar, memutar lebih lambat, dan animasi lebih lancar:

teks alternatif

Tetapi jika ini adalah 500x500 px dan 10 x 25 = 250 frame, kita akan berbicara tentang ratusan MB data, jadi pendekatan langsung ini tidak berfungsi.

Zarkonnen
sumber
Ini tidak mungkin dijawab jika Anda tidak tahu apa platform target Anda.
AttackingHobo
1
Nah, jika ukurannya 500px, itu bukan iPhone pra-4G / Android yang setara, yang merupakan satu-satunya hal yang saya harapkan akan mengalami masalah dengan rendering yang begitu sederhana.
8
Hmm, saya pikir jawabannya mungkin saja "Zarkonnen, Anda tidak tahu seberapa kuat GPU saat ini". : P
Zarkonnen
1
Ini sepertinya bukan data dalam jumlah besar.
The Communist Duck

Jawaban:

4

Karena Anda melihat bola dengan kamera konstan, Anda dapat melakukan rendering berkualitas tinggi dengan sangat cepat dengan tabel pencarian sederhana yang telah dihitung sebelumnya.

Sebagai langkah perhitungan awal, dengan metode apa pun yang Anda suka (biasanya dengan poligon atau raytracing), Anda membuat tekstur yang dipetakan ke buffer offsceen, tetapi alih-alih menghitung warna berdasarkan pada tekstur, Anda hanya menyimpan tekstur koordinat u / v.

Kemudian ketika merender planet yang sebenarnya Anda membuat kotak sederhana dan untuk setiap piksel Anda mengambil koordinat u / v aktual dari tabel pencarian dan warna piksel dari tekstur planet menggunakan koordinat u / v tersebut. Untuk memutar bola, Anda cukup mengimbangi koordinat u dengan sudut rotasi.

Teknik ini sangat populer di demoscene misalnya dengan tekstur efek terowongan yang dipetakan, tetapi sayangnya saya tidak dapat menemukan tutorial yang baik tentang hal itu.

msell
sumber
0

Jika Anda melakukan ini dalam pengaturan 2D, lihat pertanyaan sebelumnya ...

Ilusi 3D Tekstur Planet 2D

Konsep yang sama akan bekerja dengan baik dengan gambar besar dan dengan secara dinamis memindahkan tekstur medan pada lapisan di bawah "lubang" di ruang angkasa.

Baca tautan di atas untuk mengetahui apa yang saya maksud dengan ini.

Tim Holt
sumber
3
Saya benar-benar tidak suka metode itu, karena terlihat persis seperti apa adanya. Tekstur yang rata digerakkan tanpa distorsi saat berubah.
AttackingHobo
0

Jika Anda memampatkan animasi yang dihasilkan dengan codec video modern, itu tidak akan terlalu besar sama sekali dan tidak jauh dari "beberapa ratus MB data" atau menggelikan ...

Tapi seperti yang sudah disebutkan, itu semua tergantung pada apa platform target Anda dan seperti yang orang lain katakan; hanya merender bola 3D yang halus akan benar-benar melibatkan jumlah poligon yang tidak signifikan dan penyimpanan data yang sangat sedikit (teksturnya adalah semua yang ada dan bahkan pada resolusi yang sangat tinggi, kompresi jpeg standar tidak akan menghasilkan apa-apa).

Itu semua juga sedikit tergantung pada seberapa pemilih Anda - jika Anda setelah seperempat pixel-scrolling-look dan detail tekstur setara dengan demo canggih, dan bukan hanya game kontemporer dengan semua interpolasi dan aliasing mereka masalah bahkan di 8x FSAA - maka hampir bisa terlibat tanpa henti untuk mencapai (dan memerlukan sedikit tipu daya artistik) ^^

Oskar Duveborn
sumber
1
-1 - "kompresi jpeg standar" tidak ada untuk tekstur, dan paragraf ketiga Anda tidak terlalu masuk akal. "Quarter pixel scrolling" dapat dicapai melalui pemfilteran standar di OpenGL / Direct3D, dan AA akan sepele untuk adegan seperti itu.
Benar. Dalam pembelaan saya, ketika pertanyaan menyatakan "jumlah data per planet yang menggelikan" untuk solusi animasi - saya memikirkan penyimpanan data, bukan throughput data. Paragraf terakhir sebagian besar adalah komentar yang menanyakan seberapa tinggi bilah ditetapkan. Saya belum pernah melihat AA sebagai hal sepele, bahkan solusi render offline paling ketat untuk film yang melakukan ratusan lintasan dengan cara eksotis memiliki beberapa aliasing segera setelah hal-hal mulai bergerak, terutama pada layar PC berdensitas rendah - tetapi kebanyakan orang tidak begitu pilih-pilih.
Oskar Duveborn
0

Jika Anda memiliki masalah dengan kinerja melakukan hal ini dengan cara tradisional (tekstur dan pemetaan normal pada bola poligon tinggi), yang seperti yang banyak disebutkan tidak boleh menjadi masalah pada resolusi itu:

"Raytrace" dengan shader fragmen. Jika kamera Anda diperbaiki semua yang Anda butuhkan adalah input float seragam ke shader fragmen Anda (untuk sudut rotasi) dan shader dapat menangani perhitungan koordinat tekstur. Vektor pencahayaan bahkan mungkin sama setiap frame juga. Adapun anti-aliasing Anda juga bisa mendapatkan siluet bola sempurna dengan sedikit kecerdikan (jika piksel berada di batas bola, hitung cakupannya)

Ini membuat Anda hanya mengirim 4 simpul melalui pipa, dan tidak mengharuskan Anda untuk mengalokasikan framebuffer multisampled raksasa untuk melawan jaggies.

Dengan biaya harus datang dengan beberapa algoritma built-to-order.

Steven Lu
sumber