我想为我的屏幕创建一个半透明的覆盖,并决定使用以下代码动态创建一个自定义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来获得想要的结果。
发布于 2012-02-14 22:05:44
默认情况下,XNA使用预乘alpha,因此必须将所有颜色值乘以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);
}发布于 2012-02-14 21:54:29
我没有看到你指定表面/像素格式。你确定每个像素都是一个uint吗?
可以肯定的是,创建一个具有指定布局的纹理,然后计算给定R、G、B和A在其中的值。
https://stackoverflow.com/questions/9284532
复制相似问题