Bir dokuyu kısmen şeffaf hale nasıl getirebilirim?


13

Günaydın StackOverflow, openGL ile şeffaf bir doku parçası oluşturmak için bir yol bulamıyorum gibi şu anda bir sorun yaşıyorum.

İşte benim ayarım: Bu doku ile kaplı bir duvarı temsil eden bir dörtlü var (yükleme amaçları için PNG'ye dönüştürüldü). Açıkçası, cam bölmeler hariç duvarın opak olmasını istiyorum. Duvarın arkasında bir manzara göstermesi gereken başka bir uçak var. Pencerenin arkasından manzarayı görmek istiyorum. Her doku alfa kanallı bir TGA'dır.

Önce "manzara" sonra da duvar yapılır. Bu etkiyi elde etmenin yeterli olacağını düşündüm ama görünüşe göre durum böyle değil. Pencerenin şeffaf olması gereken kısmı siyahtır ve manzara sadece duvardan geçince görünür.

Bunu etkinleştirdikten sonra GLBlendFunc () ile uğraşmaya çalıştım ama hile yapmak gibi görünmüyor.

Önemli bir adımı unutuyor muyum?

Teşekkür ederim :)


Merhaba, gdse'ye hoş geldiniz. Çok az düzenleme yaptım, etiketleri çok başlıklı sorulara yerleştirmeyi sevmiyoruz. (Özellikle etiketlerde aynı etiketi kullandığınızda :)). Ve sorunuza. Sabit boru hattı mı yoksa kendi gölgelendiricilerinizi mi kullanıyorsunuz?
Notabene

Düzenleme için teşekkürler. "Sabit boru hattı" anlamından emin değilim ama her tepe noktasını elle inşa ediyorum ve herhangi bir gölgelendirici kullanmıyorum. Bu önemliyse, okul ödevi için olduğu gibi openGL'nin son sürümünü kullanmıyorum (bence openGL 3).
megamoustache

Resmi sorunuza ekleyebilmeniz harika olurdu. Orijinal konumundan kayboldu.
VEYA Haritacı

Yanıtlar:


19

Belirttiğiniz her şeye ek olarak (alfa kanallı dokular, duvar + pencere çizmeden önce manzara çizme), iki şey daha yapmanız gerekir.

İlk olarak, OpenGL'nin karıştırma işlevini etkinleştirmeniz gerekir:

glEnable(GL_BLEND);

İkincisi, OpenGL'ye karışımlı piksellerin renklerini nasıl hesaplayacağınızı söylemeniz gerekir (OpenGL bu arada "fragmanlar" olarak adlandırılır). Bu durumda, böyle basit bir şeyle iyi olacaksınız:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Karıştırma açıldığında, OpenGL piksel renklerini glBlendFunc içinde verdiğiniz işlev parametrelerine göre birleştirir. Özellikle, "source.color * source.alpha + destination.color * (1-source.alpha)" yapacaktır, burada "source" şu anda oluşturduğunuz doku ve "destination" zaten framebuffer (manzara). Böylece alfa kanalınız beyaz olduğunda, duvar rengini alırsınız ve alfa kanalı siyah olduğunda, manzara rengini alırsınız. Alfa kanalı griyse, iki renk arasında bir miktar solmaya başlarsınız.

Pencereniz tamamen şeffafsa, bunu yapmanın başka yolları da vardır, burada iki çokgen çizme sırası önemli değildir, ancak bu alfa eşikleri gibi daha gelişmiş kavramlara girmeye başlar. Muhtemelen mevcut durumunuz için gerekli değildir.

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.