Opengl'deki ışığı anlamaya çalışırken, gerçekçi bir güneş ışığını nasıl simüle edebilirim?


13

Yanlış bir şey mi yapıp yapmadığımı bilmiyorum ama güneşli bir günde olduğu gibi güneş ışığını simüle etmek istiyorum.

Nesne yönlü ışığa baktığında, iyi aydınlatılır ve orada sorun yoktur. Nesnenin etrafına gidip geri döndüğüne bakarsam karanlık olur. Çok karanlık değil çünkü kullanıyorum GL_AMBIENTama güneşli bir gün için hala çok karanlık. Değeri arttırırsam, asla daha iyi görünmeyecektir, çünkü nesnenin ışığa bakan tarafı çok parlak olacaktır.

Ve ortam ışığında başka bir can sıkıcı sorun daha var, nesnenin arkasına bakarken herhangi bir şekil göremiyorum, sadece düz bir renk. Açıklamak zor, işte bazı resimler:

Nesne Önü: http://i.stack.imgur.com/YW53X.png
Nesne Geri: http://i.stack.imgur.com/Qufha.png

Kolayca görebileceğiniz gibi, ön taraf güzel görünüyor, o kırmızı şeyin şeklini görebilirsiniz. Arka tarafta, düz, aynı şekli göremezsiniz.

Şimdi, bir nesnenin arkasına baktığımı biliyorum ve ışığın yönüne bakıyorum ve ön taraftan daha karanlık olmalı. Ancak bu kadar açık görünmemelidir. Güneş ışığına karşı bir nesneye bakarken gördüğümüz bu değil, nesnelerin bir şekil oluşturduğunu görüyoruz.

OpenGL üzerinde aynı (veya benzer) etkiye nasıl sahip olabilirim?

Işığım şu anda şu şekilde tanımlanıyor:

float posLight0[4] = {-1.0f, 1.0f, 1.0f, 0.0f};
float ambLight0[4] = {0.5f, 0.5f, 0.5f, 0.5f};

glLightfv(GL_LIGHT0, GL_POSITION, posLight0);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambLight0);

Mümkünse gölgelendiricileri kullanmayı düşünmenizi öneririm. OpenGL sabit işlevli boru hattı oldukça basit bir aydınlatma modeli kullanırken gölgelendiriciler size matematik üzerinde tam kontrol sağlar.
İnanılmaz Keşiş

Yanıtlar:


11

Ortam ışığıyla, dağınık ışık ortam ışığına eklendiği ve dağınık ışık varsayılan olarak 1.0 olduğu için nesneleriniz çok parlak görünür. Bu 1.5'e kadar ekler ve 1.0'ın üzerindeki her şey kelepçelenir. Dağınık ışığı 0,5 olarak ayarlayın:

float difLight0[4] = {0.5f, 0.5f, 0.5f, 1.0f};
glLightfv(GL_LIGHT0, GL_DIFFUSE, difLight0);

İkinci problemi çözmek daha zordur. Yüzeye doku veya yumru harita gibi bazı ince ayrıntılar eklemeyi deneyebilirsiniz. OpenGL'de ortam ışığı sabittir, ancak gerçek dünyada durum böyle değildir. Gerçek dünyayı simüle etmek için bir çeşit küresel aydınlatma çözümüne ihtiyaç vardır. Ortam tıkanıklığı burada çok yardımcı olur, ancak uygulanması sadece OpenGL durumlarını ayarlamaktan daha zordur. 3B modelleme yazılımınızda ortam tıkanıklığını modelinizin köşelerine fırlatabilir veya SSAO kullanabilirsiniz , ancak ayrıntılara gitmeyeceğim.

Kolayca yapabileceğiniz başka bir yönden başka bir dimmer ışık kaynağı eklemektir (örn. Zıt yön). Bu gerçekçi olmayacak, ancak en azından nesnelerinizin arka tarafları için de bir şekil verecektir.

Ayrıca uygulamanıza spekülatif vurgular eklemeyi de düşünün. Nesneleri parlatacak.

float specLight0[4] = {0.5f, 0.5f, 0.5f, 1.0f};
glLightfv(GL_LIGHT0, GL_SPECULAR, specLight0);
glMaterialfv(GL_FRONT, GL_SHININESS, 10.0f); // Shininess between 0 and 128

Ayrıca ışık ve malzeme renklerini ayrı ayrı belirtebilirsiniz, özellikle de varsayılanlar sizin için uygun değilse.


Yani OpengGL'de istediğimi yapmanın basit ve doğrudan bir yolu yok ... Çok kötü. Belki başka bir ışık kaynağı eklemeyi deneyeceğim, ancak ışık yoğunluğunu tam olarak nasıl belirlerim?
rfgamaral

GL_SPECULARVe GL_SHININESSben değişti gerçi ... herhangi bir etkisi üretmek için görünmüyor glMaterialfviçin glMaterialio derleme değildi çünkü. Ve 128 gibi daha büyük bir değer denedi. Bana benziyor ... Belki de sorun benim yüklü modelimde (obj / mtl), bir göz atmak zorunda kalacak.
rfgamaral

1
@Nazgulled Sadece light0 spekülatörünün varsayılan olarak 1.0 olduğunu, ancak maddi spekülatörün varsayılan olarak 0.0 olduğunu kontrol edin. Bu nedenle glLightfv (GL_LIGHT0, GL_SPECULAR, specLight0) öğesini değiştirin; glMaterialfv (GL_FRONT, GL_SPECULAR, specLight0); GlLightModeli'yi (GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE) ayarlamak da iyidir; veya speküler kamera dönerken yanlış hesaplanabilir.
msell

1
@Nazgulled İkincil ışık için ortam ve speküleri sıfıra ve dağınıklık için 0,2 gibi küçük bir değere ayarlayın. Ayrıca tüm ışıkların ortamını sıfıra ayarlayabilir ve bunun yerine GL_LIGHT_MODEL_AMBIENT ile küresel ortam kullanabilirsiniz.
msell

2

OpenGL'nin ortam ışığı tek bir renktir, ancak gerçek dünyadaki ortam ışığı genellikle yukarıdan daha parlak ve aşağıdan daha koyudur. Ortam ışığını çok koyu maviye ayarlayıp aşağı dönük koyu mavi bir yön ışığı ekleyerek bunu OpenGL'de yapabilirsiniz. Bunun yanı sıra, güneşin bulunduğu yerden gelen parlak beyaz yönlü bir ışık, dış mekan ışığına oldukça iyi yaklaşabilir.

Gerçekten yapmanız gereken, piksel başına ışığı hesaplayan bir gölgelendirici yazmaktır, ancak oraya gittiğiniz zaman biraz zaman alacaktır.


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.