【问题标题】:Weird striping in tile graphics on Nintendo DSNintendo DS 平铺图形中出现奇怪的条纹
【发布时间】:2010-11-02 21:30:10
【问题描述】:

我正在为 Nintendo DS 开发一款乒乓球游戏。我正在使用 libnds 进行设置,但遇到了一种非常奇怪的行为。到目前为止,我只在模拟器中尝试过,但我使用了三种不同的模拟器,它们都表现出这种行为,所以我怀疑我做错了什么。

实际的问题是,当我为平铺图形使用背景层 1 或更高层时,我会在该层上得到奇怪的条纹。如果我使用背景层 0,问题就消失了,但由于它是最后渲染的,我实际上无法在另一个层中绘制它,而我想要这样做。

我的设置代码:

void pong::setup_engine()
{
    // Setup DS graphics engine.
    // -------------------------
    videoSetMode(MODE_5_2D | DISPLAY_BG0_ACTIVE | DISPLAY_BG1_ACTIVE | DISPLAY_BG2_ACTIVE);
    vramSetBankA(VRAM_A_MAIN_BG_0x06000000);
    vramSetBankB(VRAM_B_MAIN_BG_0x06020000);

    u8 *tileMemory = reinterpret_cast<u8 *>(BG_TILE_RAM(1));
    u16 *mapMemory = reinterpret_cast<u16 *>(BG_MAP_RAM(0));

    int bg0 = bgInit(1, BgType_Text8bpp, BgSize_T_256x256, 0, 1);
    int bg1 = bgInit(2, BgType_Bmp16, BgSize_B16_256x256, 0, 0);
    //bgScroll(bg0, 256, 256);

    u16 *ptr = bgGetGfxPtr(bg1);
    for (int y = 10; y < 128*60; y++)
    {
        ptr[y] = 0xFFFF;
    }

    BG_PALETTE[1] = grey0;
    BG_PALETTE[2] = grey1;
    BG_PALETTE[3] = grey2;
    BG_PALETTE[4] = grey3;
    BG_PALETTE[5] = grey4;
    BG_PALETTE[6] = grey5;
    BG_PALETTE[7] = grey6;

    // 32 here is not 32 bytes but 32 half-words, which is 64 bytes.
    swiCopy(CORNER_TILE, tileMemory, 32);
    swiCopy(TOP_TILE, tileMemory + 64, 32);
    swiCopy(SIDE_TILE, tileMemory + (64 * 2), 32);
    swiCopy(MAIN_TILE, tileMemory + (64 * 3), 32);

    swiCopy(MAP, mapMemory, 32*24);
}

在上面的代码中,我将第 1 层用于 bg0,这是我的平铺图形层。这使得奇怪的条纹出现;如果我像这样将其更改为 0,它将按预期显示:

int bg0 = bgInit(0, BgType_Text8bpp, BgSize_T_256x256, 0, 1);

任何想法是什么导致了问题,解决方案是什么?

【问题讨论】:

  • 你能贴一张条带化的截图吗?
  • 当然,它来自一些稍微改动过的代码,但它或多或少与我第一次得到的相同。我的瓷砖不包含这些条纹。

标签: c++ arm nintendo-ds libnds


【解决方案1】:

对 background.h 的简要了解会使您看起来像是在使用 BG1 和 BG2。对于模式5,根据:

http://nocash.emubase.de/gbatek.htm

第 0 层和第 1 层是正常的,第 2 层和第 3 层是扩展的。我不知道扩展是什么意思。如果你只想做普通的瓷砖,你可能想要 bgInit 0 和 1 而不是 1 和 2。

您可以随意更改优先级,第 0 层不一定在 1 之上,等等。查看 BGxCNT 寄存器(BG0CNT、BG1CNT、...)和优先级位。现在,如果优先级是平局,那么是的,层数决定谁获胜。

【讨论】:

  • 嗯,您启用了 BG0、BG1 和 BG2,但只设置了其中两个。是吗?
  • 是的。 BG0_ACTIVE 等似乎实际上并没有做任何事情。
  • 这绝对源于他对背景的实验,他可能已将它们全部启用但未全部设置...等一下,这实际上可能是他的问题。哇。
  • 好吧,你们两个说得太对了 :) 我的狂野 BG#_ACTIVE 标志是它吓坏的原因之一。显然,如果您将它们设置为活动,但不初始化它们,可能会出现非常奇怪的工件。另一个原因是 VRAM 的一些重叠使用。
【解决方案2】:

两件事。一方面,条带化很可能是 VRAM 冲突,尽管距离我上次进行 DS 开发已经有一段时间了。仔细检查复制图形和平铺数据的位置。模式 5 使用两个文本背景,如果它们以某种方式初始化,它们的行为应该完全相同,所以我不确定那里发生了什么。

无论如何,既然你有两个背景工作,为什么不在他们的寄存器中设置他们的优先级来交换他们的 z 顺序呢? 默认情况下仅以特定顺序绘制背景,您可以设置它们的优先级,让系统以您喜欢的任何顺序绘制它们。

【讨论】:

  • 哦,可以手动设置优先级吗?知道这一点非常有用。我去检查一下我的 VRAM,看看是不是问题。
  • 我实际上并不完全确定这是否准确,我不记得 DS 的 3D 缓冲区是否具有优先级怪癖,但我认为没有。无论如何,在您为第一个乒乓球游戏打开 3D 引擎的那一刻,您就已经犯了一个大错误。 ^_^
  • 不,我实际上并不想做 3D :)...但也许我不小心打开了它。我对所有这些层及其各自的限制感到很困惑。
  • 这似乎是一个 VRAM 问题,是的,因为改变使用的瓦片基础会产生不同的结果。我没有得到一个看起来正确的。如果我禁用位图图层(如不初始化它),它看起来几乎是正确的,但在某些像素上有一些错误。
  • 我将另一个标记为答案,因为他的分数最少,但你们俩都帮了大忙!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 2019-04-11
相关资源
最近更新 更多