XNA SpriteBatch и BasicEffect несовместимы?

Я хотел бы управлять окружающим освещением для 2D-графики SpriteBatch, визуализируемой в глобальном масштабе. Я понимаю, что могу сделать это, смешав цвет, переданный в SpriteBatch.Draw, но я бы предпочел сделать это глобально.

Шейдер BasicEffect управляет освещением в стиле конвейера фиксированной функции в XNA для простых сцен.

Шейдер BasicEffect и шейдер SpriteBatch несовместимы? У кого-нибудь получилось, чтобы они работали вместе?


person Rob    schedule 24.07.2009    source источник


Ответы (4)


Да, они несовместимы.

Это связано с тем, что пакет спрайтов использует свой собственный вершинный шейдер для выполнения четырехъядерного рендеринга. Вы можете использовать свой собственный пиксельный шейдер, и на образовательном сайте клуба создателей xna есть образец, который показывает, как использовать пользовательские эффекты пиксельного шейдера с пакетом спрайтов.

person Joel Martinez    schedule 09.12.2009

Это не прямой ответ на ваш вопрос, но может быть вам полезен. Объекты BasicEffect и SpriteBatch — это просто шейдеры, которые команда XNA включила в выпуск.

Исходный код этих шейдеров доступен для просмотра/изменения по вашему вкусу. Создание собственных шейдеров не позволит вам постоянно сталкиваться с препятствиями.

Здесь вы можете найти дополнительную информацию и исходный код: blogs.msdn.com

person bufferz    schedule 25.07.2009
comment
Отличная ссылка! Я не знал, что MS выпустила исходный код. - person tooshel; 08.10.2011

У меня тоже была эта проблема, и «они несовместимы» неправильно. SpriteBatch изменяет такие вещи, как «DepthStencilState» и «BlendState» на графическом устройстве. Чтобы исправить это, добавьте это после spriteBatch.End.

GraphicsDevice.DepthStencilState = DepthStencilState.Default;

spriteBatch изменяет DepthStencilState на None, поэтому 3D-объекты отображаются неправильно. Изменяются и другие свойства. Проверьте это:

GraphicsDevice.BlendState = BlendState.Opaque;
GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap;
person tooshel    schedule 10.10.2011

Насколько мне известно, пакет спрайтов использует свой собственный внутренний эффект при рендеринге своих квадроциклов на экран, поскольку вы можете отображать только один эффект за раз, мой ответ будет отрицательным, они не совместимы.

person Sekhat    schedule 30.10.2009