Tak jak napisał Lord, żeby narysować wszystkie obiekty, tilesety, itp. musisz po prostu ręcznie wywołać ich metody rysujące i renderować wszystko po kolei do surface. Dlatego sugeruję znacznie prostszy sposób:
Ustawiasz tło rooma na jednolity kolor, którego nie będziesz używał w grze, np. krzyczący fiolet.
Grafikę tła tak jak teraz renderujesz do tekstury, którą przekazujesz do shadera.
Rysujesz application_surface z shaderem.
W shaderze sprawdzasz, czy kolor piksela = kolor tła ustawionego w roomie.
Jeśli tak, rysujesz Twoje tło (przekazane w teksturze) z ambientem.
Jeśli nie, rysujesz tak jak dotychczas, czyli podstawowa tekstura z ambientem i światłami.
Tutaj masz zmodyfikowany projekt. Oczywiście wadą takiego rozwiązania jest fakt, że musisz się pilnować, żeby w swoich grafikach nie użyć nigdzie koloru tła, bo wytnie Ci tam dziurę.