Birden çok gölgelendirici kullanma


53

Şu anda opengl shader'ları inceliyorum ama bir şey bulamıyorum: nesnelere farklı gölgelendiricilerin nasıl uygulanacağını, örneğin, toon shader kullanılarak oluşturulmuş bir demlik ve aynı sahnede çok yansıtıcı bir yüzey kullanarak ve diğerlerinden çarpıtılmış bir diğeri kullanarak Bu videodaki gibi bir gürültü fonksiyonu

http://www.youtube.com/watch?v=1ogg4ZfdBqU

Bir diğeri, sahnede bir çiçek gölgelendiricisi ve daha sonra bir hareket bulanıklığı gölgelendiricisi uyguluyor. Sadece bir köşe gölgelendiriciye ve bir parça gölgelendiriciye sahipken bu etkiler nasıl elde edilir? Birden fazla gölgelendirici programı kullanmak gibi bir püf noktası var mı?


Nathan ve David'in iyi cevapları, işte bu yüzden terim geçişini veya gölgelendirici geçişini görürsünüz ; Son görüntüyü / kareyi oluşturmak için gereken çoklu geçişler var. GPU işlemenin bu kadar paralel hale gelmesinin ve bu kadar hızlı olmasının sebeplerinden biri, kare başına çoklu geçişlere ihtiyaç duyulmasıdır. Quake II veya Half Life yazılımı oluşturucularına geri dönerek, ne kadar çok aşk gölgelendiricinin tüm 3D grafik deneyimine katılacağını hatırlatmak için kendinize hatırlatın.
Mühendis

Yanıtlar:


59

Basit cevap, onları her çağrı araması arasında değiştirmektir. Bir gölgelendirici ayarlayın, bir çaydanlık çizin, başka bir gölgelendirici ayarlayın, başka bir çaydanlık çizin.

Bulanıklaştırma, ışıma vb. Gibi tek bir nesneye birden fazla gölgelendirici uygulamanız gereken daha karmaşık şeyler için. Temel olarak doku (lara) dönüştürülmüş her şeye sahipsin. Ardından, başka bir gölgelendirici kullanırken, uygulanmış dokuyla tüm ekranınızda bir dörtgen yaratırsınız.

Örneğin, bir parlama efekti oluşturmak istiyorsanız, önce normal olarak parlamayan sahnenizi ve ardından bir doku üzerinde parlamak istediğiniz öğelerin yalnızca renkli siluetini oluşturup ardından bir bulanıklık gölgelendiricisine geçin ve parlamayan sahnenizin üzerine tutturulmuş o doku ile dörtlü.

Sahneyi aydınlatma olmadan yaptığınız ve daha sonra ekran boşluğuna uyguladığınız Erteleme gölgeleme adı verilen başka bir teknik var . Temel amaç, piksel aydınlatma başına masrafı azaltmaktır.

Normalde, ekrana yerleştirilmiş bir renk arabelleği oluşturursunuz. Ertelenmiş gölgelemeyle bunun yerine bir renk tamponunun yanı sıra bir gölgelendirici geçidinde normal ve derinlik tamponunu da oluşturursunuz (normal vektörleri ve derinliği normal ve yükseklik eşlemesinde olduğu gibi bir dokuda saklayabilirsiniz).

Bu, her piksel için saydam olmayan geometrinin en yakın parçasının (gözle derinlik veya mesafe) rengini ve normalini bildiğiniz anlamına gelir. Bu nedenle, oluşturduğunuz her nesnenin görünen pikseline değil, ekrandaki her piksele ışık uygulayabilirsiniz. Sahne önden arkaya tam olarak gösterilemiyorsa, bazı nesnelerin diğer nesnelerin üzerine çizileceğini unutmayın.

Gölgeler için, sadece derinlik tamponunu ışığın bakış açısından oluşturursunuz, daha sonra ışığın çarptığı yeri bulmak için bu derinlik bilgisini kullanırsınız. Buna gölge haritalama denir (geometri silüeti oluşturan ve onu sıkıştıran gölge hacimleri adı verilen başka bir yaklaşım daha vardır, ancak yine de gölgelendiriciler kullanacaksınız.).

