动态创建Texture2D

本文关键字:Texture2D 创建 动态 | 更新日期: 2023-09-27 18:24:28

我想为屏幕创建一个半透明的覆盖层,并决定使用以下代码动态创建一个自定义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值,但透明度值从来不是我设定的值。它要么"有点透明",要么根本不透明。

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

编辑:最后,我只能通过在spriteBatch.Begin()调用中设置BlendState.NonPremultiplied来获得想要的结果。

动态创建Texture2D

XNA默认情况下使用预先相乘的alpha,因此您必须将所有颜色值乘以alpha值。还有一个颜色结构,你可能会觉得很方便。所以我建议如下。Alpha应介于0和1之间(包括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);
}

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

可以肯定的是,创建一个具有指定布局的纹理,然后为给定的R、G、B和a计算其中的值。