Oyuncu tarafından görülen bloklar nasıl elde edilir?


15

Ogre motorunu kullanarak Minecraft benzeri bir oyun yazıyorum ve bir sorunum var. Oyunumu optimize etmeliyim, çünkü 10000 blok çizmeye çalıştığımda 2 FPS var ... Yani, uçağın görüntülenmesini engelleyen ve görünmez blokları gizleme fikrim var. Ama bir sorunum var - bir kerede hangi blokların görünür olduğunu nasıl bilebilirim?

Ve - böyle bir oyun için diğer optimizasyon yöntemlerini biliyorsanız, Ogre'de bunları nasıl ve nasıl kullanacağınızı yazın.

Yanıtlar:


16

Ogre zaten frustum culling uygular (temel olarak kameradan görülemeyen bir şey çizmez) ama bence probleminiz farklı bir sorun.

Gerçekten 10000 blok görüntülememelisiniz, yaygın olarak yapılan (veya en azından, gördüğüm klonlar gibi birkaç Ogre3d tabanlı minecraftta (bunlardan birini de yapıyorum) ve orijinalde bir kafes oluşturuyor olmalısınız ( gösterilen küplerin dış yüzlerine sahip olan bazı NxNxN bölgelerinin). Yani, 2 küp yan yana koyduğunuzda, dokunan 2 yüz görülemez ve bu nedenle çizilmesine gerek yoktur.

: Bu yüzler de böyle bir şeye çizilmelidir http://www.ogre3d.org/tikiwiki/tiki-index.php?page=DynamicGrowingBuffers Modern ekran kartları biri 100 çokgen 1000 kafesleri karşı 100000 çokgen örgü tercih olarak.


10

Bu sorunun birkaç yönü vardır. İlk olarak, 10000 bloğunuzu nasıl çiziyorsunuz? Onları aslında 10000 ayrı nesne olarak mı çiziyorsunuz? Eğer öyleyse, bu kesinlikle şişe boynunuzdur, tıkanıklık yokluğu değil. Çizim çağrılarını azaltmak için bu blokları daha az sayıda örgü (belki de kafes başına birkaç bin) olarak gruplandırmalısınız.

Asıl soruya gelince, akla ilk gelen üç tür oklüzyon ayıklaması vardır.

1) Görünüm frustum dışındaki bloklar. Bu, arkanızdaki veya iki tarafınızdaki bloklar anlamına gelir. Ogre bunları zaten görünüm frustum culling yoluyla kaldırır.

2) 'Yeraltında' olan veya diğer bloklarla tamamen çevrili olan bloklar, böylece hiçbir açıdan görülemezler. Bunları komşu bloklara bakarak tanımlayabilirsiniz. Eğer hepsi sağlamsa bloğunuz gizlidir. GPU asla bu blokları duymamalıdır - yüzeyinizi temsil eden ağı oluştururken atlanmalıdır.

3) Yüzeyde bulunan ve seviyedeki bazı konumlardan görülebilen, ancak şu anda bir tepe (veya bir şey) tarafından gizlenen bloklar. Bu, kendime değinmediğim en zor durumdur, ancak bu durum için donanım tıkanıklığı sorgularının kullanılabilme şansı yüksektir.

Utanmaz bir fiş, ancak bazılarının Ogre'yi de içeren Minecraft klonlarını geliştirmek için kullandığı oldukça olgun bir kütüphanem var. Birimin içeriğini tanımlarsınız ve daha sonra oluşturabileceğiniz yüzey ağını oluşturur. İşte ana sayfa:

http://www.thermite3d.org/

İşte başka birinin projesini kullanan bir videosu:

http://www.youtube.com/watch?v=Jju6WRPEK7o


4

Köşeleri ve oynatıcıyla yüzleşmeyen ilişkili pikselleri ayırmak için arka yüz kaldırma özelliğini kullanabilirsiniz. Derinlik tamponlaması geri kalanıyla ilgilenmelidir. 10k bloklar çok fazla değil, 5770'im 1500 fps'de 100k verts oluşturabilir. Sanırım oldukça yanlış bir şey daha yapıyorsun.


Katılıyorum. Bu, başka bir şeyle ilgili sorun olabilir.
Notabene

1

10000 ayrı nesneniz varsa, darboğaz muhtemelen ilkel sayımdır, tepe noktası, çokgen veya dolgu değildir. Hız için daha az sayıda yüksek çokgen nesnesine nesneleri pişirin.

Minecraft'ın küp blokları kavramı var, ama şu anda referansı bulamıyorum.

Burada da çeşitli tekniklerle tonlarca küp çizme deneylerim var. Pişirme (henüz) içermez.


0

Yaptığım şey, blok dizimi oluşturduktan sonra, ancak köşeleri oluşturmadan önce, UpdateBlockVisiblility adlı bir alt çalıştırıyorum.

Sub sadece komşuları bloğa kontrol eder ve Bloklar uygun boole'yi buna göre günceller.

#define BLOCKFACE_NORTH 0

#define BLOCKFACE_SOUTH 1 

etc etc etc

if(IsBlockAt(NorthOfBlock))
  Blocks[Whatever].facevisible[BLOCKFACE_NORTH] = false;

O zaman sadece görünür olduğunda yüzün köşelerini yaratırım! Basit :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.