Динамическое создание Texture2D - PullRequest
2 голосов
/ 15 февраля 2012

Я хотел создать полупрозрачный оверлей для своего экрана и решил динамически создать пользовательский объект Texture2D, используя следующий код:

const int TEX_WIDTH = 640;
const int TEX_HEIGHT = 480
Texture2D redScreen;

void GenerateTextures(GraphicsDevice device)
{
    redScreen = new Texture2D(device, TEX_WIDTH, TEX_HEIGHT);
    uint[] red = new uint[TEX_WIDTH * TEX_HEIGHT];
    for (int i = 0; i < TEX_WIDTH * TEX_HEIGHT; i++)
        red[i] = 0x1A0000ff;
    redScreen.SetData<uint>(red);
}

И, похоже, он не работает какожидается!Глядя на этот код, я ожидаю, что значение альфа будет около 10%.(0x1A / 0xFF = ~ 10)

но в итоге получается гораздо больше.Мне кажется, что uint представляет значение ARGB, но значение прозрачности никогда не будет таким, каким я его установил.это либо «несколько прозрачно», либо совсем не прозрачно.

Я не люблю задавать смутные вопросы, Но что я делаю не так?что не так с этим фрагментом кода?

Редактировать: В конце концов, я мог получить желаемые результаты только установив BlendState.NonPremultiplied в вызове spriteBatch.Begin().

Ответы [ 2 ]

3 голосов
/ 15 февраля 2012

XNA по умолчанию использует предварительно умноженную альфу, поэтому вы должны умножить все значения цвета на альфа-значение. Также есть цветовая структура , которая может показаться вам удобной. Поэтому я предлагаю ниже. Альфа должна быть от 0 до 1 включительно.

const int TEX_WIDTH = 640;
const int TEX_HEIGHT = 480
Texture2D redScreen;

void GenerateTextures(GraphicsDevice device)
{
    redScreen = new Texture2D(device, TEX_WIDTH, TEX_HEIGHT);
    uint[] red = new uint[TEX_WIDTH * TEX_HEIGHT];
    for (int i = 0; i < TEX_WIDTH * TEX_HEIGHT; i++)
        red[i] = new Color(255, 0, 0) * Alpha;
    redScreen.SetData<uint>(red);
}
3 голосов
/ 15 февраля 2012

Я не вижу, чтобы вы указали формат поверхности / пикселя. Вы уверены, что каждый пиксель - это уинт?

Чтобы быть уверенным, создайте текстуру с указанным макетом, а затем рассчитайте значение в ней для заданных R, G, B и A.

...