动态创建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
来获得想要的结果。
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计算其中的值。