Я использую SharpDX Toolkit и пытаюсь программно создать Texture2D, поэтому я могу вручную указать все значения пикселей. И я не уверен, в каком формате пикселей его создавать.
SharpDX даже не документирует тип PixelFormat инструментария (у них есть документация для другого класса PixelFormat но это для WIC, а не для инструментария). Я нашел перечисление DirectX, которое оно обертывает, DXGI_FORMAT, но его документация не дает никаких полезных указаний о том, как выбрать формат.
Я привык к старым 32-битным форматам растровых изображений с 8 битами на цветовой канал плюс 8-битный альфа-канал, что для меня вполне достаточно. Поэтому я предполагаю, что самым простым выбором будет R8G8B8A8 или B8G8R8A8. Имеет значение, что я выберу? Будут ли они оба полностью поддерживаться на всем оборудовании?
И даже после того, как я выбрал один из них, мне нужно дополнительно указать, является ли он SInt, SNorm, Typeless, UInt, UNorm или UNormSRgb. Мне не нужно цветовое пространство sRGB. Я не понимаю, для чего должен быть Typeless. UInt кажется самым простым - просто старый беззнаковый байт, но оказывается, что он не работает; Я не получаю сообщения об ошибке, но моя текстура ничего не выводит на экран. UNorm работает, но в документации нет ничего, что объясняло бы, почему UInt не работает. Так что теперь я параноик, что UNorm может не работать на какой-то другой видеокарте.
Вот код, который у меня есть, если кто-то хочет его увидеть. Загрузите полный пакет SharpDX, откройте проект SharpDXToolkitSamples, перейдите в проект SpriteBatchAndFont.WinRTXaml, откройте класс SpriteBatchAndFontGame и добавьте указанный код:
// Add new field to the class:
private Texture2D _newTexture;
// Add at the end of the LoadContent method:
_newTexture = Texture2D.New(GraphicsDevice, 8, 8, PixelFormat.R8G8B8A8.UNorm);
var colorData = new Color[_newTexture.Width*_newTexture.Height];
_newTexture.GetData(colorData);
for (var i = 0; i < colorData.Length; ++i)
colorData[i] = (i%3 == 0) ? Color.Red : Color.Transparent;
_newTexture.SetData(colorData);
// Add inside the Draw method, just before the call to spriteBatch.End():
spriteBatch.Draw(_newTexture, new Vector2(0, 0), Color.White);
Это рисует небольшой прямоугольник с диагональными линиями в верхнем левом углу экрана. Он работает на ноутбуке, на котором я его тестирую, но я понятия не имею, означает ли это, что он будет работать везде, и я не знаю, будет ли он наиболее производительным.
Какой формат пикселей мне следует использовать, чтобы убедиться, что мое приложение будет работать на любом оборудовании и обеспечить максимальную производительность?