首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态创建Texture2D

动态创建Texture2D
EN

Stack Overflow用户
提问于 2012-02-14 21:37:39
回答 2查看 3.4K关注 0票数 2

我想为我的屏幕创建一个半透明的覆盖,并决定使用以下代码动态创建一个自定义Texture2D对象:

代码语言:javascript
复制
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来获得想要的结果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-14 22:05:44

默认情况下,XNA使用预乘alpha,因此必须将所有颜色值乘以alpha值。还有一个颜色结构,您可能会发现它很方便。所以我建议如下。阿尔法应该介于0和1之间。

代码语言:javascript
复制
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);
}
票数 3
EN

Stack Overflow用户

发布于 2012-02-14 21:54:29

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9284532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档