0

编辑:我已将程序简化为基础:https ://github.com/aidan-aidan/temp/blob/master/source/vpp.c

我已经在 gba-dev 论坛上发布了这个问题,但他们似乎已经死了,而且很多天后我都没有得到回复。

这是一个显示问题的视频:http: //youtu.be/8gweFiSobwc(与上面的代码不同,如果你想看,你可以运行 rom)

如您所见,BG 旋转不受影响,尽管它们使用相同的 LUT 并且它们的结构中具有相同的数据类型。

我重做了几次LUT都没有用,这个问题只是在切换到2048圈而不是256圈后才出现。

查看 VBA 中的内存查看器,我可以看到 pb 的行为与 pa 不同。pa 的范围从 0x0100 到 0,正如我所期望的那样(与 1 到 0 相同),但是当枪从中心线向右时,pb 的范围从 0 到 0x0096,但一旦它从中心线向左跳就跳到 0xFFFF . 我唯一能想到的是它会变成负数(这是有道理的,因为该角度的余弦应该导致负数),但我不完全理解补码,所以我不能确定。0“度”在枪的右侧是水平的。512 是九十度。

我已经包含了我能想到的所有内容,感谢您提供任何帮助。

谢谢!

4

1 回答 1

1

据我所知,该程序在技术上运行正常。相反,您的视觉伪影源于硬件使用的仿射变换中有限的 8 位定点精度。

本质上,正弦表中 0 和 1 之间的差异会在矩形精灵中的直角旋转中产生相当大且可见的跳跃,而 0°/90°/180°/270° 角并不那么特别为圆形地球背景。

(余)正弦函数在 0 处的切线很高,因此如果您查看表格,则只有一个点恰好为 0。如果旋转没有精确落在该索引上,则结果看起来明显偏斜.

但是,您可以尝试通过摆弄舍入以产生更多连续的零来作弊。目前,您的表格生成器正在缩放 256 并向最接近的整数舍入:

sine[i] = floor(sin(i * M_PI / 1024.0) * 256.0 + 0.5);

作为替代方案,我们可以通过向零舍入来稍微倾斜表格,这是 C 中的默认值,并增加比例以确保表格在多个条目时仍然达到 256。

int value = sin(i * M_PI / 1024.0) * 257.0;
if(value < -256) value = -256;
if(value > +256) value = +256;
sine[i] = value;

然后可以通过进一步增加缩放因子来进一步展平表格。


问题还在于,对于接近直角的小精灵,旋转无处可去。

想象一个 64x1 的直线精灵以几乎笔直的角度垂直指向,只有正弦表的最小 1/256 小数步长。请记住,旋转始终居中,因此您可以在中心精确地获得一个锯齿状水平步骤。

对于从中心向外的 32 个像素中的每一个,然后将另一个 1/256 分数添加到纹理坐标中。然而,所有这些加起来总共只占像素的 1/8,因此不再采取水平步骤。事实上,对于这个精灵形状,在旋转角度达到完整的 8/256 分数之前,您将看不到任何可见的变化。

另一方面,您的大型地球物体足够大,可以始终显示多个可见的整数“步骤”。这意味着增加的旋转角度将始终至少移动非居中台阶的位置,即使它不足以沿整个边加起来另一个完整像素。由于连续动画,结果是更平滑的整体效果。

于 2013-12-18T10:25:25.263 回答