А) правильный ответ. Рендеринг в тот же буфер во время чтения из него не определен. Это может сработать, а может и нет - именно это и происходит.
В случае OpenGL, расширение framebuffer_object имеет раздел «4.4.3 Рендеринг, когда изображение связанного объекта текстуры также присоединено к кадровому буферу», в котором говорится о том, что происходит (в основном, не определено). В Direct3D9 среда выполнения отладки громко жалуется, если вы используете эту настройку (но она может работать в зависимости от оборудования / драйвера). В D3D10 среда выполнения всегда связывает цель, которая используется в качестве пункта назначения, я думаю.
Почему это не определено? Одна из причин, по которой графические процессоры так быстры, заключается в том, что они могут делать множество предположений. Например, они могут предположить, что единицам, которые выбирают пиксели, не нужно связываться с единицами, которые пишут пиксели. Таким образом, поверхность может быть прочитана, N циклов позже, чтение завершено, N циклов позже, пиксельный шейдер завершает свое выполнение, затем он помещает его в несколько выходных буферов слияния на GPU и, наконец, в какой-то момент он записывается в память. Кроме того, графические процессоры растеризуются в «неопределенном» порядке (один графический процессор может растеризоваться в строках, другой - в некотором порядке, удобном для кэширования, другой - в совершенно другом порядке), поэтому вы не знаете, какие части поверхности будут записаны к первому.
Итак, вам нужно создать несколько буферов. В случае размытия / свечения обычно достаточно двух - рендеринг в первый, затем чтение и размытие во время записи во вторую. Повторите этот процесс, если это необходимо, способом пинг-понга.