Согласно этой теме , есть несколько способов сделать это:
- Использование
GraphicsDevice.SetGammaRamp(...)
- Использование черной текстуры и альфа-прозрачности
- Настройка материалов и / или источников света на текстурах для всех объектов в сцене
- Перепиксельный пересчет цвета с использованием пиксельного шейдера
Первый вариант является самым простым, но имеет некоторые недостатки (уродливые графические эффекты, когда вы его настраиваете - в основном это только меню опций), и не всегда поддерживается.
Вы можете использовать SupportsFullScreenGamma
и CanCalibrateGamma
, чтобы определить, поддерживается ли он, и использовать другой метод, если это не так.
Редактировать
В Windows Phone 7 некоторые из этих параметров могут быть недоступны .
Этот сайт (в настоящее время не работает, но, если вы воспользуетесь им в Google, вы сможете найти кэшированную копию), вы предлагаете использовать полноэкранный четырехъядерный подход с альфа-смешиванием в следующих режимах смешивания:
Brightness: source = ZERO, dest = SOURCECOLOR
Contrast: source = DESTCOLOR, dest = SOURCECOLOR
Вот код (украденный из этой статьи):
// In your game class:
Texture2D whiteTexture;
// In LoadContent:
whiteTexture = new Texture2D(GraphicsDevice, 1, 1);
whiteTexture.SetData<Color>(new Color[] { Color.White });
// In the appropriate class (the game class? not sure...):
int brightness;
int contrast;
BlendState brightnessBlend;
BlendState contrastBlend;
// In Initialize:
brightness = 255;
contrast = 128;
brightnessBlend = new BlendState();
brightnessBlend.ColorSourceBlend = brightnessBlend.AlphaSourceBlend = Blend.Zero;
brightnessBlend.ColorDestinationBlend = brightnessBlend.AlphaDestinationBlend = Blend.SourceColor;
contrastBlend = new BlendState();
contrastBlend.ColorSourceBlend = contrastBlend.AlphaSourceBlend = Blend.DestinationColor;
contrastBlend.ColorDestinationBlend = contrastBlend.AlphaDestinationBlend = Blend.SourceColor;
// In Draw:
spriteBatch.Begin(SpriteSortMode.Immediate, brightnessBlend);
spriteBatch.Draw(whiteTexture, new Rectangle(0, 0, 480, 800), new Color (brightness, brightness, brightness, 255));
spriteBatch.End();
spriteBatch.Begin(SpriteSortMode.Immediate, contrastBlend);
spriteBatch.Draw(whiteTexture, new Rectangle(0, 0, 480, 800), new Color(contrast, contrast, contrast, 255));
spriteBatch.End();
GraphicsDevice.BlendState = BlendState.Opaque;