C GBA开发-仿射精灵每90度暂停一次,背景不受影响

C GBA开发-仿射精灵每90度暂停一次,背景不受影响,c,sprite,affinetransform,gba,C,Sprite,Affinetransform,Gba,编辑: 我已将该计划简化为基本内容: 我已经在gba开发者论坛上发布了这个问题,但是他们似乎已经死了,我已经很多天没有得到回复了 这里有一个视频显示了这个问题:(与上面的代码不同,如果你想看的话,你可以运行rom) 正如您所看到的,BG旋转不受影响,尽管它们使用相同的LUT,并且彼此的结构中具有相同的数据类型 我重做了几次LUT都没有用,这个问题只有在切换到2048个圆分区而不是256个圆分区后才出现 查看VBA中的内存查看器,我可以看到pb的行为与pa不同。pa的范围从0x0100到0,正如我

编辑: 我已将该计划简化为基本内容:

我已经在gba开发者论坛上发布了这个问题,但是他们似乎已经死了,我已经很多天没有得到回复了

这里有一个视频显示了这个问题:(与上面的代码不同,如果你想看的话,你可以运行rom)

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

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

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

我已经包括了我能想到的一切,任何帮助都将不胜感激


谢谢

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

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

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

然而,您可能会尝试通过摆弄舍入来产生更多连续的零来作弊。此时,table generator正在按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;
int-value=sin(i*M_-PI/1024.0)*257.0;
如果(值<-256)值=-256;
如果(值>+256)值=+256;
正弦[i]=值;
然后,通过进一步增加比例因子,可以进一步展平表格


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

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

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


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

其中有相当多的代码处理通过精灵结构进行的间接寄存器访问,支持多个项目符号、背景、未使用的游戏模式、数学,等等。你能不能把这一切归结为一个小例子,仅仅是精灵旋转问题,尽可能少的其他问题?我已经把它归结了,这个问题仍然存在,我会再试一次,虽然它没有帮助,当我尝试之前,我看到了这一点,认为这是为什么,这是有意义的。当我只使用256个角度测量时,并没有伪影,我想我明白为什么不能用文字来表达。在那个里,我尝试过,但并没有奏效。我仍然得到同样的神器。我不明白为什么像那样切换角度分割会把事情搞砸,我真的不明白为什么BG旋转完全不受影响。我很想弄清这个问题,人们能告诉我为什么他们不能给我一个答案吗?没有足够的信息?我想说这有点帮助,特别是如果你稍微增加变焦,但在如此低的分辨率和精度下,它永远不会完美。这里是一个260x的快速演示:为什么它在256个角度分割时工作得很好?很抱歉,从那时起我没有任何东西可以展示,但我确实记得它是美好而流畅的。