Daha modern OpenGL (3.0+) ile, eklenmiş Renderbuffers Nesnelerini içeren bir Framebuffer Nesnesi kullanırsınız . Oluşturucular bu yana bir doku gibi muamele edilebilir. Birden fazla farklı renderleyiciye 1 gölgelendiricinin renderlenmesi gibi şeyler yapabilirsiniz (bu nedenle dokunuzu daha sonra normallerinizden sonra parıldayan bileşenlere dönüştürmeniz gerekmez ) ancak temel uygulama hala aynıdır.

Ayrıca, genel giderlerden tasarruf etmek için gölgelendirici anahtarlarının sayısını olabildiğince en aza indirmek istenir. Böylece bazı motorlar her şeyi aynı malzemeyle birlikte gruplayacaktır, böylece hepsi bir kerede çizilebilir.


16

Sadece bir gölgelendiriciyi bağlar, o gölgelendiriciyi kullanarak tüm nesneleri işler, sonra bir sonraki gölgelendiriciyi bağlar, onu kullanarak nesneyi oluşturur, vb.

İstediğiniz sayıda gölgelendirici nesnesine (belleğe yüklenen ve derlenen gölgelendiriciler) sahip olabilir; bir seferde sadece bir tane bağlanabilir (aktif).


5
Uygulama açısından, her karede gölgeleri değiştirmek için glUseProgram (1) ve glUseProgram (2) kullanıyorum. Performans için bu ne kadar maliyetli?
ibrabeicker

4
Önemsiz bir maliyet (son GPU'larda öncekilerden daha az olmasına rağmen). Bu yüzden çoğu insan nesnelerini malzemeye göre sıralar ve tüm nesneleri aynı malzemeyle birlikte oluşturur. Ancak, programları daha fazla olmasa da, her kare için onlarca yüzlerce kez değiştirmeyi göze alabilirsiniz.
Nathan Reed

9

Bir sahnede birden fazla gölgelendirici kullanmak oldukça basittir; gölgelendiriciyi değiştirin, değerlerini ayarlayın, ardından nesneyi işleyin.

Bununla birlikte, gölgelendiricilerin değiştirilmesinin maliyeti yüksek olabileceğinden, gölgelendiricinin değiştirilmesinin minimum düzeyde tutulması gerekir. İstediğiniz tüm efektleri elde ederken bu etkiyi azaltmanın birkaç yolu vardır.

İlk yöntem ve genellikle en çok istenen, tüm gölgelendirici teknikleriniz için işlevselliği yalnızca bir gölgelendiriciye eklemek ve her nesneyi aynı gölgelendiriciyle farklı bir şekilde oluşturmak için belirlediğiniz koşulları kullanmaktır. OpenGL ve GLSL gölgelendiricileri bilmiyorum ama HLSL gölgelendiricileri ve DirectX ile bunlar bir "teknik" olarak gruplandırılabilir ve gölgelendiriciyi değiştirmek yerine tekniği ayarlayabilirsiniz. Bu, aslında aynı dosyada birkaç farklı piksel ve köşe gölgelendiricisine sahip olmanızı sağlar.

Performans etkisini azaltmanın ikinci yolu, gölgelendiriciyi ayarlamak, bu gölgelendiriciyi kullanan her nesneyi oluşturmak ve sonra tekrar etmektir. Başka bir deyişle, oluşturduğunuz işlemi toplu halde yapın.

Aynı nesneye iki farklı efekt uygulamak istiyorsanız (örneğin, bir tonlama gölgesi sonra bir tonlama söyle) uygulayın, bunu iki farklı şekilde yapabilirsiniz. Birincisi, aynı fonksiyonda birden fazla efekt uygulayan bir gölgelendirici yazmaktır. İkinci yol, modeli her gölgelendiriciyle bir kez oluşturmak ve sonuçları farklı karışım seçenekleri ayarlayarak karıştırmaktır. Ancak, bu çok daha fazla iş ve her koşulda mümkün değil. Bu nedenle en iyi seçenek, tüm efektlerinizi tek bir gölgelendiricide birleştirmektir.


7

Keşfettiğim bir başka yol da, her bir gölgelendirici tipinin bir fonksiyonda tanımlandığı glsl alt rutinleri denilen bir şeydir ve OpenGL uygulamasında mevcut alt rutini tanımlayabilir, bir tamponun tepe noktasını çizebilir, alt rutini değiştirebilir ve başka bir arabellek oluşturmak


4
Bu, DX11 sınıfı bir donanım olan GL 4.x özellikli bir donanım gerektirir.
Nicol Bolas,
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.