Ну, во-первых, у вас есть код XNA для XNA 3.1, и он неправильный . В этом блоге объясняется, как это сделать для XNA 3.1 и 4.0 (API меняет между).
В XNA 3.1 при использовании SpriteSortMode.Immediate
, SpriteBatch
будет устанавливать свои шейдеры и другое состояние устройства в вызове Begin
, а не в вызове End
. Это дает вам возможность заменить части состояния устройства до того, как на самом деле происходит рисование (в Draw
или End
, в зависимости от того, когда оно мигает). И затем вы должны End
ваш эффект после вас End
пакета спрайтов (так что сначала все отрисовывается).
Теперь, в DirectX, я бы предположил, что виноват тот же неправильный порядок ваших вызовов End
. В частности, обратитесь к этой части документации для второго параметра ID3DXEffect::Begin
определяет, сохраняется ли состояние, измененное эффектом, и восстанавливается. Значение по умолчанию 0 указывает, что ID3DXEffect :: Begin и ID3DXEffect :: End будут сохранять и восстанавливать все состояния, измененные эффектом
В результате, когда вы End
получаете эффект, он сбрасывает устройство обратно к обычному рисованию спрайтов, прежде чем вы вызовете End
на ID3DXSprite
, что фактически и отправляет ваш пакет спрайтов. нарисован.
Я думаю, причина того, что ваш неправильно упорядоченный код работает на XNA, в том, что XNA, вероятно, делает эквивалент передачи D3DXFX_DONOTSAVESTATE
, когда начинается эффект, под капотом.