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:
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.
2d
3d
graphics
graphics-programming
Zarkonnen
sumber
sumber
Jawaban:
Jumlah poligon untuk membuat bola 500x500px "tampan" dengan panggilan draw tunggal adalah sepele untuk ditangani GPU pada sebagian besar platform, terutama jika tidak ada banyak hal lain di layar. Ada juga beberapa catatan tentang bidang tekstur untuk menghindari distorsi texel; pastikan untuk menggunakan peta kubus.
sumber
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.
sumber
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.
sumber
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) ^^
sumber
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.
sumber