Я намагаюсь написати трохи воксельного двигуна, тому що це весело, але намагаюся знайти найкращий спосіб зберігати фактичні вокселі. Я усвідомлюю, що мені будуть потрібні певні шматки, тому мені не потрібно мати весь світ в пам’яті, і я знаю, що мені потрібно зробити їх з розумною продуктивністю.
Я читав про октриси, і з того, що я розумію, це починається з 1 куба, і в цьому кубі може бути ще 8 кубів, а в усіх цих 8 кубів може бути ще 8 кубів і т. Д. Але я не думаю, що це відповідає моєму воксельному двигуну, тому що всі мої кубики / елементи вокселя будуть точно такого ж розміру.
Отже, ще один варіант - просто створити масив розміром 16 * 16 * 16 і мати один фрагмент, і ви заповните його елементами. А частини, де немає жодних елементів, матимуть значення 0 (0 = повітря). Але я боюся, що це втратить багато пам’яті і не буде дуже швидким.
Потім ще один варіант - вектор для кожного шматка, і заповнити його кубиками. І куб утримує своє місце в шматку. Це економить пам'ять (немає повітряних блоків), але робить куб у певному місці набагато повільніше.
Тож я не можу знайти хорошого рішення, і сподіваюся, що хтось може мені допомогти у цьому. То що б ви використовували і навіщо?
Але ще одна проблема - надання. Просто читати кожен фрагмент і надсилати його до GPU за допомогою OpenGL - це легко, але дуже повільно. Генерувати одну сітку за шматок було б краще, але це означає, що кожного разу, коли я перериваю один блок, я повинен будувати весь шматок, який може зайняти трохи часу, викликаючи незначну, але помітну гикавку, якої я, очевидно, теж не хочу. Так що було б важче. То як би я видавав кубики? Просто створіть усі кубики в одному вершинному буфері за шматок і зробіть це, а може, спробуйте вкласти це в інший потік, чи є інший спосіб?
Дякую!