Поскольку мои знания о шейдерах Directx ограничены (я не касался Direct X в течение 2 лет), я могу привести только пример того, как я бы реализовал это в opengl.
Я бы настроил 3текстуры.Первое - это фоновое изображение, второе - это изображение на переднем плане (то, в которое будут вставлены отверстия), а третье - это изображение маски, которое имеет только два цвета (черный и белый).Затем я бы нарисовал фоновое изображение с первым проходом в качестве полноэкранного четырехугольника.Затем я бы нарисовал еще один полноэкранный квад с двумя оставшимися текстурами (изображение на переднем плане + маска).
В пиксельных шейдерах opengl есть команда discard, которая позволяет вам отбрасывать пиксель.Все, что вам нужно сделать, это сэмплировать две текстуры во втором шейдере, и если пиксель маски белый, отбросить пиксель (таким образом раскрывая фон), а если он черный, отобразить пиксель текстуры (из изображения переднего плана).
После того, как цикл рендеринга завершен, нужно всего лишь изменить текстуру маски на стороне процессора, используя некоторый алгоритм, который постепенно делает все больше и больше текстуры маски белым.
Если шейдеры DirectX имеют что-то похожее на команду сброса, возможно, вы сможете заставить это работать.Надеюсь, это поможет.