Texture2D становится черным - PullRequest
3 голосов
/ 28 ноября 2011

У меня есть Texture2D, который я загружаю из конвейера содержимого.Это работает нормально, но как только я пытаюсь использовать SetData на совершенно другом Texture2D, все текстуры в моей игре становятся полностью черными:

Normal

Black

Это мой класс HUDMeter, класс, которым я хочу быть просто красным

Texture2D colorGrad = Content.Load<Texture2D>(GradientAsset);

Color[,] pixels = new Color[colorGrad.Width, colorGrad.Height];

Color[] pixels1D = new Color[colorGrad.Width * colorGrad.Height];

pixels = GetRedChannel(colorGrad);

pixels1D = Color2DToColor1D(pixels, colorGrad.Width);

System.Diagnostics.Debug.WriteLine(pixels[32,32]);
Gradient = colorGrad;
Gradient.SetData<Color>(pixels1D);

Они используют учебник Riemers

protected Color[,] GetRedChannel(Texture2D texture)
{
    Color[,] pixels = TextureTo2DArray(texture);

    Color[,] output = new Color[texture.Width, texture.Height];

    for (int x = 0; x < texture.Width; x++)
    {
        for (int y = 0; y < texture.Height; y++)
        {
            output[x,y] = new Color(pixels[x,y].G, 0, 0);
        }
    }

    return output;
}

protected Color[,] TextureTo2DArray(Texture2D texture)
{
    Color[] colors1D = new Color[texture.Width * texture.Height];
    texture.GetData(colors1D);

    Color[,] colors2D = new Color[texture.Width, texture.Height];
    for (int x = 0; x < texture.Width; x++)
        for (int y = 0; y < texture.Height; y++)
            colors2D[x, y] = colors1D[x + y * texture.Width];

    return colors2D;
}

private Color[] Color2DToColor1D (Color[,] colors, int width)
{
    Color[] output = new Color[colors.Length];

    for (int x = 0; x < width; x++)
    {
        for (int y = 0; y < colors.Length / width; y++)
        {
            output[x + y * width] = colors[x % width, y % (colors.Length/width)];
        }
    }

    return output;
}

И воткод для рисования спрайтов, это отлично работает, и я всегда рисую спрайты:

batch.Draw(meter.Gradient, new Vector2(X, Y), Color.White);

Обновление:

Я обнаружил, что спрайты не используют один и тот же файлне черныеФактически ли Texture2D.SetData <> () изменяет сам файл?какая польза от этого?

Обновление:

Я только что попытался использовать Альфу, а также RGB, и он работает.Я думаю, что с одним из методов преобразования что-то не так.

1 Ответ

2 голосов
/ 29 ноября 2011

Если вы сделаете это:

Texture2D textureA = Content.Load<Texture2D>("MyTexture");
Texture2D textureB = Content.Load<Texture2D>("MyTexture");

И textureA, и textureB относятся к одному и тому же объекту. Поэтому, если вы позвоните SetData одному из них, это повлияет на них обоих. Это связано с тем, что ContentManager сохраняет внутренний список уже загруженных ресурсов, поэтому нет необходимости постоянно перезагружать тот же ресурс.

Решением будет создание нового Texture2D объекта того же размера, вызов GetData для объекта, загруженного ContentManager, а затем SetData для новой текстуры.

Пример (не тестировался):

Color[] buffer = new Color[textureA.Width * textureA.Height];
Texture2D textureB = new Texture2D(textureA.GraphicsDevice,
                                   textureA.Width,
                                   textureA.Height);
textureA.GetData(buffer);
textureB.SetData(buffer);

Dispose() новой текстуры, когда вы закончите с ней (например: в вашем Game.UnloadContent методе). Но никогда не выбрасывайте тот, который загружен ContentManager (потому что, как я уже сказал, это общий объект; вместо него используйте ContentManager.Unload).

...