Prostą odpowiedzią jest to, że zmieniasz je między każdym losowaniem. Ustaw moduł cieniujący, narysuj czajnik, ustaw inny moduł cieniujący, narysuj kolejny czajnik.
W przypadku bardziej skomplikowanych rzeczy, w których musisz zastosować wiele modułów cieniujących tylko do jednego obiektu, takich jak rozmycie, poświata i tak dalej. Zasadniczo masz wszystko renderowane do tekstur. Następnie renderujesz quad na całym ekranie z zastosowaną teksturą, używając innego modułu cieniującego.
Na przykład, jeśli chcesz wyrenderować efekt blasku, najpierw musisz wyrenderować swoją zwykłą scenę bez jarzenia, a następnie wyrenderować tylko kolorową sylwetkę rzeczy, które chcesz rozjaśnić na teksturze, a następnie przełączyć na moduł cieniowania rozmycia i renderować quad z tą teksturą przyczepioną do twojej nie świecącej sceny.
Istnieje inna technika zwana Odroczonym cieniowaniem, w której renderujesz scenę bez oświetlenia i stosujesz ją później w przestrzeni ekranu. Podstawowym celem jest zmniejszenie kosztów oświetlenia na piksel.
Zwykle renderowany jest bufor kolorów, który jest wyświetlany na ekranie. Z odroczonym cieniowaniem zamiast tego renderujesz bufor kolorów, a także bufor normalny i bufor głębokości w jednym przejściu cieniowania (możesz przechowywać normalne wektory i głębokość w teksturze, tak jak w przypadku mapowania normalnego i wysokości).
Oznacza to, że dla każdego piksela znasz położenie najbliższego kawałka nieprzezroczystej geometrii (głębokość lub odległość od oka) kolor i normalny. Z tego powodu możesz zastosować oświetlenie do każdego piksela na ekranie zamiast do każdego widocznego piksela każdego renderowanego obiektu. Pamiętaj, że jakiś obiekt zostanie narysowany nad innymi obiektami, jeśli scena nie będzie idealnie renderowana w kolejności od początku do końca.
W przypadku cieni faktycznie renderujesz bufor głębokości z punktu widzenia światła, a następnie korzystasz z informacji o głębokości, aby ustalić, gdzie uderza światło. Nazywa się to mapowaniem cieni (istnieje również inne podejście zwane objętościami cieni, które opracowuje sylwetkę geometrii i wytłacza ją, ale nadal będziesz używać shaderów).
W bardziej nowoczesnym OpenGL (3.0+) używasz obiektu Framebuffer z dołączonymi obiektami Renderbuffers. Ponieważ bufory renderujące można traktować jak teksturę. Możesz robić rzeczy, takie jak renderowanie 1 modułu cieniującego do wielu różnych buforów renderowania (więc nie musisz renderować tekstury, a następnie normalnych, a następnie składników blasku), ale podstawowa praktyka pozostaje taka sama.
Pożądane jest również zminimalizowanie jak największej liczby przełączników shaderów, aby zaoszczędzić na kosztach ogólnych. Dlatego niektóre silniki grupują wszystko razem z tym samym materiałem, aby można było wszystkie rysować jednocześnie.