动态创建Texture2D

时间:2012-02-14 21:37:39

标签: c# image xna textures

我想为我的屏幕创建一个半透明的叠加层,并决定使用以下代码动态创建自定义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);
}

它似乎没有按预期工作!看看这段代码,我预计alpha值约为10%。 (0x1A / 0xFF = ~10)

但它最终远不止于此。 在我看来,uint表示ARGB值,但透明度值绝不是我设置的值。它要么“有些透明”,要么根本不透明。

我不喜欢问模糊的问题,
但是我做错了什么? 这段代码片段出了什么问题?

修改 最后,我只能通过在BlendState.NonPremultiplied来电中设置spriteBatch.Begin()来获得所需结果。

2 个答案:

答案 0 :(得分:3)

我没有看到你指定表面/像素格式。你确定每个像素都是一个uint吗?

确定,创建具有指定布局的纹理,然后计算给定R,G,B和A的值。

答案 1 :(得分:3)

默认情况下,XNA使用预乘的alpha,因此您必须将所有颜色值乘以Alpha值。您还可以找到方便的color struct。所以我建议如下。 Alpha应介于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);
}