Первое, что напомнили мне ваши примеры изображений, это проблема «буфера глубины и полупрозрачных поверхностей».
В 3D-игре вы должны сортировать ваши полупрозрачные поверхности сзади-спереди и рисовать только ихпосле рендеринга остальной части вашей сцены - все с включенным углубленным чтением и письмом.Если вы этого не сделаете, у вас получится изображение 3 rd , когда вы обычно хотите, чтобы ваше изображение 2 nd было прозрачным поверх стекла того, что находится за ним.
Но вы хотите изображение 3 rd - с некоторыми прозрачными поверхностями, скрывающими другие - так что вы можете просто сознательно вызвать эту проблему глубины!
Для этого вам нужно включить чтение и запись глубины и установить функцию глубины так, чтобы второй спрайт, нарисованный на глубине такой же , как ранее нарисованный спрайт, не рендерился.
Для достиженияв XNA 4.0 вам нужно передать SpriteBatch.Begin
DepthStencilState
с DepthBufferFunction
, установленным на CompareFunction.Less
(по умолчанию оно меньше или равно) и DepthBufferEnable
и DepthBufferWriteEnable
установлено в true.
Могут быть взаимодействия с параметром layerDepth
спрайта (я не могу вспомнить, как он отображается на глубину по умолчанию).
Вы можете такженеобходимо использовать BasicEffect
в качестве шейдера для пакета спрайтов - в частности, чтобы вы могли установить проектионная матрица с соответствующими ближними и дальними плоскостями. Эта статья объясняет, как это сделать.И вам также может потребоваться очистить буфер глубины перед раздачей.
Наконец, вам нужно нарисовать свои спрайты в правильном порядке - сначала с необработанным спрайтом.
Я не полностью уверен, что это будет работать и будет ли это работать надежно (возможно, у вас возникнет какая-то проблема глубокой борьбы, я не уверен).Но я думаю, что стоит попробовать, учитывая, что вы можете оставить свой код рендеринга практически нормальным и просто настроить состояние рендеринга.