Nintendo DS Homebrew中的Alpha混合精灵
时间:2020-03-05 18:38:50 来源:igfitidea点击:
我正在尝试使用devkitPro(包括libnds,libarm等)对Alpha精灵和背景进行Alpha混合。
有谁知道如何做到这一点?
解决方案
回答
自从我完成了GBA编程以来已经有很长时间了,但是我记得,DS支持GBA支持的大部分(如果不是全部的话)。此链接包含有关如何为GBA进行alpha混合的部分(第13.2节)。我不知道是否有特定于DS的方式,但这应该对我们有用。
回答
可以使用混合控制寄存器对DS上的Sprite进行Alpha混合。 TONC提供必要的信息,以便在主屏幕上进行混合,因为寄存器位置相同。子屏幕上的Alpha混合使用相同的过程,但以1000h的偏移量使用了不同的寄存器。
我们要查看的寄存器是主屏幕的REG_BLDMOD,REG_COLV和REG_COLY,子屏幕的是REG_BLDMOD_SUB,REG_COLV_SUB和REG_COLY_SUB。
还要记住,我们必须更改子画面的图形模式才能启用每个子画面的混合。
回答
作为一般参考,我曾经写过一个关于该问题的小博客条目。基本上,我们首先必须定义将哪个图层与其他哪个图层进行alpha混合。据我所知,
- 源层必须在目标层上才能显示某些混合。这意味着源层的优先级应在数值上低于目标层的优先级。
- 源层将是半透明的,目标层将是透明的(是的,我觉得这很混乱)。
对于精灵,具体来说,我们可以根据需要和"准备付款"的方式,通过3种方式实现alpha混合:
- 我们可以通过打开REG_BLDCNT [_SUB]中的BLEND_SRC_SPRITE来使所有精灵具有某种alpha混合效果。
- 我们可以使用" ATTR0_TYPE_BLENDED"有选择地打开某些精灵的混合。所有子画面(和图层)的混合级别将相同
- 位图类型的精灵使用直接颜色(绕过调色板),因此GBA精灵的" ATTR2_PALETTE()"字段是无用的,已被回收到" ATTR2_ALPHA"中。