2015-05-03 22 views
5

3D oyunlarda sabit bir dokuya sahip bir gökyüzü oluştururken, insanlar önce bir küp haritasındaki 6 dokuyu oluşturur ve ardından kameranın etrafında bir küp oluştururlar. GLSL'de dokulardaki piksellere doku koordinatı yerine normal bir şekilde erişebilirsiniz ve fotoğraf makinesine göre parça konumunu normalize ederek bu normali kolayca alabilirsiniz. Bununla birlikte, bu işlem kamerayı çevreleyen herhangi bir şekil ile yapılabilir, çünkü her pozisyonu normalleştirdiğinizde her zaman bir küre ile sonuçlanır. Şimdi merak ediyorum: Neden her zaman bir küp ve bir tetrahedron değil? Bir küpün oluşturulması 12 üçgen, sadece bir tetrahedron alır 4. Ve zaten söylediğim gibi, kamerayı çevreleyen herhangi bir şekil çalışır. Yani tetrahedronlar daha az VRAM alır ve herhangi bir olumsuzluk olmadan, daha hızlı render edilir? Neden onları kullanmıyorsun?Neden insanlar gökyüzü kutuları için tetrahedron kullanmıyor?

+1

Skyboxes doku koordinatlarını belirlemek için uygulanması kolay ve kolaydır küp haritalarının yerine küresel doku eşlemesi için kullanılabilir. Bu yüzden daha yaygındır. –

+0

Peki doku koordinatlarına ihtiyacınız yok. Sanırım köşe pozisyonunu bulmak biraz zor. – Pikaju

cevap

4

Sen hiç bazı çevre geometri gerek yoktur. Yapmanız gereken tek şey, bir tam ekran dörtlü çizimi yapmak ve bunun için doğru doku koordinatlarını hesaplamak.

Vertex Shader: Şimdi, modern GL ile, biz bile attributless oluşturmayı kullanabilirsiniz, bunun için köşe verilerini sağlamak gerekmez sürer böylece invPVinverse(Projection*View) olduğunu

#version 330 core 
out vec3 dir; 
uniform mat4 invPV; 
void main() 
{ 
     vec2 pos = vec2((gl_VertexID & 2)>>1, 1 - (gl_VertexID & 1)) * 2.0 - 1.0; 
     vec4 front= invPV * vec4(pos, -1.0, 1.0); 
     vec4 back = invPV * vec4(pos, 1.0, 1.0); 

     dir=back.xyz/back.w - front.xyz/front.w; 
     gl_Position = vec4(pos,1.0,1.0); 
} 

, senin kamera yönelimi yanı sıra projeksiyon dikkate. Bu, prensip olarak, projeksiyon matrisine ne kadar kısıtlama koyabildiğinize bağlı olarak, basitleştirilebilir.

Fragman Shader:

#version 330 core 
in vec3 dir; 
out color; 
uniform samplerCube uTexEnv; 
void main() 
{ 
     color=texture(uTexEnv, dir); 
} 

bu kullanmak için tek yapmanız gereken boş bir vào ve dokusunu, sizin invPV matris yükleyip glDrawArrays(GL_TRIANGLE_STRIP, 0, 4) çağrı bağlamak gerekir.

Bu yaklaşım elbette

5
  1. bir görünüm derinlik soru ve render yüzey neredeyse çarpıtma olmadan kamera uzaya yansıtırken, çünkü

    iyi loca şekli (yarım) küre şekli olduğunu. Başka bir şekil kullanırsanız, özellikle de çoğu uygulama/oyun küpü göbek kutusu kulla- nım köşelerinde özellikle projeksiyon eserler ortaya çıkacaktır. Güneşin sonlu yarıçapa (sadece tek noktaya değil) bakın ve görünümü döndürün, böylece güneş görüşün ortasından yanlara doğru ilerler. Sonra genellikle güneş eliptik/oval şekle dairesel/disk şeklinden bozulmuyor:

    cube distortion example enter image description here

    bu Skybox ve kamera arasındaki mesafeyi değiştirerek kaynaklanmaktadır. Eğer karşılaştırırsanız doğrudan render için yıldız:

    rendered sky (no skybox)

    o zaman farkı görebilirsiniz. İlk görüntü (bazı oyundan) google tarafından bulunan ilk alakalı resim ikinci Bence Uzay Mühendisleri formu ekran görüntüsüdür ve son Yani

    bkz mayın astro uygulaması tarafından oluşturulur olduğunu daha fazla küre, aldığınız daha fazla çarpıklıktan uzaktır. 4 kenarlı piramidin kullanıldığı

    küpü daha da kötüdür, çünkü kenarlar arasındaki açıların daha da kötü olması nedeniyle daha büyük artefaktlar oluşturur. Başka bir problem aynı alanı kaplamak için daha büyük bir piramit boyutuna ihtiyacınız var. Eğer render Skybox sırasında bazı amaçla TamponDerinliği kullanırsanız önemli ölçüde Z_far uçağı artırarak hassasiyeti etkileyebilir. loca büyük (kapak bütün görünüşüdür) olduğu için 6 ve 4 çokgenler arasındaki

  2. Asma

    his hız değildir taranması için dosyalanan piksel/texel deyince çoğunlukla belirlenir o kadar değil Köşeler sayılır. Bu yüzden piramit daha yavaş olabilir, çünkü daha büyük yüzlere sahip olması gerekir (daha fazla enterpolatör iterasyona ihtiyaç vardır).Ancak küresel skybox'u kullanmak isterseniz, aynı zamanda küresel bir dokuya da ihtiyacınız vardır, çünkü standart küp dokusunu kullanırsanız, bozulma hala mevcut olacaktır ve bunların yaratılmasının sürdürülmesi daha zordur ... ve bu yüzden küpler daha çok kullanılır .

  3. Küresel skyboxes

    onlar dokusu farklı türü gerekir. Yarım küre doku şuna benzer:

    hemisphericall texture

+1

Bundan emin misin? Eğer 6 standart doku kullansaydım ve onları normal doku koordinatlarıyla bir küpe eşlersek, evet, Bozulurdu. Ama parça gölgelendiricisindeki köşe pozisyonlarını normalleştirdiğim için, bir küre alıyorum ve zaten söylediğin gibi, bir küre bir gökyüzü için mükemmeldir. Ayrıca, yüzlerin enterpolasyonu gerçekten de önemli olmamalıdır, çünkü modelin boyutu tamamen ilgisizdir (derinlik tamponu devre dışı bırakılmışsa). – Pikaju

+0

@Pikaju Katılıyorum ama işe yaramak için kübik yerine küresel olarak eşleşmiş dokuya ihtiyacınız var bir ya da başka üzerinde çarpık bir doku ile mükemmel küresel skybox olurdu üzerinde sky sky – Spektre

+0

@Pikaju gibi benzer sonuçlara sahip benzer bir sonucu var yarımküre doku örneği görüntü sonuna – Spektre

İlgili konular