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?
cevap
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 invPV
inverse(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
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:
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:
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
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 .
Küresel skyboxes
onlar dokusu farklı türü gerekir. Yarım küre doku şuna benzer:
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
@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
@Pikaju gibi benzer sonuçlara sahip benzer bir sonucu var yarımküre doku örneği görüntü sonuna – Spektre
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. –
Peki doku koordinatlarına ihtiyacınız yok. Sanırım köşe pozisyonunu bulmak biraz zor. – Pikaju