Вы можете с помощью css position 2 (или более) полотна друг над другом и позволить каждому работать как слой.Я не уверен, как именно это сделать с помощью css, но я сделал нечто похожее, мне пришлось полотить поверх друг друга, один для 2d-контента и один для webgl, и пользователь мог легко переключаться между ними
<div height="640" style="position: absolute;">
<canvas width="640" style="position: absolute;visibility: hidden;" height="640" tabindex="1"></canvas>
<canvas width="640" height="640" style="visibility: hidden;position: absolute;"></canvas>
</div>
Я предполагаю, что код не является ни пулевым, ни правильным, но он работает.Надеюсь это поможет.
Если это не так, я бы использовал обходной путь, который вы упомянули.(На самом деле я создал такое приложение, в котором я рисовал 2d тени на неэкранном холсте и рисовал поверх основного холста с прозрачностью, выглядел довольно аккуратно)