gpt4 book ai didi

c# - Texture2D 变黑

转载 作者:行者123 更新时间:2023-11-30 17:14:59 28 4
gpt4 key购买 nike

我有一个从内容管道加载的 Texture2D。这工作正常,但一旦我尝试在完全不同的 Texture2D 上使用 SetData,我游戏中的所有纹理就会完全变黑:

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;
}

下面是绘制 Sprite 的代码,效果很好,我总是这样绘制 Sprite :

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

更新:

我实际上发现不使用相同文件的 Sprite 不是黑色的。 Texture2D.SetData<>() 实际上会更改文件本身吗?那有什么用呢?

更新:

我刚刚尝试使用 Alpha 和 RGB,并且效果很好。我认为其中一种转换方法有问题。

最佳答案

如果你这样做:

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

textureAtextureB 指的是同一个对象。因此,如果您对其中一个调用 SetData,它将影响它们两个。这是因为 ContentManager 保留了一个已加载资源的内部列表,因此它不必不断重新加载相同的资源。

解决方案是创建一个新的相同大小的 Texture2D 对象,在 ContentManager 加载的对象上调用 GetData,然后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)。

关于c# - Texture2D 变黑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8295575/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com