Saya sedang memikirkan adegan jenis minecraft, di mana voxel yang Anda maksud adalah dunia balok yang sebenarnya dirender menggunakan poligon:
Jika Anda menggunakan geometri shader akan sulit untuk menghindari memiliki tiga wajah (atau apa pun) per voxel.
Jika Anda memiliki banyak blok yang berdekatan yang memiliki tekstur yang sama maka Anda dapat menggunakan ubin tekstur untuk memiliki segitiga yang jauh lebih sedikit di strip Anda (degenerasi) dalam pendekatan VBO. Maksud saya, jika ada bidang rumput voxel besar 6x6 yang rata dan rata, Anda bisa menggambar seluruh bagian atasnya hanya dalam 2 segitiga daripada 64.
Dengan pendekatan GS Anda tidak dapat melakukan pemusnahan sepele wajah yang disumbat oleh voxel yang berdekatan yang sangat mudah dengan pendekatan VBO.
Saya belum mencoba pendekatan GS, tetapi saya bisa mengatakan bahwa pendekatan VBO dengan menggabungkan pengulangan ubin yang berdekatan bekerja dengan sangat baik. Saya menemukan mengacaukan dengan indeks elemen menjadi lebih lambat daripada hanya mengulangi simpul. Jika Anda membagi dunia Anda menjadi kubus kecil yang bagus, Anda biasanya dapat menggunakan hanya satu byte per komponen per simpul dan bahkan mengemas info tekstur dan normals (wajah pada kubus sejajar sumbu hanya memiliki 3 kemungkinan normal) dll menjadi byte keempat untuk membuat 4 byte per titik yang bagus dan cepat.
Saya telah menggunakan VBO terpisah untuk masing-masing dari 6 wajah - Anda hanya perlu menggambar paling banyak 3 dari mereka jelas. Ini cocok dengan tekstur yang berbeda yang biasanya digunakan pada bagian atas voxels bergaya minecraft. Karena untuk setiap set yang normal dan yang demikian itu seragam.
Dengan menggunakan pixmaps ubin vertikal di atlas dengan GL_REPEAT
pada sumbu horizontal dan memiliki versi diputar 90-derajat dari pixmap di atlas yang sama saya menemukan saya dapat menggambar sejumlah besar blok yang tampaknya berbeda menggunakan VBO yang sama dalam panggilan yang sama. Dalam contoh 6x6 area rumput, saya akan membaginya menjadi 12 segitiga karena saya hanya mengulang pada satu dimensi di atlas saya.
Saya sebagian besar telah mendapatkan ini untuk bekerja pada ujung yang sangat rendah dari chip grafis terintegrasi dan ponsel, di mana GS adalah sesuatu yang saya bisa mimpikan suatu hari bermain dengan.
Bagaimana dengan opsi ketiga, menggunakan array instances? Pada dasarnya Anda menggambar banyak banyak kotak (terbuat dari kubus 8-simpul sederhana) dengan satu panggilan undian, sumber posisi (dan data lainnya) sebagai atribut per-instance dari voxel-data VBO (menggunakan
glVertexAttribDivisor
OpenGL, saya yakin DX juga memilikinya). Ini mungkin lebih cepat daripada pendekatan geometri shader meskipun kode aplikasi (non-shader) harus sangat mirip, karena saya ingat geometri shaders memiliki reputasi karena lambat, walaupun saya tidak memiliki pengalaman dengan mereka (atau instancing) karena saya masih duduk pada 2.1 perangkat keras.Tapi bagaimanapun, baik geometri shaders atau array yang dipasang harus lebih cocok daripada geometri voxel yang dibangun CPU, terutama ketika data voxel dapat berubah. Dalam hubungannya dengan umpan balik transformasi (aliran keluaran dalam DX?) Anda mungkin dapat mengatur beberapa teknik culling berbasis GPU yang baik.
sumber
Versi geometri shader terdengar jauh lebih baik bagi saya. Anda hanya dapat memiliki titik vbo dan membangun kotak dengan cepat (titik input, aliran segitiga output). Ini akan cepat (bahkan lebih cepat jika Anda akan menggunakan unit tessellation dalam model shader 5 eq. DX11) dan akan sangat mengurangi bandwidth, ini akan menjadi solusi yang bagus dan bersih.
Tentang GS. Itu diletakkan antara vertex shader dan pixel shader dan memodifikasi aliran vertex (primitif) yang dihasilkan. Sementara vertex shader hanya bekerja pada simpul, geometri shader bekerja pada primitif keseluruhan. Output dari aliran ini hanya pergi ke pixel shader (dan dirasterisasi sebelum itu tentunya :)) dan tidak ada cara untuk menyimpannya. (Mungkin oleh beberapa rendering gila untuk tekstur dan kemudian menguraikannya ... tapi tidak ada kemungkinan sederhana yang nyata)
Catatan kinerja: Anda harus dapat melakukan semuanya dalam geometri shader dan melewati (hanya data) shader vertex. Tapi itu bukan cara terbaik. Lebih baik (lebih cepat) adalah melakukan sebagian besar kemungkinan transformasi pada vertex shader dan mencoba meminimalkan program geometri shader. Jangan takut untuk menggunakan siklus jika Anda membutuhkannya (untuk pembuatan kotak misalnya). Compiler akan membuka gulungannya untuk Anda.
sumber